aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2015-11-27 16:22:59 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-11-30 18:30:08 +0000
commit8ca065c2ae941309b53f95313a68e585ecc70560 (patch)
tree02c56b462dfd0edd66d9a139b58a3ba3c3106043 /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
parent31a9149d4a347d3a3d4b6407b18e256ad061ab3a (diff)
Enable load() statement in the WORKSPACE file.
RELNOTES[NEW]: Skylark macros are now enabled in WORKSPACE file. Design document at https://docs.google.com/document/d/1jKbNXOVp2T1zJD_iRnVr8k5D0xZKgO8blMVDlXOksJg/preview Fixes #337 -- MOS_MIGRATED_REVID=108860301
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.java63
1 files changed, 50 insertions, 13 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 0f73697fa5..345800dfd2 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
@@ -15,11 +15,12 @@
package com.google.devtools.build.lib.skyframe;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
-import com.google.devtools.build.lib.packages.Package.Builder;
+import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.packages.Package.LegacyBuilder;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.WorkspaceFactory;
-import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.skyframe.PackageFunction.PackageFunctionException;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.ParserInputSource;
import com.google.devtools.build.lib.vfs.Path;
@@ -54,6 +55,8 @@ public class WorkspaceFileFunction implements SkyFunction {
@Override
public SkyValue compute(SkyKey skyKey, Environment env) throws WorkspaceFileFunctionException,
InterruptedException {
+ final Environment skyEnvironment = env;
+
RootedPath workspaceRoot = (RootedPath) skyKey.argument();
FileValue workspaceFileValue = (FileValue) env.getValue(FileValue.key(workspaceRoot));
if (workspaceFileValue == null) {
@@ -61,7 +64,7 @@ public class WorkspaceFileFunction implements SkyFunction {
}
Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath());
- Builder builder =
+ LegacyBuilder builder =
com.google.devtools.build.lib.packages.Package.newExternalPackageBuilder(
repoWorkspace, packageFactory.getRuleClassProvider().getRunfilesPrefix());
try (Mutability mutability = Mutability.create("workspace %s", repoWorkspace)) {
@@ -73,15 +76,23 @@ public class WorkspaceFileFunction implements SkyFunction {
mutability,
directories.getEmbeddedBinariesRoot(),
directories.getWorkspace());
- parser.parse(
- ParserInputSource.create(
- ruleClassProvider.getDefaultWorkspaceFile(), new PathFragment("DEFAULT.WORKSPACE")));
- if (!workspaceFileValue.exists()) {
- return new PackageValue(builder.build());
- }
-
try {
- parser.parse(ParserInputSource.create(repoWorkspace, workspaceFileValue.getSize()));
+ PathFragment pathFragment = new PathFragment("/DEFAULT.WORKSPACE");
+ if (!parse(
+ ParserInputSource.create(ruleClassProvider.getDefaultWorkspaceFile(), pathFragment),
+ repoWorkspace, parser, skyEnvironment)) {
+ return null;
+ }
+ if (!workspaceFileValue.exists()) {
+ return new PackageValue(builder.build());
+ }
+
+ if (!parse(
+ ParserInputSource.create(repoWorkspace), repoWorkspace, parser, skyEnvironment)) {
+ return null;
+ }
+ } catch (PackageFunctionException e) {
+ throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
} catch (IOException e) {
throw new WorkspaceFileFunctionException(e, Transience.TRANSIENT);
}
@@ -90,17 +101,43 @@ public class WorkspaceFileFunction implements SkyFunction {
return new PackageValue(builder.build());
}
+ private boolean loadSkylarkImports(Path repoWorkspace, WorkspaceFactory parser,
+ Environment skyEnvironment) throws PackageFunctionException, InterruptedException {
+ // Load skylark imports
+ PackageFunction.SkylarkImportResult importResult;
+ importResult = PackageFunction.fetchImportsFromBuildFile(repoWorkspace,
+ PackageIdentifier.createInDefaultRepo("external"),
+ parser.getBuildFileAST(),
+ skyEnvironment,
+ null);
+ if (importResult == null) {
+ return false;
+ }
+ parser.setImportedExtensions(importResult.importMap);
+ return true;
+ }
+
+ private boolean parse(ParserInputSource source, Path repoWorkspace, WorkspaceFactory parser,
+ Environment skyEnvironment) throws PackageFunctionException, InterruptedException {
+ parser.parseBuildFile(source);
+ if (!loadSkylarkImports(repoWorkspace, parser, skyEnvironment)) {
+ return false;
+ }
+ parser.execute();
+ return true;
+ }
+
@Override
public String extractTag(SkyKey skyKey) {
return null;
}
private static final class WorkspaceFileFunctionException extends SkyFunctionException {
- public WorkspaceFileFunctionException(IOException e, Transience transience) {
+ public WorkspaceFileFunctionException(Exception e, Transience transience) {
super(e, transience);
}
- public WorkspaceFileFunctionException(EvalException e) {
+ public WorkspaceFileFunctionException(Exception e) {
super(e, Transience.PERSISTENT);
}
}