aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java48
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java8
4 files changed, 54 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
index 8a32b7b5af..f4ce8d546e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
@@ -14,35 +14,73 @@
package com.google.devtools.build.lib.analysis;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.packages.NativeProvider;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.FunctionSignature;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
+import com.google.devtools.build.lib.syntax.SkylarkType;
+import java.util.Map;
/** Provides access to make variables from the current fragments. */
-@SkylarkModule(name = "TemplateVariables", doc = "Make variables exposed by the current target.")
+@SkylarkModule(
+ name = "TemplateVariableInfo",
+ doc = "<b>WARNING: The constructor of this provider is experimental and may go away at any "
+ + "time."
+ + "<p>Encapsulates template variables, that is, variables that can be referenced by "
+ + "strings like <code>$(VARIABLE)</code> in BUILD files and expanded by "
+ + "<code>ctx.expand_make_variables</code> and implicitly in certain attributes of "
+ + "built-in rules."
+ + "</p>"
+ + "<p><code>TemplateVariableInfo</code> can be created by calling its eponymous "
+ + "constructor with a string-to-string dict as an argument that specifies the variables "
+ + "provided."
+ + "</p>"
+ + "<p>Example: <code>platform_common.TemplateVariableInfo({'FOO': 'bar'})</code>"
+ + "</p>")
@Immutable
@AutoCodec
public final class TemplateVariableInfo extends NativeInfo {
public static final String SKYLARK_NAME = "TemplateVariableInfo";
+ private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
+ FunctionSignature.WithValues.create(
+ FunctionSignature.of(/*numMandatory=*/ 1, "vars"),
+ /*defaultValues=*/ null,
+ /*types=*/ ImmutableList.<SkylarkType>of(SkylarkType.DICT));
+
public static final NativeProvider<TemplateVariableInfo> PROVIDER =
- new NativeProvider<TemplateVariableInfo>(TemplateVariableInfo.class, SKYLARK_NAME) {};
+ new NativeProvider<TemplateVariableInfo>(
+ TemplateVariableInfo.class, SKYLARK_NAME, SIGNATURE) {
+ @Override
+ protected TemplateVariableInfo createInstanceFromSkylark(Object[] args, Location loc)
+ throws EvalException {
+ Map<String, String> vars =
+ SkylarkDict.castSkylarkDictOrNoneToDict(args[0], String.class, String.class, "vars");
+ return new TemplateVariableInfo(ImmutableMap.copyOf(vars), location);
+ }
+ };
+
private final ImmutableMap<String, String> variables;
@AutoCodec.Instantiator
- public TemplateVariableInfo(ImmutableMap<String, String> variables) {
- super(PROVIDER);
+ public TemplateVariableInfo(ImmutableMap<String, String> variables, Location location) {
+ super(PROVIDER, ImmutableMap.of(), location);
this.variables = variables;
}
@SkylarkCallable(
name = "variables",
- doc = "Returns the make variables defined by this target.",
+ doc = "Returns the make variables defined by this target as a dictionary with string keys "
+ + "and string values",
structField = true
)
public ImmutableMap<String, String> getVariables() {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
index ac468c0052..760d0904dd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
@@ -102,7 +102,8 @@ public class ToolchainType implements RuleConfiguredTargetFactory {
// out the lookup rule -> toolchain rule mapping. For now, it only provides Make variables that
// come from BuildConfiguration so no need to ask Skyframe.
return new RuleConfiguredTargetBuilder(ruleContext)
- .addNativeDeclaredProvider(new TemplateVariableInfo(ImmutableMap.copyOf(makeVariables)))
+ .addNativeDeclaredProvider(new TemplateVariableInfo(
+ ImmutableMap.copyOf(makeVariables), ruleContext.getRule().getLocation()))
.addProvider(RunfilesProvider.simple(Runfiles.EMPTY))
.build();
}
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 172aaf2ed1..5475261c1e 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
@@ -51,6 +51,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier;
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.events.Location;
import com.google.devtools.build.lib.packages.License;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.Builder;
@@ -574,7 +575,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
configuration.isHostConfiguration());
TemplateVariableInfo templateVariableInfo =
- createMakeVariableProvider(cppConfiguration, sysroot);
+ createMakeVariableProvider(cppConfiguration, sysroot, ruleContext.getRule().getLocation());
RuleConfiguredTargetBuilder builder =
new RuleConfiguredTargetBuilder(ruleContext)
@@ -820,7 +821,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
}
private TemplateVariableInfo createMakeVariableProvider(
- CppConfiguration cppConfiguration, PathFragment sysroot) {
+ CppConfiguration cppConfiguration, PathFragment sysroot, Location location) {
HashMap<String, String> makeVariables =
new HashMap<>(cppConfiguration.getAdditionalMakeVariables());
@@ -832,7 +833,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
ccFlags = ccFlags.isEmpty() ? sysrootFlag : ccFlags + " " + sysrootFlag;
makeVariables.put(CppConfiguration.CC_FLAGS_MAKE_VARIABLE_NAME, ccFlags);
}
- return new TemplateVariableInfo(ImmutableMap.copyOf(makeVariables));
+ return new TemplateVariableInfo(ImmutableMap.copyOf(makeVariables), location);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
index 54f2c7d614..ca5d3eaa1c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
@@ -76,9 +76,11 @@ public class JavaRuntime implements RuleConfiguredTargetFactory {
JavaRuntimeInfo.create(
filesToBuild, middleman, javaHome, javaBinaryExecPath, javaBinaryRunfilesPath);
- TemplateVariableInfo templateVariableInfo = new TemplateVariableInfo(ImmutableMap.of(
- "JAVA", javaBinaryExecPath.getPathString(),
- "JAVABASE", javaHome.getPathString()));
+ TemplateVariableInfo templateVariableInfo = new TemplateVariableInfo(
+ ImmutableMap.of(
+ "JAVA", javaBinaryExecPath.getPathString(),
+ "JAVABASE", javaHome.getPathString()),
+ ruleContext.getRule().getLocation());
return new RuleConfiguredTargetBuilder(ruleContext)
.addProvider(RunfilesProvider.class, RunfilesProvider.simple(runfiles))