diff options
4 files changed, 17 insertions, 30 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index aa1f902cc0..55d65ef316 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -166,7 +166,6 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { .setHeadersCheckingMode(common.determineHeadersCheckingMode()) .addCopts(common.getCopts()) .setNoCopts(common.getNoCopts()) - .addLinkopts(common.getLinkopts()) .addDefines(common.getDefines()) .addCompilationPrerequisites(common.getSharedLibrariesFromSrcs()) .addCompilationPrerequisites(common.getStaticLibrariesFromSrcs()) @@ -380,37 +379,13 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { } // Then libraries from the closure of deps. - List<String> linkopts = new ArrayList<>(); - Map<Artifact, ImmutableList<Artifact>> linkstamps = new LinkedHashMap<>(); - - NestedSet<LibraryToLink> librariesInDepsClosure = - findLibrariesToLinkInDepsClosure(context, common, cppConfiguration, linkopts, linkstamps); - builder.addLinkopts(linkopts); - builder.addLinkstamps(linkstamps); - - builder.addLibraries(librariesInDepsClosure); - return builder; - } - - /** - * Explore the transitive closure of our deps to collect linking information. - */ - private static NestedSet<LibraryToLink> findLibrariesToLinkInDepsClosure( - RuleContext context, - CcCommon common, - CppConfiguration cppConfiguration, - List<String> linkopts, - Map<Artifact, - ImmutableList<Artifact>> linkstamps) { // This is true for both FULLY STATIC and MOSTLY STATIC linking. boolean linkingStatically = getLinkStaticness(context, common, cppConfiguration) != LinkStaticness.DYNAMIC; - CcLinkParams linkParams = collectCcLinkParams( context, common, linkingStatically, isLinkShared(context)); - linkopts.addAll(linkParams.flattenedLinkopts()); - linkstamps.putAll(CppHelper.resolveLinkstamps(context, linkParams)); - return linkParams.getLibraries(); + builder.addLinkParams(linkParams, context); + return builder; } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 14bfbf0b65..6833e291d7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.Util; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.cpp.CcLinkParams.Linkstamp; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext.Builder; @@ -315,13 +316,13 @@ public class CppHelper { * <p>Emits a warning on the rule if there are identical linkstamp artifacts with different * compilation contexts. */ - public static Map<Artifact, ImmutableList<Artifact>> resolveLinkstamps(RuleContext ruleContext, + public static Map<Artifact, ImmutableList<Artifact>> resolveLinkstamps(RuleErrorConsumer listener, CcLinkParams linkParams) { Map<Artifact, ImmutableList<Artifact>> result = new LinkedHashMap<>(); for (Linkstamp pair : linkParams.getLinkstamps()) { Artifact artifact = pair.getArtifact(); if (result.containsKey(artifact)) { - ruleContext.ruleWarning("rule inherits the '" + artifact.toDetailString() + listener.ruleWarning("rule inherits the '" + artifact.toDetailString() + "' linkstamp file from more than one cc_library rule"); } result.put(artifact, pair.getDeclaredIncludeSrcs()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java index b6e9f24407..d62c6bba15 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java @@ -50,6 +50,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; @@ -952,6 +953,17 @@ public final class CppLinkAction extends AbstractAction { } /** + * Merges the given link params into this builder by calling {@link #addLinkopts}, {@link + * #addLibraries}, and {@link #addLinkstamps}. + */ + public Builder addLinkParams(CcLinkParams linkParams, RuleErrorConsumer errorListener) { + addLinkopts(linkParams.flattenedLinkopts()); + addLibraries(linkParams.getLibraries()); + addLinkstamps(CppHelper.resolveLinkstamps(errorListener, linkParams)); + return this; + } + + /** * Sets whether this link action will be used for a cc_fake_binary; false by * default. */ 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 2318a2a9f9..09a68241bf 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 @@ -130,7 +130,6 @@ public abstract class NativeDepsHelper { private static NativeDepsRunfiles maybeCreateNativeDepsAction(final RuleContext ruleContext, CcLinkParams linkParams, Collection<String> extraLinkOpts, BuildConfiguration configuration, CcToolchainProvider toolchain, PathFragment nativeDepsPath, Root bindirIfShared) { - if (linkParams.getLibraries().isEmpty()) { return NativeDepsRunfiles.EMPTY; } |