aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
authorGravatar brandjon <brandjon@google.com>2017-04-29 16:03:32 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-04-30 23:14:25 +0200
commitb712f335a945c81a6b77fd48e96103ff09c8967b (patch)
treeb8ac0e5aa200cf19717aa22e51cb9abc457be572 /src/main/java/com/google/devtools/build/lib/skyframe
parente7fe50aa727df9ef0a3d37fa258d017971035515 (diff)
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java18
4 files changed, 43 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
index e6b3a958a3..d3a75d8cfd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.Runtime;
+import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions;
import com.google.devtools.build.lib.syntax.ValidationEnvironment;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -97,6 +98,10 @@ public class ASTFileLookupFunction implements SkyFunction {
if (!fileValue.isFile()) {
return ASTFileLookupValue.forBadFile(fileLabel);
}
+ SkylarkSemanticsOptions skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+ if (skylarkSemantics == null) {
+ return null;
+ }
//
// Both the package and the file exist; load the file and parse it as an AST.
@@ -112,6 +117,7 @@ public class ASTFileLookupFunction implements SkyFunction {
.createSkylarkRuleClassEnvironment(
fileLabel,
mutability,
+ skylarkSemantics,
env.getListener(),
// the two below don't matter for extracting the ValidationEnvironment:
/*astFileContentHashCode=*/ null,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 0b7afce7b6..00da7e78da 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -50,6 +50,7 @@ import com.google.devtools.build.lib.syntax.Environment.Extension;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.ParserInputSource;
import com.google.devtools.build.lib.syntax.SkylarkImport;
+import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions;
import com.google.devtools.build.lib.syntax.Statement;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.Preconditions;
@@ -482,6 +483,11 @@ public class PackageFunction implements SkyFunction {
return null;
}
+ SkylarkSemanticsOptions skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+ if (skylarkSemantics == null) {
+ return null;
+ }
+
SkyKey astLookupKey = ASTFileLookupValue.key(preludeLabel);
ASTFileLookupValue astLookupValue = null;
try {
@@ -508,6 +514,7 @@ public class PackageFunction implements SkyFunction {
buildFilePath,
buildFileValue,
defaultVisibility,
+ skylarkSemantics,
preludeStatements,
packageLookupValue.getRoot(),
env);
@@ -1113,6 +1120,7 @@ public class PackageFunction implements SkyFunction {
Path buildFilePath,
@Nullable FileValue buildFileValue,
RuleVisibility defaultVisibility,
+ SkylarkSemanticsOptions skylarkSemantics,
List<Statement> preludeStatements,
Path packageRoot,
Environment env)
@@ -1206,8 +1214,15 @@ public class PackageFunction implements SkyFunction {
SkyframeHybridGlobber skyframeGlobber = new SkyframeHybridGlobber(packageId, packageRoot,
env, legacyGlobber);
Package.Builder pkgBuilder = packageFactory.createPackageFromPreprocessingAst(
- workspaceName, packageId, buildFilePath, astAfterPreprocessing, importResult.importMap,
- importResult.fileDependencies, defaultVisibility, skyframeGlobber);
+ workspaceName,
+ packageId,
+ buildFilePath,
+ astAfterPreprocessing,
+ importResult.importMap,
+ importResult.fileDependencies,
+ defaultVisibility,
+ skylarkSemantics,
+ skyframeGlobber);
Set<SkyKey> globDepsRequested = ImmutableSet.<SkyKey>builder()
.addAll(globDepsRequestedDuringPreprocessing)
.addAll(skyframeGlobber.getGlobDepsRequested())
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
index 0c01e20c64..3e9d31edf3 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
@@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
@@ -61,10 +62,12 @@ public class SkylarkAspectFactory implements ConfiguredAspectFactory {
ruleContext.ruleError(e.getMessage());
return null;
}
+ AnalysisEnvironment analysisEnv = ruleContext.getAnalysisEnvironment();
Environment env =
Environment.builder(mutability)
.setGlobals(skylarkAspect.getFuncallEnv().getGlobals())
- .setEventHandler(ruleContext.getAnalysisEnvironment().getEventHandler())
+ .setSemantics(analysisEnv.getSkylarkSemantics())
+ .setEventHandler(analysisEnv.getEventHandler())
.build(); // NB: loading phase functions are not available: this is analysis already,
// so we do *not* setLoadingPhase().
Object aspectSkylarkObject;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
index 08c6cf5395..e5952f8be2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
@@ -41,6 +41,7 @@ import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.LoadStatement;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.SkylarkImport;
+import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions;
import com.google.devtools.build.lib.syntax.Statement;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -119,6 +120,11 @@ public class SkylarkImportLookupFunction implements SkyFunction {
throws InconsistentFilesystemException, SkylarkImportFailedException, InterruptedException {
PathFragment filePath = fileLabel.toPathFragment();
+ SkylarkSemanticsOptions skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+ if (skylarkSemantics == null) {
+ return null;
+ }
+
// Load the AST corresponding to this file.
ASTFileLookupValue astLookupValue;
try {
@@ -210,7 +216,13 @@ public class SkylarkImportLookupFunction implements SkyFunction {
// Skylark UserDefinedFunction-s in that file will share this function definition Environment,
// which will be frozen by the time it is returned by createExtension.
- Extension extension = createExtension(ast, fileLabel, extensionsForImports, env, inWorkspace);
+ Extension extension = createExtension(
+ ast,
+ fileLabel,
+ extensionsForImports,
+ skylarkSemantics,
+ env,
+ inWorkspace);
SkylarkImportLookupValue result =
new SkylarkImportLookupValue(
extension, new SkylarkFileDependency(fileLabel, fileDependencies.build()));
@@ -355,6 +367,7 @@ public class SkylarkImportLookupFunction implements SkyFunction {
BuildFileAST ast,
Label extensionLabel,
Map<String, Extension> importMap,
+ SkylarkSemanticsOptions skylarkSemantics,
Environment env,
boolean inWorkspace)
throws SkylarkImportFailedException, InterruptedException {
@@ -368,7 +381,8 @@ public class SkylarkImportLookupFunction implements SkyFunction {
com.google.devtools.build.lib.syntax.Environment extensionEnv =
ruleClassProvider
.createSkylarkRuleClassEnvironment(
- extensionLabel, mutability, eventHandler, ast.getContentHashCode(), importMap)
+ extensionLabel, mutability, skylarkSemantics,
+ eventHandler, ast.getContentHashCode(), importMap)
.setupOverride("native", packageFactory.getNativeModule(inWorkspace));
execAndExport(ast, extensionLabel, eventHandler, extensionEnv);