C++: Get linker inputs for cc_fake_binary from CcLinkParams
If we get them from CcLinkParams we can avoid having an extra parameter in
CcLinkingOutputs.
RELNOTES:none
PiperOrigin-RevId: 215189634
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 2a370a3..8e172ff 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
@@ -56,6 +56,7 @@
import com.google.devtools.build.lib.rules.apple.ApplePlatform;
import com.google.devtools.build.lib.rules.cpp.CcCommon.CcFlagsSupplier;
import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
+import com.google.devtools.build.lib.rules.cpp.CcLinkParams.Linkstamp;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
@@ -127,7 +128,10 @@
private void checkRestrictedUsage(RuleContext ruleContext) {
Rule rule = ruleContext.getRule();
if (rule.getRuleClassObject().isSkylark()
- || (!rule.getRuleClass().equals("java_binary")
+ || (!rule.getRuleClass().equals("cc_binary")
+ && !rule.getRuleClass().equals("cc_test")
+ && !rule.getRuleClass().equals("cc_fake_binary")
+ && !rule.getRuleClass().equals("java_binary")
&& !rule.getRuleClass().equals("java_test")
&& !rule.getRuleClass().equals("py_binary")
&& !rule.getRuleClass().equals("py_test"))) {
@@ -342,11 +346,13 @@
}
CcLinkParams linkParams =
- collectCcLinkParams(
+ CcLinkParams.buildFinalExtraLinkTimeLibraries(
ruleContext,
- linkingMode != Link.LinkingMode.DYNAMIC,
- isLinkShared(ruleContext),
- common.getLinkopts());
+ collectCcLinkParams(
+ ruleContext,
+ linkingMode != Link.LinkingMode.DYNAMIC,
+ isLinkShared(ruleContext),
+ common.getLinkopts()));
Artifact generatedDefFile = null;
Artifact customDefFile = null;
@@ -419,7 +425,11 @@
outputLibrary = dynamicLibrariesForRuntime.get(0);
}
Iterable<Artifact> fakeLinkerInputs =
- fake ? ccLinkingOutputsBinary.getLinkActionInputs() : ImmutableList.<Artifact>of();
+ fake
+ ? getFakeLinkerInputs(
+ ccLinkingOutputsAndCcLinkingInfo.second.first,
+ ccLauncherInfo.getCcCompilationOutputs(ruleContext))
+ : ImmutableList.of();
CcLinkingOutputs.Builder linkingOutputsBuilder = new CcLinkingOutputs.Builder();
if (isLinkShared(ruleContext)) {
linkingOutputsBuilder.addDynamicLibraryForLinking(outputLibrary);
@@ -550,6 +560,35 @@
.build();
}
+ private static Iterable<Artifact> getFakeLinkerInputs(
+ CcLinkingInfo ccLinkingInfo, CcCompilationOutputs ccCompilationOutputs) {
+ Preconditions.checkState(
+ ccLinkingInfo.getStaticModeParamsForExecutable()
+ == ccLinkingInfo.getStaticModeParamsForDynamicLibrary());
+ Preconditions.checkState(
+ ccLinkingInfo.getStaticModeParamsForDynamicLibrary()
+ == ccLinkingInfo.getDynamicModeParamsForExecutable());
+ Preconditions.checkState(
+ ccLinkingInfo.getDynamicModeParamsForExecutable()
+ == ccLinkingInfo.getDynamicModeParamsForDynamicLibrary());
+ CcLinkParams ccLinkParams = ccLinkingInfo.getStaticModeParamsForExecutable();
+ ImmutableList.Builder<Artifact> linkstamps = ImmutableList.builder();
+ for (Linkstamp linkstamp : ccLinkParams.getLinkstamps().toList()) {
+ linkstamps.add(linkstamp.getArtifact()).addAll(linkstamp.getDeclaredIncludeSrcs());
+ }
+ return ImmutableList.<Artifact>builder()
+ .addAll(
+ ccLinkParams.getLibraries().toList().stream()
+ .filter(LinkerInput::isFake)
+ .map(LinkerInput::getArtifact)
+ .collect(ImmutableList.toImmutableList()))
+ .addAll(linkstamps.build())
+ .addAll(ccLinkParams.getNonCodeInputs())
+ .addAll(ccCompilationOutputs.getObjectFiles(/* usePic= */ true))
+ .addAll(ccCompilationOutputs.getObjectFiles(/* usePic= */ false))
+ .build();
+ }
+
public static Pair<CcLinkingOutputs, Pair<CcLinkingInfo, CcCompilationOutputs>>
createTransitiveLinkingActions(
RuleContext ruleContext,
@@ -891,7 +930,6 @@
private static CcLinkParams collectCcLinkParams(RuleContext context,
boolean linkingStatically, boolean linkShared, List<String> linkopts) {
CcLinkParams.Builder builder = CcLinkParams.builder(linkingStatically, linkShared);
-
builder.addCcLibrary(context);
if (!isLinkShared(context)) {
builder.addTransitiveTarget(CppHelper.mallocForTarget(context));
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 4b8d4f9..3074fea 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
@@ -26,6 +26,7 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
@@ -162,6 +163,30 @@
return new Builder(linkingStatically, linkShared);
}
+ /**
+ * {@link CcLinkParams} objects contain {@link ExtraLinkTimeLibraries} used for Go linking. These
+ * are actually callbacks that get called at the end. With this method we build a new CcLinkParams
+ * in which we have called every callback and put the result into the list of libraries. The list
+ * of {@link ExtraLinkTimeLibraries} then gets nullified.
+ */
+ public static CcLinkParams buildFinalExtraLinkTimeLibraries(
+ RuleContext ruleContext, CcLinkParams ccLinkParams)
+ throws InterruptedException, RuleErrorException {
+ ExtraLinkTimeLibraries extraLinkTimeLibraries = ccLinkParams.getExtraLinkTimeLibraries();
+ NestedSetBuilder<LibraryToLink> builtExtraLinkTimeLibrariesBuilder =
+ NestedSetBuilder.linkOrder();
+ if (extraLinkTimeLibraries != null) {
+ for (ExtraLinkTimeLibrary extraLibrary : extraLinkTimeLibraries.getExtraLibraries()) {
+ builtExtraLinkTimeLibrariesBuilder.addTransitive(extraLibrary.buildLibraries(ruleContext));
+ }
+ }
+ CcLinkParams.Builder ccLinkParamsBuilder = CcLinkParams.builder();
+ ccLinkParamsBuilder.addTransitiveArgs(ccLinkParams);
+ ccLinkParamsBuilder.addLibraries(builtExtraLinkTimeLibrariesBuilder.build());
+ ccLinkParamsBuilder.extraLinkTimeLibrariesBuilder = null;
+ return ccLinkParamsBuilder.build();
+ }
+
public static final Builder builder() {
return new Builder();
}
@@ -258,16 +283,6 @@
}
/**
- * Includes link parameters from a collection of dependency targets.
- */
- public Builder addTransitiveTargets(Iterable<? extends TransitiveInfoCollection> targets) {
- for (TransitiveInfoCollection target : targets) {
- addTransitiveTarget(target);
- }
- return this;
- }
-
- /**
* Includes link parameters from a dependency target.
*
* <p>The target should implement {@link CcLinkingInfo}. If it does not, the method does not do
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index c255478..e9c731d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -742,7 +742,6 @@
result.addAllLtoArtifacts(dynamicLinkActionBuilder.getAllLtoBackendArtifacts());
}
CppLinkAction dynamicLinkAction = dynamicLinkActionBuilder.build();
- result.addLinkActionInputs(dynamicLinkAction.getInputs());
env.registerAction(dynamicLinkAction);
LibraryToLink dynamicLibrary = dynamicLinkAction.getOutputLibrary();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
index 5c37a21..c0fb563 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
@@ -57,21 +57,18 @@
private final ImmutableList<LibraryToLink> dynamicLibrariesForRuntime;
private final ImmutableList<LtoBackendArtifacts> allLtoArtifacts;
- private final ImmutableList<Artifact> linkActionInputs;
private CcLinkingOutputs(
ImmutableList<LibraryToLink> staticLibraries,
ImmutableList<LibraryToLink> picStaticLibraries,
ImmutableList<LibraryToLink> dynamicLibrariesForLinking,
ImmutableList<LibraryToLink> dynamicLibrariesForRuntime,
- ImmutableList<LtoBackendArtifacts> allLtoArtifacts,
- ImmutableList<Artifact> linkActionInputs) {
+ ImmutableList<LtoBackendArtifacts> allLtoArtifacts) {
this.staticLibraries = staticLibraries;
this.picStaticLibraries = picStaticLibraries;
this.dynamicLibrariesForLinking = dynamicLibrariesForLinking;
this.dynamicLibrariesForRuntime = dynamicLibrariesForRuntime;
this.allLtoArtifacts = allLtoArtifacts;
- this.linkActionInputs = linkActionInputs;
}
@Override
@@ -109,10 +106,6 @@
return allLtoArtifacts;
}
- public ImmutableList<Artifact> getLinkActionInputs() {
- return linkActionInputs;
- }
-
public boolean isEmpty() {
return staticLibraries.isEmpty()
&& picStaticLibraries.isEmpty()
@@ -269,7 +262,6 @@
// same list return the .pdb file for Windows.
private final ImmutableList.Builder<LtoBackendArtifacts> allLtoArtifacts =
ImmutableList.builder();
- private final ImmutableList.Builder<Artifact> linkActionInputs = ImmutableList.builder();
public CcLinkingOutputs build() {
return new CcLinkingOutputs(
@@ -277,8 +269,7 @@
ImmutableList.copyOf(picStaticLibraries),
ImmutableList.copyOf(dynamicLibrariesForLinking),
ImmutableList.copyOf(dynamicLibrariesForRuntime),
- allLtoArtifacts.build(),
- linkActionInputs.build());
+ allLtoArtifacts.build());
}
public Builder merge(CcLinkingOutputs outputs) {
@@ -287,7 +278,6 @@
dynamicLibrariesForLinking.addAll(outputs.getDynamicLibrariesForLinking());
dynamicLibrariesForRuntime.addAll(outputs.getDynamicLibrariesForRuntime());
allLtoArtifacts.addAll(outputs.getAllLtoArtifacts());
- linkActionInputs.addAll(outputs.getLinkActionInputs());
return this;
}
@@ -335,10 +325,5 @@
this.allLtoArtifacts.addAll(allLtoArtifacts);
return this;
}
-
- public Builder addLinkActionInputs(Iterable<Artifact> linkActionInputs) {
- this.linkActionInputs.addAll(linkActionInputs);
- return this;
- }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index 2d21d7d..a370cf3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -39,7 +39,6 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
import com.google.devtools.build.lib.rules.cpp.CcLinkParams.Linkstamp;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
@@ -1393,19 +1392,12 @@
* #addLibraries}, and {@link #addLinkstamps}.
*/
public CppLinkActionBuilder addLinkParams(
- CcLinkParams linkParams, RuleErrorConsumer errorListener)
- throws InterruptedException, RuleErrorException {
+ CcLinkParams linkParams, RuleErrorConsumer errorListener) {
addLinkopts(linkParams.flattenedLinkopts());
addLibraries(linkParams.getLibraries());
if (linkParams.getNonCodeInputs() != null) {
addNonCodeInputs(linkParams.getNonCodeInputs());
}
- ExtraLinkTimeLibraries extraLinkTimeLibraries = linkParams.getExtraLinkTimeLibraries();
- if (extraLinkTimeLibraries != null) {
- for (ExtraLinkTimeLibrary extraLibrary : extraLinkTimeLibraries.getExtraLibraries()) {
- addLibraries(extraLibrary.buildLibraries(ruleContext));
- }
- }
CppHelper.checkLinkstampsUnique(errorListener, linkParams);
addLinkstamps(linkParams.getLinkstamps());
return this;