aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2017-11-29 14:39:14 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-11-29 14:41:27 -0800
commit59317a350ce54d8f883c359b620d6b9505c2b3b4 (patch)
tree8a418974f6d5065c31709f7674c06cdb3288038b /src/main
parent485c32b71bac0e049f7f5735541c27b67112a92c (diff)
Add C++ Make variables to cc_binary, cc_library, and cc_test automatically when
Make variables are derived from toolchain. This will allow c++ targets to use c++ Make variables once platforms are activated without declaring an explicit dependency on the c++ toolchain. PiperOrigin-RevId: 177365568
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java16
3 files changed, 42 insertions, 3 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 627428cb30..5ad409bd86 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
@@ -25,6 +25,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ExecutionRequirements;
import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.MakeVariableSupplier.MapBackedMakeVariableSupplier;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
@@ -168,10 +169,20 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
public static ConfiguredTarget init(CppSemantics semantics, RuleContext ruleContext, boolean fake)
throws InterruptedException, RuleErrorException {
ruleContext.checkSrcsSamePackage(true);
- ruleContext.initConfigurationMakeVariableContext(new CcFlagsSupplier(ruleContext));
CcCommon common = new CcCommon(ruleContext);
CcToolchainProvider ccToolchain = common.getToolchain();
+
+ if (CppHelper.shouldUseToolchainForMakeVariables(ruleContext)) {
+ ImmutableMap.Builder<String, String> toolchainMakeVariables = ImmutableMap.builder();
+ ccToolchain.addGlobalMakeVariables(toolchainMakeVariables);
+ ruleContext.initConfigurationMakeVariableContext(
+ new MapBackedMakeVariableSupplier(toolchainMakeVariables.build()),
+ new CcFlagsSupplier(ruleContext));
+ } else {
+ ruleContext.initConfigurationMakeVariableContext(new CcFlagsSupplier(ruleContext));
+ }
+
FdoSupportProvider fdoSupport = common.getFdoSupport();
FeatureConfiguration featureConfiguration =
CcCommon.configureFeatures(ruleContext, ccToolchain);
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 71a79df679..4500ab109c 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
@@ -15,10 +15,12 @@
package com.google.devtools.build.lib.rules.cpp;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.FailAction;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.MakeVariableSupplier.MapBackedMakeVariableSupplier;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
@@ -105,10 +107,20 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory {
boolean linkStatic,
boolean addDynamicRuntimeInputArtifactsToRunfiles)
throws RuleErrorException, InterruptedException {
- ruleContext.initConfigurationMakeVariableContext(new CcFlagsSupplier(ruleContext));
-
final CcCommon common = new CcCommon(ruleContext);
+
CcToolchainProvider ccToolchain = common.getToolchain();
+
+ if (CppHelper.shouldUseToolchainForMakeVariables(ruleContext)) {
+ ImmutableMap.Builder<String, String> toolchainMakeVariables = ImmutableMap.builder();
+ ccToolchain.addGlobalMakeVariables(toolchainMakeVariables);
+ ruleContext.initConfigurationMakeVariableContext(
+ new MapBackedMakeVariableSupplier(toolchainMakeVariables.build()),
+ new CcFlagsSupplier(ruleContext));
+ } else {
+ ruleContext.initConfigurationMakeVariableContext(new CcFlagsSupplier(ruleContext));
+ }
+
FdoSupportProvider fdoSupport = common.getFdoSupport();
FeatureConfiguration featureConfiguration =
CcCommon.configureFeatures(ruleContext, ccToolchain);
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 18aafb9227..a6fddacbb4 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
@@ -41,6 +41,8 @@ import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options.MakeVariableSource;
import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
@@ -148,6 +150,20 @@ public class CppHelper {
}
/**
+ * Returns true if this target should obtain c++ make variables from the toolchain instead of from
+ * the configuration.
+ */
+ public static boolean shouldUseToolchainForMakeVariables(RuleContext ruleContext) {
+ Label toolchainType = getToolchainTypeFromRuleClass(ruleContext);
+ return (ruleContext.getConfiguration().getOptions().get(Options.class).makeVariableSource
+ == MakeVariableSource.TOOLCHAIN)
+ && (ruleContext
+ .getFragment(PlatformConfiguration.class)
+ .getEnabledToolchainTypes()
+ .contains(toolchainType));
+ }
+
+ /**
* Expands Make variables in a list of string and tokenizes the result. If the package feature
* no_copts_tokenization is set, tokenize only items consisting of a single make variable.
*