aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java56
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java9
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java20
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java16
5 files changed, 91 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index 846e68b19b..6a48bae198 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -1563,6 +1563,7 @@ public final class CcLibraryHelper {
LinkerInputs.toLibraryArtifacts(ccLinkingOutputs.getExecutionDynamicLibraries()));
}
builder.addLinkOpts(linkopts);
+ builder.addNonCodeInputs(nonCodeLinkerInputs);
}
}
};
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java
index b9243fb1cb..731c1f6c99 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java
@@ -29,6 +29,7 @@ import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.util.Preconditions;
import java.util.Collection;
import java.util.Objects;
+import javax.annotation.Nullable;
/**
* Parameters to be passed to the linker.
@@ -70,22 +71,25 @@ public final class CcLinkParams {
private final NestedSet<LibraryToLink> libraries;
private final NestedSet<Artifact> executionDynamicLibraries;
private final ExtraLinkTimeLibraries extraLinkTimeLibraries;
+ private final NestedSet<Artifact> nonCodeInputs;
private CcLinkParams(
NestedSet<LinkOptions> linkOpts,
NestedSet<Linkstamp> linkstamps,
NestedSet<LibraryToLink> libraries,
NestedSet<Artifact> executionDynamicLibraries,
- ExtraLinkTimeLibraries extraLinkTimeLibraries) {
+ ExtraLinkTimeLibraries extraLinkTimeLibraries,
+ NestedSet<Artifact> nonCodeInputs) {
this.linkOpts = linkOpts;
this.linkstamps = linkstamps;
this.libraries = libraries;
this.executionDynamicLibraries = executionDynamicLibraries;
this.extraLinkTimeLibraries = extraLinkTimeLibraries;
+ this.nonCodeInputs = nonCodeInputs;
}
/**
- * @return the linkopts
+ * Returns the linkopts
*/
public NestedSet<LinkOptions> getLinkopts() {
return linkOpts;
@@ -96,20 +100,22 @@ public final class CcLinkParams {
}
/**
- * @return the linkstamps
+ * Returns the linkstamps
*/
public NestedSet<Linkstamp> getLinkstamps() {
return linkstamps;
}
/**
- * @return the libraries
+ * Returns the libraries
*/
public NestedSet<LibraryToLink> getLibraries() {
return libraries;
}
- /** @return the executionDynamicLibraries */
+ /**
+ * Returns the executionDynamicLibraries.
+ */
public NestedSet<Artifact> getExecutionDynamicLibraries() {
return executionDynamicLibraries;
}
@@ -117,18 +123,23 @@ public final class CcLinkParams {
/**
* The extra link time libraries; will be null if there are no such libraries.
*/
- public ExtraLinkTimeLibraries getExtraLinkTimeLibraries() {
+ public @Nullable ExtraLinkTimeLibraries getExtraLinkTimeLibraries() {
return extraLinkTimeLibraries;
}
+ /**
+ * Returns the non-code inputs, e.g. linker scripts; will be null if none.
+ */
+ public @Nullable NestedSet<Artifact> getNonCodeInputs() {
+ return nonCodeInputs;
+ }
+
public static final Builder builder(boolean linkingStatically, boolean linkShared) {
return new Builder(linkingStatically, linkShared);
}
/**
* Builder for {@link CcLinkParams}.
- *
- *
*/
public static final class Builder {
@@ -164,6 +175,8 @@ public final class CcLinkParams {
*/
private ExtraLinkTimeLibraries.Builder extraLinkTimeLibrariesBuilder = null;
+ private NestedSetBuilder<Artifact> nonCodeInputsBuilder = null;
+
private boolean built = false;
private Builder(boolean linkingStatically, boolean linkShared) {
@@ -172,7 +185,7 @@ public final class CcLinkParams {
}
/**
- * Build a {@link CcLinkParams} object.
+ * Builds a {@link CcLinkParams} object.
*/
public CcLinkParams build() {
Preconditions.checkState(!built);
@@ -186,12 +199,17 @@ public final class CcLinkParams {
if (extraLinkTimeLibrariesBuilder != null) {
extraLinkTimeLibraries = extraLinkTimeLibrariesBuilder.build();
}
+ NestedSet<Artifact> nonCodeInputs = null;
+ if (nonCodeInputsBuilder != null) {
+ nonCodeInputs = nonCodeInputsBuilder.build();
+ }
return new CcLinkParams(
linkOptsBuilder.build(),
linkstampsBuilder.build(),
librariesBuilder.build(),
executionDynamicLibrariesBuilder.build(),
- extraLinkTimeLibraries);
+ extraLinkTimeLibraries,
+ nonCodeInputs);
}
public boolean add(CcLinkParamsStore store) {
@@ -284,6 +302,12 @@ public final class CcLinkParams {
}
extraLinkTimeLibrariesBuilder.addTransitive(args.getExtraLinkTimeLibraries());
}
+ if (args.getNonCodeInputs() != null) {
+ if (nonCodeInputsBuilder == null) {
+ nonCodeInputsBuilder = NestedSetBuilder.linkOrder();
+ }
+ nonCodeInputsBuilder.addTransitive(args.getNonCodeInputs());
+ }
return this;
}
@@ -339,6 +363,17 @@ public final class CcLinkParams {
return this;
}
+ /**
+ * Adds a collection of non-code inputs.
+ */
+ public Builder addNonCodeInputs(Iterable<Artifact> nonCodeInputs) {
+ if (nonCodeInputsBuilder == null) {
+ nonCodeInputsBuilder = NestedSetBuilder.linkOrder();
+ }
+ nonCodeInputsBuilder.addAll(nonCodeInputs);
+ return this;
+ }
+
/** Processes typical dependencies of a C/C++ library. */
public Builder addCcLibrary(RuleContext context) {
addTransitiveTargets(
@@ -404,5 +439,6 @@ public final class CcLinkParams {
NestedSetBuilder.<Linkstamp>emptySet(Order.COMPILE_ORDER),
NestedSetBuilder.<LibraryToLink>emptySet(Order.LINK_ORDER),
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+ null,
null);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
index 2c8cf58886..83f1be8491 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
@@ -232,6 +232,12 @@ public abstract class NativeDepsHelper {
ltoBitcodeFilesMap.putAll(lib.getLtoBitcodeFiles());
}
}
+
+ Iterable<Artifact> nonCodeInputs = linkParams.getNonCodeInputs();
+ if (nonCodeInputs == null) {
+ nonCodeInputs = ImmutableList.of();
+ }
+
builder
.setLinkArtifactFactory(SHAREABLE_LINK_ARTIFACT_FACTORY)
.setCrosstoolInputs(toolchain.getLink())
@@ -242,7 +248,8 @@ public abstract class NativeDepsHelper {
.addLinkopts(linkopts)
.setNativeDeps(true)
.addLinkstamps(linkstamps)
- .addLtoBitcodeFiles(ltoBitcodeFilesMap.build());
+ .addLtoBitcodeFiles(ltoBitcodeFilesMap.build())
+ .addNonCodeInputs(nonCodeInputs);
if (!builder.getLtoBitcodeFiles().isEmpty()
&& featureConfiguration.isEnabled(CppRuleClasses.THIN_LTO)) {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index a271b49446..df142ad7f3 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -506,6 +506,26 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
.isEmpty();
}
+ @Test
+ public void testNativeLibrary_ProvidesLinkerScriptToLinkAction() throws Exception {
+ scratch.file("java/android/app/BUILD",
+ "cc_library(name = 'native',",
+ " srcs = ['native.cc'],",
+ " linkopts = ['-Wl,-version-script', '$(location jni.lds)'],",
+ " deps = ['jni.lds'],)",
+ "android_binary(name = 'app',",
+ " srcs = ['A.java'],",
+ " deps = [':native'],",
+ " manifest = 'AndroidManifest.xml',",
+ " )");
+
+ ConfiguredTarget app = getConfiguredTarget("//java/android/app:app");
+ Artifact copiedLib = getOnlyElement(getNativeLibrariesInApk(app));
+ Artifact linkedLib = getOnlyElement(getGeneratingAction(copiedLib).getInputs());
+ Iterable<Artifact> linkInputs = getGeneratingAction(linkedLib).getInputs();
+ assertThat(ActionsTestUtil.baseArtifactNames(linkInputs)).contains("jni.lds");
+ }
+
/** Regression test for http://b/33173461. */
@Test
public void testIncrementalDexingUsesDexArchives_binaryDependingOnAliasTarget()
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 3bde118ad4..e966cc06c2 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -825,6 +825,22 @@ public class CcCommonTest extends BuildViewTestCase {
}
@Test
+ public void testProvidesLinkerScriptToLinkAction() throws Exception {
+ scratch.file(
+ "a/BUILD",
+ "cc_binary(",
+ " name='bin',",
+ " srcs=['b.cc'],",
+ " linkopts=['-Wl,@$(location a.lds)'],",
+ " deps=['a.lds'])");
+ ConfiguredTarget target = getConfiguredTarget("//a:bin");
+ CppLinkAction action =
+ (CppLinkAction) getGeneratingAction(getOnlyElement(getFilesToBuild(target)));
+ Iterable<Artifact> linkInputs = action.getInputs();
+ assertThat(ActionsTestUtil.baseArtifactNames(linkInputs)).contains("a.lds");
+ }
+
+ @Test
public void testIncludeManglingSmoke() throws Exception {
scratch.file(
"third_party/a/BUILD",