diff options
Diffstat (limited to 'src')
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", |