aboutsummaryrefslogtreecommitdiffhomepage
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
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
-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
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/ToolchainTypeTest.java42
4 files changed, 84 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.
*
diff --git a/src/test/java/com/google/devtools/build/lib/rules/ToolchainTypeTest.java b/src/test/java/com/google/devtools/build/lib/rules/ToolchainTypeTest.java
index 91ad343ce6..86170607d1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/ToolchainTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/ToolchainTypeTest.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.util.ScratchAttributeWriter;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.util.MockPlatformSupport;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
+import com.google.devtools.build.lib.rules.cpp.CppCompileAction;
import com.google.devtools.build.lib.testutil.TestConstants;
import java.util.Map;
import org.junit.Test;
@@ -103,4 +104,45 @@ public class ToolchainTypeTest extends BuildViewTestCase {
assertThat(glibcVersion).isEqualTo(targetLibc);
}
}
+
+ @Test
+ public void testCcTargetsDependOnCcToolchainAutomatically() throws Exception {
+ MockPlatformSupport.addMockPiiiPlatform(
+ mockToolsConfig, analysisMock.ccSupport().getMockCrosstoolLabel());
+ useConfiguration(
+ "--enabled_toolchain_types="
+ + TestConstants.TOOLS_REPOSITORY
+ + "//tools/cpp:toolchain_type",
+ "--experimental_platforms=//mock_platform:mock-piii-platform",
+ "--extra_toolchains=//mock_platform:toolchain_cc-compiler-piii",
+ "--make_variables_source=toolchain");
+
+ // for cc_library, cc_binary, and cc_test, we check that $(TARGET_CPU) is a valid Make variable
+ ConfiguredTarget cclibrary =
+ ScratchAttributeWriter.fromLabelString(this, "cc_library", "//cclib")
+ .setList("srcs", "a.cc")
+ .setList("copts", "foobar$(TARGET_CPU)")
+ .write();
+ CppCompileAction compileAction =
+ (CppCompileAction) getGeneratingAction(getBinArtifact("_objs/cclib/cclib/a.o", cclibrary));
+ assertThat(compileAction.getArgv()).contains("foobarpiii");
+
+ ConfiguredTarget ccbinary =
+ ScratchAttributeWriter.fromLabelString(this, "cc_binary", "//ccbin")
+ .setList("srcs", "a.cc")
+ .setList("copts", "foobar$(TARGET_CPU)")
+ .write();
+ compileAction =
+ (CppCompileAction) getGeneratingAction(getBinArtifact("_objs/ccbin/ccbin/a.o", ccbinary));
+ assertThat(compileAction.getArgv()).contains("foobarpiii");
+
+ ConfiguredTarget cctest =
+ ScratchAttributeWriter.fromLabelString(this, "cc_test", "//cctest")
+ .setList("srcs", "a.cc")
+ .setList("copts", "foobar$(TARGET_CPU)")
+ .write();
+ compileAction =
+ (CppCompileAction) getGeneratingAction(getBinArtifact("_objs/cctest/cctest/a.o", cctest));
+ assertThat(compileAction.getArgv()).contains("foobarpiii");
+ }
}