Skylark: Make ctx.var a dictionary.
ctx.var(x) is kept for compatibility and should be removed after next
release.
--
MOS_MIGRATED_REVID=88438195
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
index 8c98f5f..c0034dc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
@@ -14,10 +14,12 @@
package com.google.devtools.build.lib.analysis;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.MakeVariableExpander.ExpansionException;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.packages.Package;
+import java.util.LinkedHashMap;
import java.util.Map;
/**
@@ -53,4 +55,14 @@
return value;
}
+
+ public ImmutableMap<String, String> collectMakeVariables() {
+ Map<String, String> map = new LinkedHashMap<>();
+ // Collect variables in the reverse order as in lookupMakeVariable
+ // because each update is overwriting.
+ map.putAll(pkg.getAllMakeVariables(platform));
+ map.putAll(globalEnv);
+ map.putAll(commandLineEnv);
+ return ImmutableMap.copyOf(map);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 900f901..5d2bafd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -452,6 +452,17 @@
}
/**
+ * Returns all make variables for a given platform.
+ */
+ public Map<String, String> getAllMakeVariables(String platform) {
+ ImmutableMap.Builder<String, String> map = ImmutableMap.builder();
+ for (String var : makeEnv.getBindings().keySet()) {
+ map.put(var, makeEnv.lookup(var, platform));
+ }
+ return map.build();
+ }
+
+ /**
* Returns the label of this package's BUILD file.
*
* Typically <code>getBuildFileLabel().getName().equals("BUILD")</code> --
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
index 2d5bc07..d8a7fc8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
@@ -115,6 +115,8 @@
private final ImmutableMap<Artifact, FilesToRunProvider> executableRunfilesMap;
+ private final Map<String, String> makeVariables;
+
/**
* In native code, private values start with $.
* In Skylark, private values start with _, because of the grammar.
@@ -245,6 +247,8 @@
targetsObject = new SkylarkClassObject(targetsBuilder.build(),
"No such targets. Make sure there is a '%s' label or label_list type attribute");
executableRunfilesMap = executableRunfilesbuilder.build();
+
+ makeVariables = ruleContext.getConfigurationMakeVariableContext().collectMakeVariables();
}
private void addOutput(HashMap<String, Object> outputsBuilder, String key, Object value)
@@ -386,6 +390,12 @@
return outputsObject;
}
+ @SkylarkCallable(structField = true,
+ doc = "Dictionary (String to String) of configuration variables")
+ public Map<String, String> var() {
+ return makeVariables;
+ }
+
@Override
public String toString() {
return ruleContext.getLabel().toString();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
index ce21c42..7e11bda 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
@@ -340,9 +340,12 @@
}
};
-
+ // Deprecated function.
+ // Use the new ctx.var field, which is a dictionary.
+ // TODO(bazel-team): Remove function when user code has been updated.
@SkylarkBuiltin(name = "var",
doc = "get the value bound to a configuration variable in the context",
+ hidden = true,
objectType = SkylarkRuleContext.class,
mandatoryParams = {
@Param(name = "name", type = String.class, doc = "the name of the variable")