aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-04-26 21:30:50 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-04-27 11:17:55 +0200
commitce33ab7a49126a513d7d5a6bc16f86154d9a85b6 (patch)
treefac0eff07298229cc7547122e92e80fd3715427e /src/main/java/com/google/devtools/build/lib/rules/cpp
parent46da1fca1b3b0b4cd4eb28c4ec4f3cb1b5a22dd4 (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.java33
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java2
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;
}