From b712f335a945c81a6b77fd48e96103ff09c8967b Mon Sep 17 00:00:00 2001 From: brandjon Date: Sat, 29 Apr 2017 16:03:32 +0200 Subject: Make Skylark interpreter read Skylark command-line flags This is the second of two CLs for making command line options able to affect the Skylark interpreter. For the main kinds of evaluation contexts -- package loading, .bzl loading, rule analysis, aspect analysis, and computed defaults -- the SkylarkSemanticsOptions object is retrieved from Skyframe and passed along to the Environment builder. For other contexts such as tests, default values of builtin functions, and standalone Skylark, flags are currently not processed. In the future, we may want to split into separate files the options that affect "pure" Skylark vs the options that affect Bazel-flavored Skylark. One possibility is to subclass SkylarkSemanticsOptions into SkylarkBazelSemanticsOptions, and go through an indirection in SkylarkUtils. We could also pass SkylarkSemanticsOptions to the parser, to support --incompatible_* changes that alter Skylark's syntax. I don't think that's needed at the moment. RELNOTES: None PiperOrigin-RevId: 154628391 --- .../build/lib/analysis/AnalysisEnvironment.java | 7 +++++++ .../lib/analysis/CachingAnalysisEnvironment.java | 6 ++++++ .../lib/analysis/ConfiguredRuleClassProvider.java | 23 ++++++++++++++++++---- .../lib/analysis/ConfiguredTargetFactory.java | 1 + .../skylark/SkylarkRepositoryFunction.java | 1 + .../build/lib/packages/PackageFactory.java | 20 +++++++++++++++---- .../build/lib/packages/RuleClassProvider.java | 5 +++-- .../build/lib/packages/WorkspaceFactory.java | 1 + .../rules/SkylarkRuleConfiguredTargetBuilder.java | 3 +++ .../build/lib/skyframe/ASTFileLookupFunction.java | 6 ++++++ .../build/lib/skyframe/PackageFunction.java | 19 ++++++++++++++++-- .../build/lib/skyframe/SkylarkAspectFactory.java | 5 ++++- .../lib/skyframe/SkylarkImportLookupFunction.java | 18 +++++++++++++++-- .../devtools/build/lib/syntax/Environment.java | 22 +++++++++++++++++++++ .../devtools/build/lib/syntax/MethodLibrary.java | 6 ++++++ .../build/lib/syntax/SkylarkCallbackFunction.java | 1 + .../build/lib/syntax/SkylarkSemanticsOptions.java | 10 +++++++++- .../lib/syntax/SkylarkSignatureProcessor.java | 1 + 18 files changed, 139 insertions(+), 16 deletions(-) (limited to 'src/main/java/com') diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java index 70b8e51967..f97f14afe8 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyFunction; import java.util.List; @@ -117,6 +118,12 @@ public interface AnalysisEnvironment extends ActionRegistry { */ SkyFunction.Environment getSkyframeEnv(); + /** + * Returns the options that affect the Skylark interpreter used for evaluating Skylark rule + * implementation functions. + */ + SkylarkSemanticsOptions getSkylarkSemantics() throws InterruptedException; + /** * Returns the Artifact that is used to hold the non-volatile workspace status for the current * build request. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java index ddf5b99fe4..4198e0ca45 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.skyframe.BuildInfoCollectionValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.WorkspaceStatusValue; +import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyFunction; @@ -279,6 +280,11 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { return skyframeEnv; } + @Override + public SkylarkSemanticsOptions getSkylarkSemantics() throws InterruptedException { + return PrecomputedValue.SKYLARK_SEMANTICS.get(skyframeEnv); + } + @Override public Artifact getStableWorkspaceStatusArtifact() throws InterruptedException { return ((WorkspaceStatusValue) skyframeEnv.getValue(WorkspaceStatusValue.SKY_KEY)) diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java index 568e773d81..7c2b34c7c7 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java @@ -54,8 +54,10 @@ import com.google.devtools.build.lib.syntax.Environment; import com.google.devtools.build.lib.syntax.Environment.Extension; import com.google.devtools.build.lib.syntax.Environment.Phase; import com.google.devtools.build.lib.syntax.Mutability; +import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions; import com.google.devtools.build.lib.syntax.SkylarkUtils; import com.google.devtools.build.lib.syntax.Type; +import com.google.devtools.common.options.Options; import com.google.devtools.common.options.OptionsClassProvider; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -717,7 +719,12 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { ImmutableList> modules) { try (Mutability mutability = Mutability.create("ConfiguredRuleClassProvider globals")) { Environment env = createSkylarkRuleClassEnvironment( - mutability, SkylarkModules.getGlobals(modules), null, null, null); + mutability, + SkylarkModules.getGlobals(modules), + Options.getDefaults(SkylarkSemanticsOptions.class), + /*eventHandler=*/ null, + /*astFileContentHashCode=*/ null, + /*importMap=*/ null); for (Map.Entry entry : skylarkAccessibleToplLevels.entrySet()) { env.setup(entry.getKey(), entry.getValue()); } @@ -728,12 +735,14 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { private Environment createSkylarkRuleClassEnvironment( Mutability mutability, Environment.Frame globals, + SkylarkSemanticsOptions skylarkSemantics, EventHandler eventHandler, String astFileContentHashCode, Map importMap) { Environment env = Environment.builder(mutability) .setGlobals(globals) + .setSemantics(skylarkSemantics) .setEventHandler(eventHandler) .setFileContentHashCode(astFileContentHashCode) .setImportedExtensions(importMap) @@ -745,13 +754,19 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { @Override public Environment createSkylarkRuleClassEnvironment( - Label extensionLabel, Mutability mutability, + Label extensionLabel, + Mutability mutability, + SkylarkSemanticsOptions skylarkSemantics, EventHandler eventHandler, String astFileContentHashCode, Map importMap) { return createSkylarkRuleClassEnvironment( - mutability, globals.setLabel(extensionLabel), - eventHandler, astFileContentHashCode, importMap); + mutability, + globals.setLabel(extensionLabel), + skylarkSemantics, + eventHandler, + astFileContentHashCode, + importMap); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java index f5344d1daa..d560923c8d 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java @@ -269,6 +269,7 @@ public final class ConfiguredTargetFactory { return SkylarkRuleConfiguredTargetBuilder.buildRule( ruleContext, rule.getRuleClassObject().getConfiguredTargetFunction(), + env.getSkylarkSemantics(), ruleClassProvider.getRegisteredSkylarkProviders()); } else { RuleClass.ConfiguredTargetFactory factory = diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java index 497a7d7d5f..b1c0992f6b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java @@ -76,6 +76,7 @@ public class SkylarkRepositoryFunction extends RepositoryFunction { return null; } try (Mutability mutability = Mutability.create("skylark repository")) { + // This Skylark environment ignores command line flags. com.google.devtools.build.lib.syntax.Environment buildEnv = com.google.devtools.build.lib.syntax.Environment.builder(mutability) .setGlobals(rule.getRuleClassObject().getRuleDefinitionEnvironment().getGlobals()) diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index e237d9af8e..a6a6614012 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -59,6 +59,7 @@ import com.google.devtools.build.lib.syntax.Runtime; import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.syntax.SkylarkList.MutableList; +import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions; import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor; import com.google.devtools.build.lib.syntax.SkylarkUtils; import com.google.devtools.build.lib.syntax.Statement; @@ -69,6 +70,7 @@ import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.UnixGlob; +import com.google.devtools.common.options.Options; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -294,7 +296,7 @@ public final class PackageFactory { public Token runAsync(List includes, List excludes, boolean excludeDirs) throws BadGlobException { for (String pattern : Iterables.concat(includes, excludes)) { - @SuppressWarnings("unused") + @SuppressWarnings("unused") Future possiblyIgnoredError = globCache.getGlobUnsortedAsync(pattern, excludeDirs); } return new Token(includes, excludes, excludeDirs); @@ -350,14 +352,14 @@ public final class PackageFactory { public final PackageFactory create(RuleClassProvider ruleClassProvider, FileSystem fs) { return create(ruleClassProvider, null, ImmutableList.of(), fs); } - + public final PackageFactory create( RuleClassProvider ruleClassProvider, EnvironmentExtension environmentExtension, FileSystem fs) { return create(ruleClassProvider, null, ImmutableList.of(environmentExtension), fs); } - + public final PackageFactory create( RuleClassProvider ruleClassProvider, Map platformSetRegexps, @@ -371,7 +373,7 @@ public final class PackageFactory { "test", fs); } - + protected abstract PackageFactory create( RuleClassProvider ruleClassProvider, Map platformSetRegexps, @@ -1288,6 +1290,7 @@ public final class PackageFactory { Map imports, ImmutableList