diff options
author | 2017-04-26 21:30:50 +0200 | |
---|---|---|
committer | 2017-04-27 11:17:55 +0200 | |
commit | ce33ab7a49126a513d7d5a6bc16f86154d9a85b6 (patch) | |
tree | fac0eff07298229cc7547122e92e80fd3715427e /src/main/java/com/google/devtools/build/lib/rules/cpp | |
parent | 46da1fca1b3b0b4cd4eb28c4ec4f3cb1b5a22dd4 (diff) |
Give RuleContext the ability to add Make Variables
This CL also makes CcToolchain responsible for adding the sysroot to CC_FLAGS.
PiperOrigin-RevId: 154329746
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java | 33 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java | 2 |
2 files changed, 31 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java index c4d3abc469..cc01e6c7f4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java @@ -39,6 +39,7 @@ 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.License; +import com.google.devtools.build.lib.rules.MakeVariableProvider; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.FdoSupport.FdoException; import com.google.devtools.build.lib.util.Pair; @@ -49,6 +50,7 @@ import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyKey; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -204,7 +206,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory { coverage = crosstool; } - CcToolchainProvider provider = + CcToolchainProvider ccProvider = new CcToolchainProvider( cppConfiguration, crosstool, @@ -231,10 +233,19 @@ public class CcToolchain implements RuleConfiguredTargetFactory { ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST), getEnvironment(ruleContext), cppConfiguration.getBuiltInIncludeDirectories()); + + // TODO(kmensah): Remove sysroot from cppConfiguration and calculate it here. + PathFragment sysroot = cppConfiguration.getSysroot(); + + MakeVariableProvider makeVariableProvider = + createMakeVariableProvider(cppConfiguration, sysroot); + RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext) - .addProvider(provider) - .addNativeDeclaredProvider(provider) + .addProvider(ccProvider) + .addNativeDeclaredProvider(ccProvider) + .addProvider(makeVariableProvider) + .addNativeDeclaredProvider(makeVariableProvider) .addProvider(fdoSupport.getFdoSupport().createFdoSupportProvider(ruleContext)) .setFilesToBuild(new NestedSetBuilder<Artifact>(Order.STABLE_ORDER).build()) .addProvider(RunfilesProvider.simple(Runfiles.EMPTY)); @@ -354,6 +365,22 @@ public class CcToolchain implements RuleConfiguredTargetFactory { : NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER); } + private MakeVariableProvider createMakeVariableProvider( + CppConfiguration cppConfiguration, PathFragment sysroot) { + + HashMap<String, String> makeVariables = + new HashMap<>(cppConfiguration.getAdditionalMakeVariables()); + + // Overwrite the CC_FLAGS variable to include sysroot, if it's available. + if (sysroot != null) { + String sysrootFlag = "--sysroot=" + sysroot; + String ccFlags = makeVariables.get("CC_FLAGS"); + ccFlags = ccFlags.isEmpty() ? sysrootFlag : ccFlags + " " + sysrootFlag; + makeVariables.put("CC_FLAGS", ccFlags); + } + return new MakeVariableProvider(ImmutableMap.copyOf(makeVariables)); + } + /** * Returns a map that should be templated into the crosstool as build variables. Is meant to * be overridden by subclasses of CcToolchain. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index 95efb13dd9..d07ec2aaf8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java @@ -718,6 +718,7 @@ public class CppConfiguration extends BuildConfiguration.Fragment { for (CrosstoolConfig.MakeVariable variable : toolchain.getMakeVariableList()) { makeVariablesBuilder.put(variable.getName(), variable.getValue()); } + // TODO(kmensah): Remove once targets can depend on the cc_toolchain in skylark. if (sysrootFlag != null) { String ccFlags = makeVariablesBuilder.get("CC_FLAGS"); ccFlags = ccFlags.isEmpty() ? sysrootFlag : ccFlags + " " + sysrootFlag; @@ -1655,7 +1656,6 @@ public class CppConfiguration extends BuildConfiguration.Fragment { * <p>The returned map must contain an entry for {@code STACK_FRAME_UNLIMITED}, * though the entry may be an empty string. */ - @VisibleForTesting public ImmutableMap<String, String> getAdditionalMakeVariables() { return additionalMakeVariables; } |