diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
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)) |