Give RuleContext the ability to add make variables.
This CL also makes CcToolchain responsible for adding the sysroot to CC_FLAGS.
PiperOrigin-RevId: 155171725
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 13ed25c..a6c43d4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -77,6 +77,7 @@
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.rules.AliasProvider;
+import com.google.devtools.build.lib.rules.MakeVariableProvider;
import com.google.devtools.build.lib.rules.fileset.FilesetProvider;
import com.google.devtools.build.lib.shell.ShellUtils;
import com.google.devtools.build.lib.syntax.ClassObject;
@@ -1017,6 +1018,30 @@
}
}
+ public ImmutableMap<String, String> getMakeVariables(Iterable<String> attributeNames) {
+ // Using an ImmutableBuilder to complain about duplicate keys. This traversal order of
+ // getPrerequisites isn't well-defined, so this makes sure providers don't seceretly stomp on
+ // each other.
+ ImmutableMap.Builder<String, String> makeVariableBuilder = ImmutableMap.builder();
+ ImmutableSet.Builder<MakeVariableProvider> makeVariableProvidersBuilder =
+ ImmutableSet.builder();
+
+ for (String attributeName : attributeNames) {
+ // TODO(b/37567440): Remove this continue statement.
+ if (!attributes().has(attributeName)) {
+ continue;
+ }
+ makeVariableProvidersBuilder.addAll(
+ getPrerequisites(attributeName, Mode.TARGET, MakeVariableProvider.class));
+ }
+
+ for (MakeVariableProvider makeVariableProvider : makeVariableProvidersBuilder.build()) {
+ makeVariableBuilder.putAll(makeVariableProvider.getMakeVariables());
+ }
+
+ return makeVariableBuilder.build();
+ }
+
/**
* Return a context that maps Make variable names (string) to values (string).
*
@@ -1024,8 +1049,8 @@
**/
public ConfigurationMakeVariableContext getConfigurationMakeVariableContext() {
if (configurationMakeVariableContext == null) {
- configurationMakeVariableContext = new ConfigurationMakeVariableContext(
- getRule().getPackage(), getConfiguration());
+ configurationMakeVariableContext =
+ new ConfigurationMakeVariableContext(this, getRule().getPackage(), getConfiguration());
}
return configurationMakeVariableContext;
}
@@ -1088,8 +1113,8 @@
*/
public String expandSingleMakeVariable(String attrName, String expression) {
try {
- return MakeVariableExpander.expandSingleVariable(expression,
- new ConfigurationMakeVariableContext(getRule().getPackage(), getConfiguration()));
+ return MakeVariableExpander.expandSingleVariable(
+ expression, getConfigurationMakeVariableContext());
} catch (MakeVariableExpander.ExpansionException e) {
attributeError(attrName, e.getMessage());
return expression;