C++: More ctx removal from CppLinkActionBuilder
RELNOTES:
PiperOrigin-RevId: 241394422
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index 23d1589..a23e5fa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -140,11 +140,10 @@
/**
* Returns the Artifacts that contain the workspace status for the current build request.
*
- * @param ruleContext the rule to use for error reporting.
+ * @param stamp whether stamping is enabled
* @param config the current build configuration.
*/
- ImmutableList<Artifact> getBuildInfo(
- RuleContext ruleContext, BuildInfoKey key, BuildConfiguration config)
+ ImmutableList<Artifact> getBuildInfo(boolean stamp, BuildInfoKey key, BuildConfiguration config)
throws InterruptedException;
/**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index d7be463..a495377 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -340,9 +340,7 @@
@Override
public ImmutableList<Artifact> getBuildInfo(
- RuleContext ruleContext, BuildInfoKey key, BuildConfiguration config)
- throws InterruptedException {
- boolean stamp = AnalysisUtils.isStampingEnabled(ruleContext, config);
+ boolean stamp, BuildInfoKey key, BuildConfiguration config) throws InterruptedException {
BuildInfoCollectionValue collectionValue =
(BuildInfoCollectionValue) skyframeEnv.getValue(BuildInfoCollectionValue.key(key, config));
if (collectionValue == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 7ec4b3e..37f682a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -34,6 +34,7 @@
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.ActionKeyContext;
import com.google.devtools.build.lib.actions.ActionLookupValue;
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.ActionRegistry;
@@ -415,6 +416,16 @@
}
/**
+ * We have to re-implement this method here because it is declared in the interface {@link
+ * ActionConstructionContext}. This class inherits from {@link TargetContext} which doesn't
+ * implement the {@link ActionConstructionContext} interface.
+ */
+ @Override
+ public ActionKeyContext getActionKeyContext() {
+ return super.getActionKeyContext();
+ }
+
+ /**
* An opaque symbol generator to be used when identifying objects by their action owner/index of
* creation. Only needed if an object needs to know whether it was created by the same action
* owner in the same order as another object. Each symbol must call {@link
@@ -492,7 +503,9 @@
}
public ImmutableList<Artifact> getBuildInfo(BuildInfoKey key) throws InterruptedException {
- return getAnalysisEnvironment().getBuildInfo(this, key, getConfiguration());
+ return getAnalysisEnvironment()
+ .getBuildInfo(
+ AnalysisUtils.isStampingEnabled(this, getConfiguration()), key, getConfiguration());
}
@VisibleForTesting
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java
index f68abcf..92d25f7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.analysis.actions;
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.ActionKeyContext;
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact;
@@ -44,6 +45,9 @@
/** Returns the action owner that should be used for actions. */
ActionOwner getActionOwner();
+ /** Returns the action key context. */
+ ActionKeyContext getActionKeyContext();
+
/** Returns the {@link BuildConfiguration} for which the given rule is analyzed. */
BuildConfiguration getConfiguration();
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 1cd1bb0..6db0ac1 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
@@ -29,6 +29,7 @@
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.actions.ParamFileInfo;
import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
+import com.google.devtools.build.lib.analysis.AnalysisUtils;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.MakeVariableSupplier.MapBackedMakeVariableSupplier;
import com.google.devtools.build.lib.analysis.OutputGroupInfo;
@@ -383,12 +384,20 @@
CcLinkingHelper linkingHelper =
new CcLinkingHelper(
ruleContext,
+ ruleContext.getLabel(),
+ ruleContext,
+ ruleContext,
semantics,
featureConfiguration,
ccToolchain,
fdoContext,
- ruleContext.getConfiguration())
- .fromCommon(common)
+ ruleContext.getConfiguration(),
+ cppConfiguration,
+ ruleContext.getSymbolGenerator())
+ .fromCommon(ruleContext, common)
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestTarget() || ruleContext.isTestOnlyTarget())
.addCcLinkingContexts(
CppHelper.getLinkingContextsFromDeps(
ImmutableList.of(CppHelper.mallocForTarget(ruleContext))))
@@ -682,12 +691,20 @@
CcCompilationOutputs ccCompilationOutputsWithOnlyObjects = ccCompilationOutputsBuilder.build();
CcLinkingHelper ccLinkingHelper =
new CcLinkingHelper(
- ruleContext,
- cppSemantics,
- featureConfiguration,
- ccToolchain,
- fdoContext,
- ruleContext.getConfiguration());
+ ruleContext,
+ ruleContext.getLabel(),
+ ruleContext,
+ ruleContext,
+ cppSemantics,
+ featureConfiguration,
+ ccToolchain,
+ fdoContext,
+ ruleContext.getConfiguration(),
+ cppConfiguration,
+ ruleContext.getSymbolGenerator())
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestTarget() || ruleContext.isTestOnlyTarget());
CcInfo depsCcInfo = CcInfo.builder().setCcLinkingContext(depsCcLinkingContext).build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index b4cf8cb..0308d16 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -174,12 +174,19 @@
CcLinkingHelper linkingHelper =
new CcLinkingHelper(
ruleContext,
+ ruleContext.getLabel(),
+ ruleContext,
+ ruleContext,
semantics,
featureConfiguration,
ccToolchain,
fdoContext,
- ruleContext.getConfiguration())
- .fromCommon(common)
+ ruleContext.getConfiguration(),
+ ruleContext.getFragment(CppConfiguration.class),
+ ruleContext.getSymbolGenerator())
+ .fromCommon(ruleContext, common)
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestOnlyTarget())
.addLinkopts(common.getLinkopts())
.emitInterfaceSharedLibraries(true)
.setAlwayslink(alwaysLink)
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 9c51332..20a847e 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
@@ -28,6 +28,7 @@
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -85,7 +86,6 @@
}
}
- private final RuleContext ruleContext;
private final CppSemantics semantics;
private final BuildConfiguration configuration;
private final CppConfiguration cppConfiguration;
@@ -125,11 +125,19 @@
private final Label label;
private final ActionRegistry actionRegistry;
private final RuleErrorConsumer ruleErrorConsumer;
+ private final SymbolGenerator<?> symbolGenerator;
+
+ private Artifact grepIncludes;
+ private boolean isStampingEnabled;
+ private boolean isTestOrTestOnlyTarget;
/**
* Creates a CcLinkingHelper that outputs artifacts in a given configuration.
*
- * @param ruleContext the RuleContext for the rule being built
+ * @param ruleErrorConsumer the RuleErrorConsumer
+ * @param label the Label of the rule being built
+ * @param actionRegistry the ActionRegistry of the rule being built
+ * @param actionConstructionContext the ActionConstructionContext of the rule being built
* @param semantics CppSemantics for the build
* @param featureConfiguration activated features and action configs for the build
* @param ccToolchain the C++ toolchain provider for the build
@@ -137,28 +145,32 @@
* @param configuration the configuration that gives the directory of output artifacts
*/
public CcLinkingHelper(
- RuleContext ruleContext,
+ RuleErrorConsumer ruleErrorConsumer,
+ Label label,
+ ActionRegistry actionRegistry,
+ ActionConstructionContext actionConstructionContext,
CppSemantics semantics,
FeatureConfiguration featureConfiguration,
CcToolchainProvider ccToolchain,
FdoContext fdoContext,
- BuildConfiguration configuration) {
- this.ruleContext = Preconditions.checkNotNull(ruleContext);
+ BuildConfiguration configuration,
+ CppConfiguration cppConfiguration,
+ SymbolGenerator<?> symbolGenerator) {
this.semantics = Preconditions.checkNotNull(semantics);
this.featureConfiguration = Preconditions.checkNotNull(featureConfiguration);
this.ccToolchain = Preconditions.checkNotNull(ccToolchain);
this.fdoContext = Preconditions.checkNotNull(fdoContext);
this.configuration = Preconditions.checkNotNull(configuration);
- this.cppConfiguration =
- Preconditions.checkNotNull(ruleContext.getFragment(CppConfiguration.class));
- this.ruleErrorConsumer = ruleContext;
- this.label = ruleContext.getLabel();
- this.actionRegistry = ruleContext;
- this.actionConstructionContext = ruleContext;
+ this.cppConfiguration = cppConfiguration;
+ this.ruleErrorConsumer = ruleErrorConsumer;
+ this.label = label;
+ this.actionRegistry = actionRegistry;
+ this.actionConstructionContext = actionConstructionContext;
+ this.symbolGenerator = symbolGenerator;
}
/** Sets fields that overlap for cc_library and cc_binary rules. */
- public CcLinkingHelper fromCommon(CcCommon common) {
+ public CcLinkingHelper fromCommon(RuleContext ruleContext, CcCommon common) {
addCcLinkingContexts(
CppHelper.getLinkingContextsFromDeps(
ImmutableList.copyOf(ruleContext.getPrerequisites("deps", Mode.TARGET))));
@@ -353,7 +365,7 @@
new Linkstamp(
linkstamp,
ccCompilationContext.getDeclaredIncludeSrcs(),
- ruleContext.getActionKeyContext()));
+ actionConstructionContext.getActionKeyContext()));
}
CcLinkingContext ccLinkingContext = CcLinkingContext.EMPTY;
if (!neverlink) {
@@ -366,8 +378,7 @@
? NestedSetBuilder.emptySet(Order.LINK_ORDER)
: NestedSetBuilder.create(
Order.LINK_ORDER,
- CcLinkingContext.LinkOptions.of(
- linkopts, ruleContext.getSymbolGenerator())))
+ CcLinkingContext.LinkOptions.of(linkopts, symbolGenerator)))
.addLibraries(
NestedSetBuilder.<LibraryToLink>linkOrder().addAll(libraryToLinks).build())
.addNonCodeInputs(
@@ -458,6 +469,26 @@
return this;
}
+ /** Used to set the runfiles path for test rules' dynamic libraries. */
+ public CcLinkingHelper setTestOrTestOnlyTarget(boolean isTestOrTestOnlyTarget) {
+ this.isTestOrTestOnlyTarget = isTestOrTestOnlyTarget;
+ return this;
+ }
+
+ /**
+ * Used to test the grep-includes tool. This is needing during linking because of linkstamping.
+ */
+ public CcLinkingHelper setGrepIncludes(Artifact grepIncludes) {
+ this.grepIncludes = grepIncludes;
+ return this;
+ }
+
+ /** Whether linkstamping is enabled. */
+ public CcLinkingHelper setIsStampingEnabled(boolean isStampingEnabled) {
+ this.isStampingEnabled = isStampingEnabled;
+ return this;
+ }
+
public CcLinkingHelper setLinkingMode(LinkingMode linkingMode) {
this.linkingMode = linkingMode;
return this;
@@ -768,13 +799,18 @@
private CppLinkActionBuilder newLinkActionBuilder(Artifact outputArtifact) {
return new CppLinkActionBuilder(
- ruleContext,
+ ruleErrorConsumer,
+ actionConstructionContext,
+ label,
outputArtifact,
configuration,
ccToolchain,
fdoContext,
featureConfiguration,
semantics)
+ .setGrepIncludes(grepIncludes)
+ .setIsStampingEnabled(isStampingEnabled)
+ .setTestOrTestOnlyTarget(isTestOrTestOnlyTarget)
.setLinkerFiles(ccToolchain.getLinkerFiles())
.setLinkArtifactFactory(linkArtifactFactory)
.setUseTestOnlyFlags(useTestOnlyFlags);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index f0563c8..f25ee30 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -18,7 +18,6 @@
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.LicensesProvider;
-import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
@@ -322,11 +321,11 @@
*
* @throws RuleErrorException when the tool is not specified by the toolchain.
*/
- public PathFragment getToolPathFragment(CppConfiguration.Tool tool, RuleContext ruleContext)
- throws RuleErrorException {
+ public PathFragment getToolPathFragment(
+ CppConfiguration.Tool tool, RuleErrorConsumer ruleErrorConsumer) throws RuleErrorException {
PathFragment toolPathFragment = getToolPathFragmentOrNull(tool);
if (toolPathFragment == null) {
- throw ruleContext.throwWithRuleError(
+ throw ruleErrorConsumer.throwWithRuleError(
String.format(
"cc_toolchain '%s' with identifier '%s' doesn't define a tool path for '%s'",
getCcToolchainLabel(), getToolchainIdentifier(), tool.getNamePart()));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index 23b04ff..f8022ab 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -25,7 +25,6 @@
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -83,36 +82,13 @@
private ImmutableList<PathFragment> builtinIncludeDirectories;
// New fields need to be added to the copy constructor.
- /**
- * Creates a builder from a rule. This also uses the configuration and artifact factory from the
- * rule.
- */
- public CppCompileActionBuilder(RuleContext ruleContext, CcToolchainProvider ccToolchain) {
- this(
- ruleContext,
- ruleContext.attributes().has("$grep_includes")
- ? ruleContext.getPrerequisiteArtifact("$grep_includes", Mode.HOST)
- : null,
- ccToolchain,
- ruleContext.getConfiguration());
- }
-
/** Creates a builder from a rule and configuration. */
public CppCompileActionBuilder(
ActionConstructionContext actionConstructionContext,
- Artifact grepIncludes,
+ @Nullable Artifact grepIncludes,
CcToolchainProvider ccToolchain,
BuildConfiguration configuration) {
- this(actionConstructionContext.getActionOwner(), configuration, ccToolchain, grepIncludes);
- }
-
- /** Creates a builder from a rule and configuration. */
- private CppCompileActionBuilder(
- ActionOwner actionOwner,
- BuildConfiguration configuration,
- CcToolchainProvider ccToolchain,
- @Nullable Artifact grepIncludes) {
- this.owner = actionOwner;
+ this.owner = actionConstructionContext.getActionOwner();
this.shareable = false;
this.configuration = configuration;
this.cppConfiguration = configuration.getFragment(CppConfiguration.class);
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 aae893b..830029a 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
@@ -26,7 +26,6 @@
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ParameterFile;
-import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -90,9 +89,6 @@
public static final String SHARED_NONLTO_BACKEND_ROOT_PREFIX = "shared.nonlto";
- // Builder-only
- // Null when invoked from tests (e.g. via createTestBuilder).
- @Nullable private final RuleContext ruleContext;
private final Artifact output;
private final CppSemantics cppSemantics;
@Nullable private String mnemonic;
@@ -148,36 +144,18 @@
private final RuleErrorConsumer ruleErrorConsumer;
private final RepositoryName repositoryName;
- /**
- * Creates a builder that builds {@link CppLinkAction} instances.
- *
- * @param ruleContext the rule that owns the action
- * @param output the output artifact
- * @param toolchain the C++ toolchain provider
- * @param fdoContext the C++ FDO optimization support
- * @param cppSemantics to be used for linkstamp compiles
- */
- public CppLinkActionBuilder(
- RuleContext ruleContext,
- Artifact output,
- CcToolchainProvider toolchain,
- FdoContext fdoContext,
- FeatureConfiguration featureConfiguration,
- CppSemantics cppSemantics) {
- this(
- ruleContext,
- output,
- ruleContext.getConfiguration(),
- toolchain,
- fdoContext,
- featureConfiguration,
- cppSemantics);
- }
+ private Artifact grepIncludes;
+ // TODO(plf): This is not exactly the same as `useTestOnlyFlags` but perhaps we can remove one
+ // of them.
+ private boolean isTestOrTestOnlyTarget;
+ private boolean isStampingEnabled;
/**
* Creates a builder that builds {@link CppLinkAction}s.
*
- * @param ruleContext the rule that owns the action
+ * @param ruleErrorConsumer the RuleErrorConsumer of the rule being built
+ * @param actionConstructionContext the ActionConstructionContext of the rule being built
+ * @param label the Label of the rule being built
* @param output the output artifact
* @param configuration the configuration used to determine the tool chain and the default link
* options
@@ -186,14 +164,15 @@
* @param cppSemantics to be used for linkstamp compiles
*/
public CppLinkActionBuilder(
- @Nullable RuleContext ruleContext,
+ RuleErrorConsumer ruleErrorConsumer,
+ ActionConstructionContext actionConstructionContext,
+ Label label,
Artifact output,
BuildConfiguration configuration,
CcToolchainProvider toolchain,
FdoContext fdoContext,
FeatureConfiguration featureConfiguration,
CppSemantics cppSemantics) {
- this.ruleContext = ruleContext;
this.output = Preconditions.checkNotNull(output);
this.configuration = Preconditions.checkNotNull(configuration);
this.cppConfiguration = configuration.getFragment(CppConfiguration.class);
@@ -205,9 +184,9 @@
this.featureConfiguration = featureConfiguration;
this.cppSemantics = Preconditions.checkNotNull(cppSemantics);
- actionConstructionContext = ruleContext;
- repositoryName = ruleContext.getLabel().getPackageIdentifier().getRepository();
- ruleErrorConsumer = ruleContext;
+ this.ruleErrorConsumer = ruleErrorConsumer;
+ this.actionConstructionContext = actionConstructionContext;
+ repositoryName = label.getPackageIdentifier().getRepository();
}
/** Returns the action name for purposes of querying the crosstool. */
@@ -353,7 +332,9 @@
LtoBackendArtifacts ltoArtifact =
createSharedNonLto
? new LtoBackendArtifacts(
- ruleContext,
+ ruleErrorConsumer,
+ configuration.getOptions(),
+ cppConfiguration,
ltoOutputRootPrefix,
bitcodeFile,
actionConstructionContext,
@@ -367,7 +348,9 @@
toolchain.shouldCreatePerObjectDebugInfo(featureConfiguration, cppConfiguration),
argv)
: new LtoBackendArtifacts(
- ruleContext,
+ ruleErrorConsumer,
+ configuration.getOptions(),
+ cppConfiguration,
ltoOutputRootPrefix,
bitcodeFile,
allBitcode,
@@ -637,7 +620,7 @@
!linkstamps.isEmpty()
? actionConstructionContext
.getAnalysisEnvironment()
- .getBuildInfo(ruleContext, CppBuildInfo.KEY, configuration)
+ .getBuildInfo(isStampingEnabled, CppBuildInfo.KEY, configuration)
: ImmutableList.of();
boolean needWholeArchive =
@@ -662,8 +645,7 @@
CppRuleClasses.THIN_LTO_LINKSTATIC_TESTS_USE_SHARED_NONLTO_BACKENDS);
boolean includeLinkStaticInLtoIndexing =
canIncludeAnyLinkStaticInLtoIndexing
- && (canIncludeAnyLinkStaticTestTargetInLtoIndexing
- || !(ruleContext.isTestTarget() || ruleContext.isTestOnlyTarget()));
+ && (canIncludeAnyLinkStaticTestTargetInLtoIndexing || !isTestOrTestOnlyTarget);
boolean allowLtoIndexing =
includeLinkStaticInLtoIndexing
|| (linkingMode == Link.LinkingMode.DYNAMIC && !ltoCompilationContext.isEmpty());
@@ -837,8 +819,7 @@
// Add build variables necessary to template link args into the crosstool.
CcToolchainVariables.Builder buildVariablesBuilder =
CcToolchainVariables.builder(
- toolchain.getBuildVariables(
- ruleContext.getConfiguration().getOptions(), cppConfiguration));
+ toolchain.getBuildVariables(configuration.getOptions(), cppConfiguration));
Preconditions.checkState(!isLtoIndexing || allowLtoIndexing);
Preconditions.checkState(allowLtoIndexing || thinltoParamFile == null);
Preconditions.checkState(allowLtoIndexing || thinltoMergedObjectFile == null);
@@ -890,7 +871,7 @@
mustKeepDebug,
toolchain,
cppConfiguration,
- ruleContext.getConfiguration().getOptions(),
+ configuration.getOptions(),
featureConfiguration,
useTestOnlyFlags,
isLtoIndexing,
@@ -1035,7 +1016,10 @@
for (Map.Entry<Linkstamp, Artifact> linkstampEntry : linkstampMap.entrySet()) {
actionConstructionContext.registerAction(
CppLinkstampCompileHelper.createLinkstampCompileAction(
- ruleContext,
+ ruleErrorConsumer,
+ actionConstructionContext,
+ grepIncludes,
+ configuration,
linkstampEntry.getKey().getArtifact(),
linkstampEntry.getValue(),
linkstampEntry.getKey().getDeclaredIncludeSrcs(),
@@ -1089,7 +1073,7 @@
configuration.getActionEnvironment(),
toolchainEnv,
ImmutableMap.copyOf(executionRequirements),
- toolchain.getToolPathFragment(Tool.LD, ruleContext),
+ toolchain.getToolPathFragment(Tool.LD, ruleErrorConsumer),
toolchain.getHostSystemName(),
toolchain.getTargetCpu());
}
@@ -1525,6 +1509,26 @@
return this;
}
+ /** Used to set the runfiles path for tests' dynamic libraries. */
+ public CppLinkActionBuilder setTestOrTestOnlyTarget(boolean isTestOrTestOnlyTarget) {
+ this.isTestOrTestOnlyTarget = isTestOrTestOnlyTarget;
+ return this;
+ }
+
+ /**
+ * Used to test the grep-includes tool. This is needing during linking because of linkstamping.
+ */
+ public CppLinkActionBuilder setGrepIncludes(Artifact grepIncludes) {
+ this.grepIncludes = grepIncludes;
+ return this;
+ }
+
+ /** Whether linkstamping is enabled. */
+ public CppLinkActionBuilder setIsStampingEnabled(boolean isStampingEnabled) {
+ this.isStampingEnabled = isStampingEnabled;
+ return this;
+ }
+
/**
* Sets the name of the directory where the solib symlinks for the dynamic runtime libraries live.
* This is usually automatically set from the cc_toolchain.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java
index e89e359..1b9ec5f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java
@@ -18,12 +18,14 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.regex.Pattern;
+import javax.annotation.Nullable;
/** Handles creation of CppCompileAction used to compile linkstamp sources. */
public class CppLinkstampCompileHelper {
@@ -34,7 +36,10 @@
* @param inputsForInvalidation: see {@link CppCompileAction#inputsForInvalidation}
*/
public static CppCompileAction createLinkstampCompileAction(
- RuleContext ruleContext,
+ RuleErrorConsumer ruleErrorConsumer,
+ ActionConstructionContext actionConstructionContext,
+ @Nullable Artifact grepIncludes,
+ BuildConfiguration configuration,
Artifact sourceFile,
Artifact outputFile,
Iterable<Artifact> compilationInputs,
@@ -52,11 +57,12 @@
String outputReplacement,
CppSemantics semantics) {
CppCompileActionBuilder builder =
- new CppCompileActionBuilder(ruleContext, ccToolchainProvider)
+ new CppCompileActionBuilder(
+ actionConstructionContext, grepIncludes, ccToolchainProvider, configuration)
.addMandatoryInputs(compilationInputs)
.setVariables(
getVariables(
- ruleContext,
+ ruleErrorConsumer,
sourceFile,
outputFile,
labelReplacement,
@@ -64,7 +70,7 @@
additionalLinkstampDefines,
buildInfoHeaderArtifacts,
featureConfiguration,
- ruleContext.getConfiguration().getOptions(),
+ configuration.getOptions(),
cppConfiguration,
ccToolchainProvider,
needsPic,
@@ -80,8 +86,7 @@
.setShareable(true)
.setShouldScanIncludes(false)
.setActionName(CppActionNames.LINKSTAMP_COMPILE);
- semantics.finalizeCompileActionBuilder(
- ruleContext.getConfiguration(), featureConfiguration, builder);
+ semantics.finalizeCompileActionBuilder(configuration, featureConfiguration, builder);
return builder.buildOrThrowIllegalStateException();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
index 0ef7f48..f3b1f9d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
@@ -17,12 +17,13 @@
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
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.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
import com.google.devtools.build.lib.rules.cpp.CppLinkAction.LinkArtifactFactory;
@@ -74,7 +75,9 @@
private Artifact dwoFile;
LtoBackendArtifacts(
- RuleContext ruleContext,
+ RuleErrorConsumer ruleErrorConsumer,
+ BuildOptions buildOptions,
+ CppConfiguration cppConfiguration,
PathFragment ltoOutputRootPrefix,
Artifact bitcodeFile,
Map<PathFragment, Artifact> allBitCodeFiles,
@@ -108,7 +111,9 @@
FileSystemUtils.appendExtension(obj, ".thinlto.bc"));
scheduleLtoBackendAction(
- ruleContext,
+ ruleErrorConsumer,
+ buildOptions,
+ cppConfiguration,
actionConstructionContext,
repositoryName,
featureConfiguration,
@@ -124,7 +129,9 @@
// Interface to create an LTO backend that does not perform any cross-module optimization.
public LtoBackendArtifacts(
- RuleContext ruleContext,
+ RuleErrorConsumer ruleErrorConsumer,
+ BuildOptions buildOptions,
+ CppConfiguration cppConfiguration,
PathFragment ltoOutputRootPrefix,
Artifact bitcodeFile,
ActionConstructionContext actionConstructionContext,
@@ -147,7 +154,9 @@
index = null;
scheduleLtoBackendAction(
- ruleContext,
+ ruleErrorConsumer,
+ buildOptions,
+ cppConfiguration,
actionConstructionContext,
repositoryName,
featureConfiguration,
@@ -185,7 +194,9 @@
}
private void scheduleLtoBackendAction(
- RuleContext ruleContext,
+ RuleErrorConsumer ruleErrorConsumer,
+ BuildOptions buildOptions,
+ CppConfiguration cppConfiguration,
ActionConstructionContext actionConstructionContext,
RepositoryName repositoryName,
FeatureConfiguration featureConfiguration,
@@ -224,14 +235,11 @@
// The command-line doesn't specify the full path to clang++, so we set it in the
// environment.
- PathFragment compiler = ccToolchain.getToolPathFragment(Tool.GCC, ruleContext);
+ PathFragment compiler = ccToolchain.getToolPathFragment(Tool.GCC, ruleErrorConsumer);
builder.setExecutable(compiler);
CcToolchainVariables.Builder buildVariablesBuilder =
- CcToolchainVariables.builder(
- ccToolchain.getBuildVariables(
- ruleContext.getConfiguration().getOptions(),
- ruleContext.getFragment(CppConfiguration.class)));
+ CcToolchainVariables.builder(ccToolchain.getBuildVariables(buildOptions, cppConfiguration));
if (index != null) {
buildVariablesBuilder.addStringVariable("thinlto_index", index.getExecPath().toString());
} else {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
index 5ae822d..6a8f907 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
@@ -338,12 +338,19 @@
CcToolchainProvider toolchain = ccToolchain(ruleContext);
CcLinkingHelper helper =
new CcLinkingHelper(
- ruleContext,
- cppSemantics,
- featureConfiguration,
- toolchain,
- toolchain.getFdoContext(),
- ruleContext.getConfiguration());
+ ruleContext,
+ ruleContext.getLabel(),
+ ruleContext,
+ ruleContext,
+ cppSemantics,
+ featureConfiguration,
+ toolchain,
+ toolchain.getFdoContext(),
+ ruleContext.getConfiguration(),
+ ruleContext.getFragment(CppConfiguration.class),
+ ruleContext.getSymbolGenerator())
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestOnlyTarget());
helper.addCcLinkingContexts(CppHelper.getLinkingContextsFromDeps(deps));
// TODO(dougk): Configure output artifact with action_config
// once proto compile action is configurable from the crosstool.
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 5ff4e87..3949670 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
@@ -23,6 +23,7 @@
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ArtifactRoot;
+import com.google.devtools.build.lib.analysis.AnalysisUtils;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
@@ -194,10 +195,15 @@
CppHelper.checkLinkstampsUnique(ruleContext, ccLinkingContext.getLinkstamps());
ImmutableSet<Linkstamp> linkstamps = ImmutableSet.copyOf(ccLinkingContext.getLinkstamps());
- List<Artifact> buildInfoArtifacts = linkstamps.isEmpty()
- ? ImmutableList.<Artifact>of()
- : ruleContext.getAnalysisEnvironment().getBuildInfo(
- ruleContext, CppBuildInfo.KEY, configuration);
+ List<Artifact> buildInfoArtifacts =
+ linkstamps.isEmpty()
+ ? ImmutableList.<Artifact>of()
+ : ruleContext
+ .getAnalysisEnvironment()
+ .getBuildInfo(
+ AnalysisUtils.isStampingEnabled(ruleContext, configuration),
+ CppBuildInfo.KEY,
+ configuration);
boolean shareNativeDeps = configuration.getFragment(CppConfiguration.class).shareNativeDeps();
Artifact sharedLibrary;
@@ -231,7 +237,20 @@
toolchain);
new CcLinkingHelper(
- ruleContext, cppSemantics, featureConfiguration, toolchain, fdoContext, configuration)
+ ruleContext,
+ ruleContext.getLabel(),
+ ruleContext,
+ ruleContext,
+ cppSemantics,
+ featureConfiguration,
+ toolchain,
+ fdoContext,
+ configuration,
+ ruleContext.getFragment(CppConfiguration.class),
+ ruleContext.getSymbolGenerator())
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestTarget() || ruleContext.isTestOnlyTarget())
.setLinkerOutputArtifact(sharedLibrary)
.setLinkingMode(LinkingMode.STATIC)
.addLinkopts(extraLinkOpts)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 22fdfa7..1f29c82 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -426,11 +426,19 @@
CcLinkingHelper resultLink =
new CcLinkingHelper(
ruleContext,
+ ruleContext.getLabel(),
+ ruleContext,
+ ruleContext,
semantics,
featureConfiguration,
ccToolchain,
fdoContext,
- buildConfiguration)
+ buildConfiguration,
+ ruleContext.getFragment(CppConfiguration.class),
+ ruleContext.getSymbolGenerator())
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestTarget() || ruleContext.isTestOnlyTarget())
.addCcLinkingContexts(
CppHelper.getLinkingContextsFromDeps(
ImmutableList.copyOf(ruleContext.getPrerequisites("deps", Mode.TARGET))))
@@ -1177,12 +1185,18 @@
CppLinkActionBuilder executableLinkAction =
new CppLinkActionBuilder(
ruleContext,
+ ruleContext,
+ ruleContext.getLabel(),
binaryToLink,
+ ruleContext.getConfiguration(),
toolchain,
fdoContext,
getFeatureConfiguration(ruleContext, toolchain, buildConfiguration, objcProvider),
createObjcCppSemantics(
objcProvider, /* privateHdrs= */ ImmutableList.of(), /* pchHdr= */ null))
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestOnlyTarget() || ruleContext.isTestTarget())
.setMnemonic("ObjcLink")
.addActionInputs(bazelBuiltLibraries)
.addActionInputs(objcProvider.getCcLibraries())
@@ -1348,12 +1362,18 @@
CppLinkAction fullyLinkAction =
new CppLinkActionBuilder(
ruleContext,
+ ruleContext,
+ ruleContext.getLabel(),
outputArchive,
+ ruleContext.getConfiguration(),
ccToolchain,
fdoContext,
getFeatureConfiguration(ruleContext, ccToolchain, buildConfiguration, objcProvider),
createObjcCppSemantics(
objcProvider, /* privateHdrs= */ ImmutableList.of(), /* pchHdr= */ null))
+ .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
+ .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
+ .setTestOrTestOnlyTarget(ruleContext.isTestOnlyTarget() || ruleContext.isTestTarget())
.addActionInputs(objcProvider.getObjcLibraries())
.addActionInputs(objcProvider.getCcLibraries())
.addActionInputs(objcProvider.get(IMPORTED_LIBRARY).toSet())
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index de4f6de..71d9c08 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -36,7 +36,6 @@
import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
import com.google.devtools.build.lib.analysis.OutputGroupInfo;
-import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Key;
@@ -176,9 +175,8 @@
@Override
public ImmutableList<Artifact> getBuildInfo(
- RuleContext ruleContext, BuildInfoKey key, BuildConfiguration config)
- throws InterruptedException {
- return original.getBuildInfo(ruleContext, key, config);
+ boolean stamp, BuildInfoKey key, BuildConfiguration config) throws InterruptedException {
+ return original.getBuildInfo(stamp, key, config);
}
@Override
@@ -372,8 +370,8 @@
}
@Override
- public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key,
- BuildConfiguration config) {
+ public ImmutableList<Artifact> getBuildInfo(
+ boolean stamp, BuildInfoKey key, BuildConfiguration config) {
return ImmutableList.of();
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index e793d0d..8023531 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -1999,8 +1999,8 @@
}
@Override
- public ImmutableList<Artifact> getBuildInfo(RuleContext ruleContext, BuildInfoKey key,
- BuildConfiguration config) {
+ public ImmutableList<Artifact> getBuildInfo(
+ boolean stamp, BuildInfoKey key, BuildConfiguration config) {
throw new UnsupportedOperationException();
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index 2b27b30..21276d1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -506,13 +506,16 @@
CppLinkActionBuilder builder =
new CppLinkActionBuilder(
ruleContext,
+ ruleContext,
+ ruleContext.getLabel(),
attributesToFlip.contains(NonStaticAttributes.OUTPUT_FILE)
? dynamicOutputFile
: staticOutputFile,
+ ruleContext.getConfiguration(),
toolchain,
toolchain.getFdoContext(),
featureConfiguration,
- MockCppSemantics.INSTANCE) {};
+ MockCppSemantics.INSTANCE);
if (attributesToFlip.contains(NonStaticAttributes.OUTPUT_FILE)) {
builder.setLinkType(LinkTargetType.NODEPS_DYNAMIC_LIBRARY);
builder.setLibraryIdentifier("foo");
@@ -564,13 +567,16 @@
CppLinkActionBuilder builder =
new CppLinkActionBuilder(
ruleContext,
+ ruleContext,
+ ruleContext.getLabel(),
attributes.contains(StaticKeyAttributes.OUTPUT_FILE)
? staticOutputFile
: dynamicOutputFile,
+ ruleContext.getConfiguration(),
toolchain,
toolchain.getFdoContext(),
featureConfiguration,
- MockCppSemantics.INSTANCE) {};
+ MockCppSemantics.INSTANCE);
builder.setLinkType(
attributes.contains(StaticKeyAttributes.OUTPUT_FILE)
? LinkTargetType.STATIC_LIBRARY
@@ -600,7 +606,10 @@
CppLinkActionBuilder builder =
new CppLinkActionBuilder(
ruleContext,
+ ruleContext,
+ ruleContext.getLabel(),
output,
+ ruleContext.getConfiguration(),
toolchain,
toolchain.getFdoContext(),
FeatureConfiguration.EMPTY,
@@ -685,13 +694,14 @@
String outputPath,
Iterable<Artifact> nonLibraryInputs,
ImmutableList<LibraryToLink> libraryInputs,
- FeatureConfiguration featureConfiguration)
- throws Exception {
+ FeatureConfiguration featureConfiguration) {
CcToolchainProvider toolchain =
CppHelper.getToolchainUsingDefaultCcToolchainAttribute(ruleContext);
CppLinkActionBuilder builder =
new CppLinkActionBuilder(
ruleContext,
+ ruleContext,
+ ruleContext.getLabel(),
new Artifact(
PathFragment.create(outputPath),
getTargetConfiguration()