diff options
author | 2015-06-24 15:37:35 +0000 | |
---|---|---|
committer | 2015-06-25 06:47:11 +0000 | |
commit | e509c9617cdd1356d9a7a3741980dd358bf531e9 (patch) | |
tree | 4d87c400de9adb3540c37c3dd91712f2ff25df8d /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java | |
parent | 8d4ffc4b60cc7630f337cab762ac27630d604f98 (diff) |
Make generate_workspace dump transitive dependencies for Maven artifacts
This moves the WORKSPACE-parsing code out of WorkspaceFileFunction.java so
generate_workspace can parse a WORKSPACE into an ExternalPackage without having
to muck with Skyframe.
Addresses issue #89.
--
MOS_MIGRATED_REVID=96777708
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java | 135 |
1 files changed, 9 insertions, 126 deletions
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 cab94da5a7..fa770b073b 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 @@ -14,30 +14,13 @@ package com.google.devtools.build.lib.skyframe; -import static com.google.devtools.build.lib.syntax.Environment.NONE; - import com.google.devtools.build.lib.analysis.BlazeDirectories; -import com.google.devtools.build.lib.cmdline.LabelValidator; -import com.google.devtools.build.lib.events.Event; -import com.google.devtools.build.lib.events.Location; -import com.google.devtools.build.lib.events.StoredEventHandler; -import com.google.devtools.build.lib.packages.ExternalPackage.Binding; import com.google.devtools.build.lib.packages.ExternalPackage.Builder; import com.google.devtools.build.lib.packages.ExternalPackage.Builder.NoSuchBindingException; -import com.google.devtools.build.lib.packages.Package.NameConflictException; import com.google.devtools.build.lib.packages.PackageFactory; -import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClassProvider; -import com.google.devtools.build.lib.packages.RuleFactory; -import com.google.devtools.build.lib.packages.Type.ConversionException; -import com.google.devtools.build.lib.syntax.BaseFunction; -import com.google.devtools.build.lib.syntax.BuildFileAST; -import com.google.devtools.build.lib.syntax.BuiltinFunction; +import com.google.devtools.build.lib.packages.WorkspaceFactory; import com.google.devtools.build.lib.syntax.EvalException; -import com.google.devtools.build.lib.syntax.FuncallExpression; -import com.google.devtools.build.lib.syntax.FunctionSignature; -import com.google.devtools.build.lib.syntax.Label; -import com.google.devtools.build.lib.syntax.Label.SyntaxException; import com.google.devtools.build.lib.syntax.ParserInputSource; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -48,17 +31,13 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; -import java.io.File; import java.io.IOException; -import java.util.Map; /** * A SkyFunction to parse WORKSPACE files. */ public class WorkspaceFileFunction implements SkyFunction { - private static final String BIND = "bind"; - private final PackageFactory packageFactory; private final Path installDir; private final RuleClassProvider ruleClassProvider; @@ -83,21 +62,22 @@ public class WorkspaceFileFunction implements SkyFunction { Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath()); Builder builder = new Builder(repoWorkspace); - parseWorkspaceFile( - ParserInputSource.create( - ruleClassProvider.getDefaultWorkspaceFile(), new PathFragment("DEFAULT.WORKSPACE")), - builder); + WorkspaceFactory parser = new WorkspaceFactory( + builder, packageFactory.getRuleClassProvider(), installDir.getPathString()); + parser.parse(ParserInputSource.create( + ruleClassProvider.getDefaultWorkspaceFile(), new PathFragment("DEFAULT.WORKSPACE"))); if (!workspaceFileValue.exists()) { return new PackageValue(builder.build()); } + try { - ParserInputSource repoWorkspaceSource = ParserInputSource.create(repoWorkspace); - parseWorkspaceFile(repoWorkspaceSource, builder); + parser.parse(ParserInputSource.create(repoWorkspace)); } catch (IOException e) { throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT); } + try { - builder.resolveBindTargets(packageFactory.getRuleClass(BIND)); + builder.resolveBindTargets(packageFactory.getRuleClass("bind")); } catch (NoSuchBindingException e) { throw new WorkspaceFileFunctionException( new EvalException(e.getLocation(), e.getMessage())); @@ -108,108 +88,11 @@ public class WorkspaceFileFunction implements SkyFunction { return new PackageValue(builder.build()); } - private void parseWorkspaceFile(ParserInputSource source, Builder builder) - throws WorkspaceFileFunctionException, InterruptedException { - StoredEventHandler localReporter = new StoredEventHandler(); - BuildFileAST buildFileAST; - buildFileAST = BuildFileAST.parseBuildFile(source, localReporter, null, false); - if (buildFileAST.containsErrors()) { - localReporter.handle(Event.error("WORKSPACE file could not be parsed")); - } else { - if (!evaluateWorkspaceFile(buildFileAST, builder, localReporter)) { - localReporter.handle(Event.error("Error evaluating WORKSPACE file " + source.getPath())); - } - } - - builder.addEvents(localReporter.getEvents()); - if (localReporter.hasErrors()) { - builder.setContainsErrors(); - } - } - @Override public String extractTag(SkyKey skyKey) { return null; } - // TODO(bazel-team): use @SkylarkSignature annotations on a BuiltinFunction.Factory - // for signature + documentation of this and other functions in this file. - private static BuiltinFunction newWorkspaceNameFunction(final Builder builder) { - return new BuiltinFunction("workspace", - FunctionSignature.namedOnly("name"), BuiltinFunction.USE_LOC) { - public Object invoke(String name, - Location loc) throws EvalException { - String errorMessage = LabelValidator.validateTargetName(name); - if (errorMessage != null) { - throw new EvalException(loc, errorMessage); - } - builder.setWorkspaceName(name); - return NONE; - } - }; - } - - private static BuiltinFunction newBindFunction(final Builder builder) { - return new BuiltinFunction(BIND, - FunctionSignature.namedOnly("name", "actual"), BuiltinFunction.USE_LOC) { - public Object invoke(String name, String actual, - Location loc) throws EvalException, ConversionException, InterruptedException { - Label nameLabel = null; - try { - nameLabel = Label.parseAbsolute("//external:" + name); - builder.addBinding(nameLabel, new Binding(Label.parseAbsolute(actual), loc)); - } catch (SyntaxException e) { - throw new EvalException(loc, e.getMessage()); - } - return NONE; - } - }; - } - - /** - * Returns a function-value implementing the build rule "ruleClass" (e.g. cc_library) in the - * specified package context. - */ - private static BuiltinFunction newRuleFunction(final RuleFactory ruleFactory, - final Builder builder, final String ruleClassName) { - return new BuiltinFunction(ruleClassName, - FunctionSignature.KWARGS, BuiltinFunction.USE_AST) { - public Object invoke(Map<String, Object> kwargs, - FuncallExpression ast) throws EvalException { - try { - RuleClass ruleClass = ruleFactory.getRuleClass(ruleClassName); - builder.createAndAddRepositoryRule(ruleClass, kwargs, ast); - } catch (RuleFactory.InvalidRuleException | NameConflictException | SyntaxException e) { - throw new EvalException(ast.getLocation(), e.getMessage()); - } - return NONE; - } - }; - } - - public boolean evaluateWorkspaceFile(BuildFileAST buildFileAST, Builder builder, - StoredEventHandler eventHandler) throws InterruptedException { - // Environment is defined in SkyFunction and the syntax package. - com.google.devtools.build.lib.syntax.Environment workspaceEnv = - new com.google.devtools.build.lib.syntax.Environment(); - - RuleFactory ruleFactory = new RuleFactory(packageFactory.getRuleClassProvider()); - for (String ruleClass : ruleFactory.getRuleClassNames()) { - BaseFunction ruleFunction = newRuleFunction(ruleFactory, builder, ruleClass); - workspaceEnv.update(ruleClass, ruleFunction); - } - - workspaceEnv.update("__embedded_dir__", this.installDir.toString()); - // TODO(kchodorow): Get all the toolchain rules and load this from there. - File jreDirectory = new File(System.getProperty("java.home")); - workspaceEnv.update("DEFAULT_SERVER_JAVABASE", jreDirectory.getParentFile().toString()); - - workspaceEnv.update(BIND, newBindFunction(builder)); - workspaceEnv.update("workspace", newWorkspaceNameFunction(builder)); - - return buildFileAST.exec(workspaceEnv, eventHandler); - } - private static final class WorkspaceFileFunctionException extends SkyFunctionException { public WorkspaceFileFunctionException(IOException e, Transience transience) { super(e, transience); |