diff options
author | 2017-11-29 14:39:14 -0800 | |
---|---|---|
committer | 2017-11-29 14:41:27 -0800 | |
commit | 59317a350ce54d8f883c359b620d6b9505c2b3b4 (patch) | |
tree | 8a418974f6d5065c31709f7674c06cdb3288038b | |
parent | 485c32b71bac0e049f7f5735541c27b67112a92c (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
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"); + } } |