diff options
author | brandjon <brandjon@google.com> | 2017-10-23 19:02:31 +0200 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2017-10-24 10:39:30 +0200 |
commit | dbff8b81bec72dd0f8a2fef825128e5f33c650d0 (patch) | |
tree | 68ba03941dfb5647a567848252b9f98033395b54 /src/main | |
parent | e287d4bf333e412033c8f484018cc431100eeee6 (diff) |
Propagate skylark flags to WORKSPACE and repo rules
RELNOTES: Skylark semantics flags now affect WORKSPACE files and repository rules.
PiperOrigin-RevId: 173130286
Diffstat (limited to 'src/main')
3 files changed, 32 insertions, 12 deletions
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 6f708863fd..027d901611 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 @@ -22,10 +22,12 @@ import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; import com.google.devtools.build.lib.rules.repository.RepositoryFunction; +import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.syntax.BaseFunction; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Mutability; import com.google.devtools.build.lib.syntax.Runtime; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.skyframe.SkyFunction.Environment; @@ -54,11 +56,14 @@ public class SkylarkRepositoryFunction extends RepositoryFunction { if (declareEnvironmentDependencies(markerData, env, getEnviron(rule)) == null) { return null; } + SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env); + if (skylarkSemantics == null) { + 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) - .useDefaultSemantics() + .setSemantics(skylarkSemantics) .setEventHandler(env.getListener()) .build(); SkylarkRepositoryContext skylarkRepositoryContext = diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java index 0a9d68bff5..88ef31b5dc 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java @@ -48,6 +48,7 @@ import com.google.devtools.build.lib.syntax.ParserInputSource; import com.google.devtools.build.lib.syntax.Runtime; import com.google.devtools.build.lib.syntax.Runtime.NoneType; import com.google.devtools.build.lib.syntax.SkylarkList; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor; import com.google.devtools.build.lib.vfs.Path; import java.io.File; @@ -141,15 +142,19 @@ public class WorkspaceFactory { } /** - * Parses the given WORKSPACE file without resolving skylark imports. + * Parses the given WORKSPACE file without resolving Skylark imports, using the default Skylark + * semantics. */ public void parse(ParserInputSource source) throws BuildFileContainsErrorsException, InterruptedException { - parse(source, null); + parse(source, SkylarkSemantics.DEFAULT_SEMANTICS, null); } @VisibleForTesting - public void parse(ParserInputSource source, @Nullable StoredEventHandler localReporter) + public void parse( + ParserInputSource source, + SkylarkSemantics skylarkSemantics, + @Nullable StoredEventHandler localReporter) throws BuildFileContainsErrorsException, InterruptedException { // This method is split in 2 so WorkspaceFileFunction can call the two parts separately and // do the Skylark load imports in between. We can't load skylark imports from @@ -163,7 +168,7 @@ public class WorkspaceFactory { throw new BuildFileContainsErrorsException( Label.EXTERNAL_PACKAGE_IDENTIFIER, "Failed to parse " + source.getPath()); } - execute(buildFileAST, null, localReporter); + execute(buildFileAST, null, skylarkSemantics, localReporter); } @@ -171,15 +176,21 @@ public class WorkspaceFactory { * Actually runs through the AST, calling the functions in the WORKSPACE file and adding rules * to the //external package. */ - public void execute(BuildFileAST ast, Map<String, Extension> importedExtensions) + public void execute( + BuildFileAST ast, + Map<String, Extension> importedExtensions, + SkylarkSemantics skylarkSemantics) throws InterruptedException { Preconditions.checkNotNull(ast); Preconditions.checkNotNull(importedExtensions); - execute(ast, importedExtensions, new StoredEventHandler()); + execute(ast, importedExtensions, skylarkSemantics, new StoredEventHandler()); } - private void execute(BuildFileAST ast, @Nullable Map<String, Extension> importedExtensions, + private void execute( + BuildFileAST ast, + @Nullable Map<String, Extension> importedExtensions, + SkylarkSemantics skylarkSemantics, StoredEventHandler localReporter) throws InterruptedException { if (importedExtensions != null) { @@ -191,8 +202,7 @@ public class WorkspaceFactory { } Environment workspaceEnv = Environment.builder(mutability) - // Note that this Skylark environment ignores command line flags. - .useDefaultSemantics() + .setSemantics(skylarkSemantics) .setGlobals(BazelLibrary.GLOBALS) .setEventHandler(localReporter) .setImportedExtensions(importMap) diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java index 71f2c98ff6..3f0f3f8ec2 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.skyframe.WorkspaceFileValue.WorkspaceFileKe import com.google.devtools.build.lib.syntax.BuildFileAST; import com.google.devtools.build.lib.syntax.Environment.Extension; import com.google.devtools.build.lib.syntax.Mutability; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; @@ -66,6 +67,10 @@ public class WorkspaceFileFunction implements SkyFunction { if (workspaceASTValue == null) { return null; } + SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env); + if (skylarkSemantics == null) { + return null; + } Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath()); Package.Builder builder = packageFactory.newExternalPackageBuilder( @@ -112,7 +117,7 @@ public class WorkspaceFileFunction implements SkyFunction { if (importResult == null) { return null; } - parser.execute(ast, importResult.importMap); + parser.execute(ast, importResult.importMap, skylarkSemantics); } catch (NoSuchPackageException e) { throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT); } catch (NameConflictException e) { |