aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xcompile.sh3
-rw-r--r--src/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Package.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java44
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Rule.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java59
-rw-r--r--src/main/tools/BUILD5
-rw-r--r--src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java1
13 files changed, 104 insertions, 109 deletions
diff --git a/compile.sh b/compile.sh
index fde544c354..2b46d50784 100755
--- a/compile.sh
+++ b/compile.sh
@@ -409,12 +409,13 @@ if [[ $PLATFORM == "linux" ]]; then
fi
cp src/main/tools/build_interface_so output/build_interface_so
+cp src/main/tools/jdk.WORKSPACE output/jdk.WORKSPACE
touch output/client_info
chmod 755 output/client_info
log "Creating Bazel self-extracting archive..."
-TO_ZIP="libblaze.jar ${JNILIB} build-runfiles${EXE_EXT} process-wrapper${EXE_EXT} client_info build_interface_so ${MSYS_DLLS}"
+TO_ZIP="libblaze.jar ${JNILIB} build-runfiles${EXE_EXT} process-wrapper${EXE_EXT} client_info build_interface_so ${MSYS_DLLS} jdk.WORKSPACE"
if [[ $PLATFORM == "linux" ]]; then
TO_ZIP="$TO_ZIP namespace-sandbox${EXE_EXT}"
fi
diff --git a/src/BUILD b/src/BUILD
index 7235123d23..2fcde8dc04 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -54,6 +54,7 @@ genrule(
":libunix",
"//src/main/tools:build-runfiles",
"//src/main/tools:process-wrapper",
+ "//src/main/tools:jdk.WORKSPACE",
":namespace-sandbox",
"client_info",
"//src/main/tools:build_interface_so",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 0af667a102..1bbcd72db7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -159,6 +159,13 @@ public final class RuleContext extends TargetContext
}
/**
+ * Returns the workspace name for the rule.
+ */
+ public String getWorkspaceName() {
+ return rule.getWorkspaceName();
+ }
+
+ /**
* The configuration conditions that trigger this rule's configurable attributes.
*/
Set<ConfigMatchingProvider> getConfigConditions() {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
index ac4920ce2e..6f7b243295 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
@@ -34,7 +34,6 @@ import java.util.Map.Entry;
*/
public class ExternalPackage extends Package {
- private String workspaceName;
private Map<RepositoryName, Rule> repositoryMap;
ExternalPackage() {
@@ -42,13 +41,6 @@ public class ExternalPackage extends Package {
}
/**
- * Returns the name for this repository.
- */
- public String getWorkspaceName() {
- return workspaceName;
- }
-
- /**
* Returns a description of the repository with the given name, or null if there's no such
* repository.
*/
@@ -77,7 +69,7 @@ public class ExternalPackage extends Package {
}
/**
- * Checks if the label is bound, i.e., starts with //external:.
+ * Checks if the label is bound, i.e., starts with {@code //external:}.
*/
public static boolean isBoundLabel(Label label) {
return label.getPackageName().equals("external");
@@ -89,7 +81,6 @@ public class ExternalPackage extends Package {
*/
public static class Builder
extends AbstractBuilder<ExternalPackage, Builder> {
- private String workspaceName;
private Map<Label, Binding> bindMap = Maps.newHashMap();
private Map<RepositoryName, Rule> repositoryMap = Maps.newHashMap();
@@ -106,7 +97,6 @@ public class ExternalPackage extends Package {
@Override
public ExternalPackage build() {
- pkg.workspaceName = workspaceName;
pkg.repositoryMap = ImmutableMap.copyOf(repositoryMap);
return super.build();
}
@@ -114,8 +104,10 @@ public class ExternalPackage extends Package {
/**
* Sets the name for this repository.
*/
- public void setWorkspaceName(String name) {
- workspaceName = name;
+ @Override
+ public Builder setWorkspaceName(String workspaceName) {
+ pkg.workspaceName = workspaceName;
+ return this;
}
public void addBinding(Label label, Binding binding) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index a2216e051b..fd48e5d9d5 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -24,6 +24,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
+import com.google.devtools.build.lib.Constants;
import com.google.devtools.build.lib.collect.CollectionUtils;
import com.google.devtools.build.lib.collect.ImmutableSortedKeyMap;
import com.google.devtools.build.lib.events.Event;
@@ -33,7 +34,6 @@ import com.google.devtools.build.lib.packages.AttributeMap.AcceptsLabelAttribute
import com.google.devtools.build.lib.packages.License.DistributionType;
import com.google.devtools.build.lib.packages.PackageDeserializer.PackageDeserializationException;
import com.google.devtools.build.lib.packages.PackageFactory.Globber;
-
import com.google.devtools.build.lib.syntax.FuncallExpression;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.syntax.Label.SyntaxException;
@@ -103,6 +103,12 @@ public class Package implements Serializable {
private Path packageDirectory;
/**
+ * The name of the workspace this package is in. Used as a prefix for the runfiles directory.
+ * This can be set in the WORKSPACE file. This must be a valid target name.
+ */
+ protected String workspaceName = Constants.RUNFILES_PREFIX;
+
+ /**
* The root of the source tree in which this package was found. It is an invariant that
* {@code sourceRoot.getRelative(name).equals(packageDirectory)}.
*/
@@ -545,6 +551,16 @@ public class Package implements Serializable {
}
/**
+ * Returns this package's workspace name.
+ *
+ * <p>Package-private to encourage callers to get their workspace name from a rule, not a
+ * package.</p>
+ */
+ String getWorkspaceName() {
+ return workspaceName;
+ }
+
+ /**
* Returns the features specified in the <code>package()</code> declaration.
*/
public ImmutableSet<String> getFeatures() {
@@ -826,7 +842,7 @@ public class Package implements Serializable {
protected Map<Label, EnvironmentGroup> environmentGroups = new HashMap<>();
protected Map<Label, Path> subincludes = null;
- protected ImmutableList<Label> skylarkFileDependencies = null;
+ protected ImmutableList<Label> skylarkFileDependencies = ImmutableList.of();
/**
* True iff the "package" function has already been called in this package.
@@ -942,6 +958,14 @@ public class Package implements Serializable {
}
/**
+ * Uses the workspace name from {@code //external} to set this package's workspace name.
+ */
+ B setWorkspaceName(String workspaceName) {
+ pkg.workspaceName = workspaceName;
+ return self();
+ }
+
+ /**
* Returns whether the "package" function has been called yet
*/
public boolean isPackageFunctionUsed() {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index c8b6710377..0cfdf0adef 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -897,17 +897,18 @@ public final class PackageFactory {
* <p>Executes {@code globber.onCompletion()} on completion and executes
* {@code globber.onInterrupt()} on an {@link InterruptedException}.
*/
- private Package.LegacyBuilder createPackage(PackageIdentifier packageId, Path buildFile,
- List<Statement> preludeStatements, ParserInputSource inputSource,
- Map<PathFragment, SkylarkEnvironment> imports, ImmutableList<Label> skylarkFileDependencies,
- CachingPackageLocator locator, RuleVisibility defaultVisibility, Globber globber)
+ private Package.LegacyBuilder createPackage(ExternalPackage externalPkg,
+ PackageIdentifier packageId, Path buildFile, List<Statement> preludeStatements,
+ ParserInputSource inputSource, Map<PathFragment, SkylarkEnvironment> imports,
+ ImmutableList<Label> skylarkFileDependencies, CachingPackageLocator locator,
+ RuleVisibility defaultVisibility, Globber globber)
throws InterruptedException {
StoredEventHandler localReporter = new StoredEventHandler();
Preprocessor.Result preprocessingResult = preprocess(packageId, buildFile, inputSource, globber,
localReporter);
- return createPackageFromPreprocessingResult(packageId, buildFile, preprocessingResult,
- localReporter.getEvents(), preludeStatements, imports, skylarkFileDependencies, locator,
- defaultVisibility, globber);
+ return createPackageFromPreprocessingResult(externalPkg, packageId, buildFile,
+ preprocessingResult, localReporter.getEvents(), preludeStatements, imports,
+ skylarkFileDependencies, locator, defaultVisibility, globber);
}
/**
@@ -918,7 +919,8 @@ public final class PackageFactory {
* {@code globber.onInterrupt()} on an {@link InterruptedException}.
*/
// Used outside of bazel!
- public Package.LegacyBuilder createPackageFromPreprocessingResult(PackageIdentifier packageId,
+ public Package.LegacyBuilder createPackageFromPreprocessingResult(Package externalPkg,
+ PackageIdentifier packageId,
Path buildFile,
Preprocessor.Result preprocessingResult,
Iterable<Event> preprocessingEvents,
@@ -947,7 +949,7 @@ public final class PackageFactory {
prefetchGlobs(packageId, buildFileAST, preprocessingResult.preprocessed,
buildFile, globber, defaultVisibility, makeEnv);
return evaluateBuildFile(
- packageId, buildFileAST, buildFile, globber,
+ externalPkg, packageId, buildFileAST, buildFile, globber,
Iterables.concat(preprocessingEvents, localReporter.getEvents()),
defaultVisibility, preprocessingResult.containsErrors,
preprocessingResult.containsTransientErrors, makeEnv, imports, skylarkFileDependencies);
@@ -965,9 +967,8 @@ public final class PackageFactory {
*/
@VisibleForTesting
public Package createPackageForTesting(PackageIdentifier packageId,
- Path buildFile,
- CachingPackageLocator locator,
- EventHandler eventHandler) throws NoSuchPackageException, InterruptedException {
+ Path buildFile, CachingPackageLocator locator, EventHandler eventHandler)
+ throws NoSuchPackageException, InterruptedException {
String error = LabelValidator.validatePackageName(
packageId.getPackageFragment().getPathString());
if (error != null) {
@@ -978,11 +979,11 @@ public final class PackageFactory {
if (inputSource == null) {
throw new BuildFileContainsErrorsException(packageId.toString(), "IOException occured");
}
- Package result = createPackage(packageId, buildFile,
- ImmutableList.<Statement>of(), inputSource,
- ImmutableMap.<PathFragment, SkylarkEnvironment>of(),
- ImmutableList.<Label>of(),
- locator, ConstantRuleVisibility.PUBLIC,
+
+ Package result = createPackage((new ExternalPackage.Builder(
+ buildFile.getRelative("WORKSPACE"))).build(), packageId, buildFile,
+ ImmutableList.<Statement>of(), inputSource, ImmutableMap.<PathFragment,
+ SkylarkEnvironment>of(), ImmutableList.<Label>of(), locator, ConstantRuleVisibility.PUBLIC,
createLegacyGlobber(buildFile.getParentDirectory(), packageId, locator)).build();
Event.replayEventsOn(eventHandler, result.getEvents());
return result;
@@ -1135,8 +1136,8 @@ public final class PackageFactory {
* @see PackageFactory#PackageFactory
*/
@VisibleForTesting // used by PackageFactoryApparatus
- public Package.LegacyBuilder evaluateBuildFile(PackageIdentifier packageId,
- BuildFileAST buildFileAST, Path buildFilePath, Globber globber,
+ public Package.LegacyBuilder evaluateBuildFile(Package externalPkg,
+ PackageIdentifier packageId, BuildFileAST buildFileAST, Path buildFilePath, Globber globber,
Iterable<Event> pastEvents, RuleVisibility defaultVisibility, boolean containsError,
boolean containsTransientError, MakeEnvironment.Builder pkgMakeEnv,
Map<PathFragment, SkylarkEnvironment> imports,
@@ -1154,11 +1155,12 @@ public final class PackageFactory {
// "defaultVisibility" comes from the command line. Let's give the BUILD file a chance to
// set default_visibility once, be reseting the PackageBuilder.defaultVisibilitySet flag.
.setDefaultVisibilitySet(false)
- .setSkylarkFileDependencies(skylarkFileDependencies);
+ .setSkylarkFileDependencies(skylarkFileDependencies)
+ .setWorkspaceName(externalPkg.getWorkspaceName());
Event.replayEventsOn(eventHandler, pastEvents);
- // Stuff that closes over the package context:
+ // Stuff that closes over the package context:`
PackageContext context = new PackageContext(pkgBuilder, globber, eventHandler);
buildPkgEnv(pkgEnv, packageId.toString(), pkgMakeEnv, context, ruleFactory);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index cff91f66e7..23ceb9f31e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -147,6 +147,8 @@ public final class Rule implements Target {
private final FuncallExpression ast; // may be null
+ private final String workspaceName;
+
// Initialized in the call to populateOutputFiles.
private List<OutputFile> outputFiles;
private ListMultimap<String, OutputFile> outputFileMap;
@@ -160,6 +162,7 @@ public final class Rule implements Target {
this.attributeMap = new RawAttributeMapper(pkg, ruleClass, label, attributes);
this.containsErrors = false;
this.ast = ast;
+ this.workspaceName = pkg.getWorkspaceName();
}
void setVisibility(RuleVisibility visibility) {
@@ -186,6 +189,13 @@ public final class Rule implements Target {
this.containsErrors = true;
}
+ /**
+ * Returns the name of the workspace that this rule is in.
+ */
+ public String getWorkspaceName() {
+ return workspaceName;
+ }
+
@Override
public Label getLabel() {
return attributeMap.getLabel();
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 b318f3ee1f..16798105b9 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
@@ -316,10 +316,10 @@ public class PackageFunction implements SkyFunction {
throws PackageFunctionException {
RootedPath workspacePath = RootedPath.toRootedPath(
packageLookupPath, new PathFragment("WORKSPACE"));
- SkyKey workspaceKey = WorkspaceFileValue.key(workspacePath);
- WorkspaceFileValue workspace = null;
+ SkyKey workspaceKey = PackageValue.workspaceKey(workspacePath);
+ PackageValue workspace = null;
try {
- workspace = (WorkspaceFileValue) env.getValueOrThrow(workspaceKey, IOException.class,
+ workspace = (PackageValue) env.getValueOrThrow(workspaceKey, IOException.class,
FileSymlinkCycleException.class, InconsistentFilesystemException.class,
EvalException.class);
} catch (IOException | FileSymlinkCycleException | InconsistentFilesystemException
@@ -385,6 +385,12 @@ public class PackageFunction implements SkyFunction {
if (packageName.equals(EXTERNAL_PACKAGE_NAME)) {
return getExternalPackage(env, packageLookupValue.getRoot());
}
+ PackageValue externalPackage = (PackageValue) env.getValue(
+ PackageValue.key(PackageIdentifier.createInDefaultRepo(EXTERNAL_PACKAGE_NAME)));
+ if (externalPackage == null) {
+ return null;
+ }
+ Package externalPkg = externalPackage.getPackage();
PathFragment buildFileFragment = packageNameFragment.getChild("BUILD");
RootedPath buildFileRootedPath = RootedPath.toRootedPath(packageLookupValue.getRoot(),
@@ -462,8 +468,9 @@ public class PackageFunction implements SkyFunction {
return null;
}
- Package.LegacyBuilder legacyPkgBuilder = loadPackage(inputSource, replacementContents,
- packageId, buildFilePath, defaultVisibility, preludeStatements, importResult);
+ Package.LegacyBuilder legacyPkgBuilder = loadPackage(externalPkg, inputSource,
+ replacementContents, packageId, buildFilePath, defaultVisibility, preludeStatements,
+ importResult);
legacyPkgBuilder.buildPartial();
try {
handleLabelsCrossingSubpackagesAndPropagateInconsistentFilesystemExceptions(
@@ -709,8 +716,8 @@ public class PackageFunction implements SkyFunction {
* Constructs a {@link Package} object for the given package using legacy package loading.
* Note that the returned package may be in error.
*/
- private Package.LegacyBuilder loadPackage(ParserInputSource inputSource,
- @Nullable String replacementContents,
+ private Package.LegacyBuilder loadPackage(Package externalPkg,
+ ParserInputSource inputSource, @Nullable String replacementContents,
PackageIdentifier packageId, Path buildFilePath, RuleVisibility defaultVisibility,
List<Statement> preludeStatements, SkylarkImportResult importResult)
throws InterruptedException {
@@ -729,8 +736,8 @@ public class PackageFunction implements SkyFunction {
? packageFactory.preprocess(packageId, buildFilePath, inputSource, globber,
localReporter)
: Preprocessor.Result.noPreprocessing(replacementSource);
- pkgBuilder = packageFactory.createPackageFromPreprocessingResult(packageId, buildFilePath,
- preprocessingResult, localReporter.getEvents(), preludeStatements,
+ pkgBuilder = packageFactory.createPackageFromPreprocessingResult(externalPkg, packageId,
+ buildFilePath, preprocessingResult, localReporter.getEvents(), preludeStatements,
importResult.importMap, importResult.fileDependencies, packageLocator,
defaultVisibility, globber);
if (eventBus.get() != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java
index 65fd2afb7e..d3292fbd2d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java
@@ -19,6 +19,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.PackageIdentifier;
import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
@@ -52,4 +53,11 @@ public class PackageValue implements SkyValue {
public static SkyKey key(PackageIdentifier pkgIdentifier) {
return new SkyKey(SkyFunctions.PACKAGE, pkgIdentifier);
}
+
+ /**
+ * Returns a SkyKey to find the WORKSPACE file at the given path.
+ */
+ public static SkyKey workspaceKey(RootedPath workspacePath) {
+ return new SkyKey(SkyFunctions.WORKSPACE_FILE, workspacePath);
+ }
}
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 89126cb73d..a5bbbef020 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
@@ -21,7 +21,6 @@ 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.StoredEventHandler;
-import com.google.devtools.build.lib.packages.ExternalPackage;
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;
@@ -95,8 +94,7 @@ public class WorkspaceFileFunction implements SkyFunction {
throw new WorkspaceFileFunctionException(e);
}
- ExternalPackage pkg = builder.build();
- return new WorkspaceFileValue(pkg.getWorkspaceName(), pkg);
+ return new PackageValue(builder.build());
}
private void parseWorkspaceFile(Path workspaceFilePath, Builder builder)
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java
deleted file mode 100644
index 200f23fbc2..0000000000
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.skyframe;
-
-import com.google.devtools.build.lib.packages.ExternalPackage;
-import com.google.devtools.build.lib.vfs.RootedPath;
-import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.SkyValue;
-
-import javax.annotation.Nullable;
-
-/**
- * Holds the contents of a WORKSPACE file as the //external package.
- */
-public class WorkspaceFileValue implements SkyValue {
-
- private final String workspace;
- private final ExternalPackage pkg;
-
- public WorkspaceFileValue(String workspace, ExternalPackage pkg) {
- this.workspace = workspace;
- this.pkg = pkg;
- }
-
- /**
- * Returns the name of this workspace (or null for the default workspace).
- */
- @Nullable
- public String getWorkspace() {
- return workspace;
- }
-
- /**
- * Returns the //external package.
- */
- public ExternalPackage getPackage() {
- return pkg;
- }
-
- /**
- * Generates a SkyKey based on the path to the WORKSPACE file.
- */
- public static SkyKey key(RootedPath workspacePath) {
- return new SkyKey(SkyFunctions.WORKSPACE_FILE, workspacePath);
- }
-
-}
diff --git a/src/main/tools/BUILD b/src/main/tools/BUILD
index 0e73eda39d..2f1f8be022 100644
--- a/src/main/tools/BUILD
+++ b/src/main/tools/BUILD
@@ -20,4 +20,7 @@ cc_binary(
copts = ["-std=c99"],
)
-exports_files(["build_interface_so"])
+exports_files([
+ "build_interface_so",
+ "jdk.WORKSPACE",
+])
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java b/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java
index d519e421d6..11750fdf3a 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java
@@ -75,6 +75,7 @@ public abstract class FoundationTestCase extends TestCase {
scratch = new Scratch(createFileSystem());
outputBase = scratchDir("/usr/local/google/_blaze_jrluser/FAKEMD5/");
rootDirectory = scratchDir("/" + TestConstants.TEST_WORKSPACE_DIRECTORY);
+ scratchFile(rootDirectory.getRelative("WORKSPACE").getPathString());
copySkylarkFilesIfExist();
actionOutputBase = scratchDir("/usr/local/google/_blaze_jrluser/FAKEMD5/action_out/");
eventCollector = new EventCollector(EventKind.ERRORS_AND_WARNINGS);