aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
diff options
context:
space:
mode:
authorGravatar Kristina Chodorow <kchodorow@google.com>2015-06-24 15:37:35 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-06-25 06:47:11 +0000
commite509c9617cdd1356d9a7a3741980dd358bf531e9 (patch)
tree4d87c400de9adb3540c37c3dd91712f2ff25df8d /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
parent8d4ffc4b60cc7630f337cab762ac27630d604f98 (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.java135
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);