aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/Root.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java45
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Rule.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java5
37 files changed, 218 insertions, 171 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Root.java b/src/main/java/com/google/devtools/build/lib/actions/Root.java
index 859a8b6344..a814560d5d 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Root.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Root.java
@@ -137,14 +137,12 @@ public final class Root implements Comparable<Root>, Serializable {
@Nullable private final Path execRoot;
private final Path path;
private final boolean isMiddlemanRoot;
- private final boolean isMainRepo;
private final PathFragment execPath;
private Root(@Nullable Path execRoot, Path path, boolean isMiddlemanRoot, boolean isMainRepo) {
this.execRoot = execRoot;
this.path = Preconditions.checkNotNull(path);
this.isMiddlemanRoot = isMiddlemanRoot;
- this.isMainRepo = isMainRepo;
this.execPath = isSourceRoot() ? PathFragment.EMPTY_FRAGMENT : path.relativeTo(execRoot);
}
@@ -183,10 +181,6 @@ public final class Root implements Comparable<Root>, Serializable {
return isMiddlemanRoot;
}
- public boolean isMainRepo() {
- return isMainRepo;
- }
-
@Override
public int compareTo(Root o) {
return path.compareTo(o.path);
@@ -194,7 +188,7 @@ public final class Root implements Comparable<Root>, Serializable {
@Override
public int hashCode() {
- return Objects.hash(execRoot, path.hashCode(), isMainRepo);
+ return Objects.hash(execRoot, path.hashCode());
}
@Override
@@ -206,8 +200,7 @@ public final class Root implements Comparable<Root>, Serializable {
return false;
}
Root r = (Root) o;
- return path.equals(r.path) && Objects.equals(execRoot, r.execRoot)
- && Objects.equals(isMainRepo, r.isMainRepo);
+ return path.equals(r.path) && Objects.equals(execRoot, r.execRoot);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java
index 48b746c655..25e95947e0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.analysis;
import com.google.common.base.Function;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.Target;
@@ -26,19 +27,14 @@ import java.util.Collection;
*/
public class AnalysisPhaseStartedEvent {
- private final Iterable<Label> labels;
+ private final ImmutableSet<Target> targets;
/**
* Construct the event.
* @param targets The set of active targets that remain.
*/
public AnalysisPhaseStartedEvent(Collection<Target> targets) {
- this.labels = Iterables.transform(targets, new Function<Target, Label>() {
- @Override
- public Label apply(Target input) {
- return input.getLabel();
- }
- });
+ this.targets = ImmutableSet.copyOf(targets);
}
/**
@@ -46,6 +42,15 @@ public class AnalysisPhaseStartedEvent {
* of the targets we attempted to load.
*/
public Iterable<Label> getLabels() {
- return labels;
+ return Iterables.transform(targets, new Function<Target, Label>() {
+ @Override
+ public Label apply(Target input) {
+ return input.getLabel();
+ }
+ });
+ }
+
+ public ImmutableSet<Target> getTargets() {
+ return targets;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java
index 75ac3a0d53..ae209c9495 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java
@@ -39,6 +39,7 @@ public interface ConfigurationCollectionFactory {
* @param loadedPackageProvider the package provider
* @param buildOptions top-level build options representing the command-line
* @param errorEventListener the event listener for errors
+ * @param mainRepositoryName the workspace name of the main repository
* @return the top-level configuration
* @throws InvalidConfigurationException
*/
@@ -48,7 +49,8 @@ public interface ConfigurationCollectionFactory {
Cache<String, BuildConfiguration> cache,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- EventHandler errorEventListener)
+ EventHandler errorEventListener,
+ String mainRepositoryName)
throws InvalidConfigurationException, InterruptedException;
/**
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 8e195519b0..f0586b3fd4 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
@@ -253,7 +253,7 @@ public final class RuleContext extends TargetContext
* Returns the workspace name for the rule.
*/
public String getWorkspaceName() {
- return rule.getPackage().getWorkspaceName();
+ return rule.getRepository().strippedName();
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
index 73cc667034..2363624388 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
@@ -37,12 +37,14 @@ import java.io.IOException;
*/
public final class BinTools {
private final BlazeDirectories directories;
- private final Path binDir; // the working bin directory under execRoot
+ private final Path execrootParent;
private final ImmutableList<String> embeddedTools;
+ private Path binDir; // the working bin directory under execRoot
+
private BinTools(BlazeDirectories directories, ImmutableList<String> tools) {
this.directories = directories;
- this.binDir = directories.getExecRoot().getRelative("_bin");
+ this.execrootParent = directories.getExecRoot().getParentDirectory();
ImmutableList.Builder<String> builder = ImmutableList.builder();
// Files under embedded_tools shouldn't be copied to under _bin dir
// They won't be used during action execution time.
@@ -52,6 +54,7 @@ public final class BinTools {
}
}
this.embeddedTools = builder.build();
+ this.binDir = null;
}
/**
@@ -69,7 +72,8 @@ public final class BinTools {
*/
@VisibleForTesting
public static BinTools empty(BlazeDirectories directories) {
- return new BinTools(directories, ImmutableList.<String>of());
+ return new BinTools(directories, ImmutableList.<String>of()).setBinDir(
+ directories.getWorkspace().getBaseName());
}
/**
@@ -79,7 +83,8 @@ public final class BinTools {
*/
@VisibleForTesting
public static BinTools forUnitTesting(BlazeDirectories directories, Iterable<String> tools) {
- return new BinTools(directories, ImmutableList.copyOf(tools));
+ return new BinTools(directories, ImmutableList.copyOf(tools)).setBinDir(
+ directories.getWorkspace().getBaseName());
}
/**
@@ -88,7 +93,7 @@ public final class BinTools {
*/
@VisibleForTesting
public static BinTools forIntegrationTesting(
- BlazeDirectories directories, String srcDir, Iterable<String> tools)
+ BlazeDirectories directories, String srcDir, Iterable<String> tools, String repositoryName)
throws IOException {
Path srcPath = directories.getOutputBase().getFileSystem().getPath(srcDir);
for (String embedded : tools) {
@@ -101,7 +106,7 @@ public final class BinTools {
// much point in creating a symlink to a non-existent binary here.
continue;
}
- Path outputPath = directories.getExecRoot().getChild("_bin").getChild(embedded);
+ Path outputPath = directories.getExecRoot(repositoryName).getChild("_bin").getChild(embedded);
if (outputPath.exists()) {
outputPath.delete();
}
@@ -109,7 +114,7 @@ public final class BinTools {
outputPath.createSymbolicLink(runfilesPath);
}
- return new BinTools(directories, ImmutableList.copyOf(tools));
+ return new BinTools(directories, ImmutableList.copyOf(tools)).setBinDir(repositoryName);
}
private static void scanDirectoryRecursively(
@@ -143,6 +148,7 @@ public final class BinTools {
}
public Artifact getEmbeddedArtifact(String embedPath, ArtifactFactory artifactFactory) {
+ Preconditions.checkNotNull(binDir);
PathFragment path = getExecPath(embedPath);
Preconditions.checkNotNull(path, embedPath + " not found in embedded tools");
return artifactFactory.getDerivedArtifact(path, binDir.getParentDirectory());
@@ -156,11 +162,17 @@ public final class BinTools {
return builder.build();
}
+ private BinTools setBinDir(String workspaceName) {
+ binDir = execrootParent.getRelative(workspaceName).getRelative("_bin");
+ return this;
+ }
+
/**
* Initializes the build tools not available at absolute paths. Note that
* these must be constant across all configurations.
*/
- public void setupBuildTools() throws ExecException {
+ public void setupBuildTools(String workspaceName) throws ExecException {
+ setBinDir(workspaceName);
try {
FileSystemUtils.createDirectoryAndParents(binDir);
} catch (IOException e) {
@@ -173,6 +185,7 @@ public final class BinTools {
}
private void setupTool(String embeddedPath) throws ExecException {
+ Preconditions.checkNotNull(binDir);
Path sourcePath = directories.getEmbeddedBinariesRoot().getRelative(embeddedPath);
Path linkPath = binDir.getRelative(new PathFragment(embeddedPath).getBaseName());
linkTool(sourcePath, linkPath);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 5285ee9f07..6efa2d1c6e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -1031,6 +1031,7 @@ public final class BuildConfiguration {
private final ImmutableMap<Class<? extends Fragment>, Fragment> fragments;
private final ImmutableMap<String, Class<? extends Fragment>> skylarkVisibleFragments;
+ private final String mainRepositoryName;
/**
* Directories in the output tree.
@@ -1100,18 +1101,21 @@ public final class BuildConfiguration {
}
Root getRoot(
- RepositoryName repositoryName, String outputDirName, BlazeDirectories directories) {
+ RepositoryName repositoryName, String outputDirName, BlazeDirectories directories,
+ String mainRepositoryName) {
// e.g., execroot/repo1
- Path execRoot = directories.getExecRoot();
+ Path execRoot = directories.getExecRoot(mainRepositoryName);
// e.g., execroot/repo1/bazel-out/config/bin
Path outputDir = execRoot.getRelative(directories.getRelativeOutputPath())
.getRelative(outputDirName);
if (middleman) {
- return INTERNER.intern(Root.middlemanRoot(execRoot, outputDir, repositoryName.isMain()));
+ return INTERNER.intern(Root.middlemanRoot(execRoot, outputDir,
+ repositoryName.strippedName().equals(mainRepositoryName)));
}
// e.g., [[execroot/repo1]/bazel-out/config/bin]
return INTERNER.intern(
- Root.asDerivedRoot(execRoot, outputDir.getRelative(name), repositoryName.isMain()));
+ Root.asDerivedRoot(execRoot, outputDir.getRelative(name),
+ repositoryName.strippedName().equals(mainRepositoryName)));
}
}
@@ -1346,7 +1350,8 @@ public final class BuildConfiguration {
public BuildConfiguration(BlazeDirectories directories,
Map<Class<? extends Fragment>, Fragment> fragmentsMap,
BuildOptions buildOptions,
- boolean actionsDisabled) {
+ boolean actionsDisabled,
+ String repositoryName) {
this.directories = directories;
this.actionsEnabled = !actionsDisabled;
this.fragments = ImmutableSortedMap.copyOf(fragmentsMap, lexicalFragmentSorter);
@@ -1355,6 +1360,7 @@ public final class BuildConfiguration {
this.buildOptions = buildOptions;
this.options = buildOptions.get(Options.class);
+ this.mainRepositoryName = repositoryName;
Map<String, String> testEnv = new TreeMap<>();
for (Map.Entry<String, String> entry : this.options.testEnvironment) {
@@ -1424,8 +1430,8 @@ public final class BuildConfiguration {
}
BuildOptions options = buildOptions.trim(
getOptionsClasses(fragmentsMap.keySet(), ruleClassProvider));
- BuildConfiguration newConfig =
- new BuildConfiguration(directories, fragmentsMap, options, !actionsEnabled);
+ BuildConfiguration newConfig = new BuildConfiguration(
+ directories, fragmentsMap, options, !actionsEnabled, mainRepositoryName);
newConfig.setConfigurationTransitions(this.transitions);
return newConfig;
}
@@ -2061,7 +2067,8 @@ public final class BuildConfiguration {
* Returns the output directory for this build configuration.
*/
public Root getOutputDirectory(RepositoryName repositoryName) {
- return OutputDirectory.OUTPUT.getRoot(repositoryName, outputDirName, directories);
+ return OutputDirectory.OUTPUT.getRoot(
+ repositoryName, outputDirName, directories, mainRepositoryName);
}
/**
@@ -2080,7 +2087,8 @@ public final class BuildConfiguration {
* repositories (external) but will need to be fixed.
*/
public Root getBinDirectory(RepositoryName repositoryName) {
- return OutputDirectory.BIN.getRoot(repositoryName, outputDirName, directories);
+ return OutputDirectory.BIN.getRoot(
+ repositoryName, outputDirName, directories, mainRepositoryName);
}
/**
@@ -2094,7 +2102,8 @@ public final class BuildConfiguration {
* Returns the include directory for this build configuration.
*/
public Root getIncludeDirectory(RepositoryName repositoryName) {
- return OutputDirectory.INCLUDE.getRoot(repositoryName, outputDirName, directories);
+ return OutputDirectory.INCLUDE.getRoot(
+ repositoryName, outputDirName, directories, mainRepositoryName);
}
/**
@@ -2107,7 +2116,8 @@ public final class BuildConfiguration {
}
public Root getGenfilesDirectory(RepositoryName repositoryName) {
- return OutputDirectory.GENFILES.getRoot(repositoryName, outputDirName, directories);
+ return OutputDirectory.GENFILES.getRoot(
+ repositoryName, outputDirName, directories, mainRepositoryName);
}
/**
@@ -2116,14 +2126,16 @@ public final class BuildConfiguration {
* needed for Jacoco's coverage reporting tools.
*/
public Root getCoverageMetadataDirectory(RepositoryName repositoryName) {
- return OutputDirectory.COVERAGE.getRoot(repositoryName, outputDirName, directories);
+ return OutputDirectory.COVERAGE.getRoot(
+ repositoryName, outputDirName, directories, mainRepositoryName);
}
/**
* Returns the testlogs directory for this build configuration.
*/
public Root getTestLogsDirectory(RepositoryName repositoryName) {
- return OutputDirectory.TESTLOGS.getRoot(repositoryName, outputDirName, directories);
+ return OutputDirectory.TESTLOGS.getRoot(
+ repositoryName, outputDirName, directories, mainRepositoryName);
}
/**
@@ -2150,7 +2162,8 @@ public final class BuildConfiguration {
* Returns the internal directory (used for middlemen) for this build configuration.
*/
public Root getMiddlemanDirectory(RepositoryName repositoryName) {
- return OutputDirectory.MIDDLEMAN.getRoot(repositoryName, outputDirName, directories);
+ return OutputDirectory.MIDDLEMAN.getRoot(
+ repositoryName, outputDirName, directories, mainRepositoryName);
}
public boolean getAllowRuntimeDepsOnNeverLink() {
@@ -2165,6 +2178,10 @@ public final class BuildConfiguration {
return options.pluginList;
}
+ public String getMainRepositoryName() {
+ return mainRepositoryName;
+ }
+
/**
* Returns the configuration-dependent string for this configuration. This is also the name of the
* configuration's base output directory unless {@link Options#outputDirectoryName} overrides it.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java
index 595f5271d2..2478d404d8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java
@@ -69,10 +69,11 @@ public final class ConfigurationFactory {
Cache<String, BuildConfiguration> cache,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- EventHandler errorEventListener)
+ EventHandler errorEventListener,
+ String mainRepositoryName)
throws InvalidConfigurationException, InterruptedException {
return configurationCollectionFactory.createConfigurations(this, cache,
- loadedPackageProvider, buildOptions, errorEventListener);
+ loadedPackageProvider, buildOptions, errorEventListener, mainRepositoryName);
}
/**
@@ -86,7 +87,8 @@ public final class ConfigurationFactory {
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
boolean actionsDisabled,
- Cache<String, BuildConfiguration> cache)
+ Cache<String, BuildConfiguration> cache,
+ String repositoryName)
throws InvalidConfigurationException, InterruptedException {
String cacheKey = buildOptions.computeCacheKey();
@@ -109,7 +111,8 @@ public final class ConfigurationFactory {
return null;
}
- result = new BuildConfiguration(directories, fragments, buildOptions, actionsDisabled);
+ result = new BuildConfiguration(directories, fragments, buildOptions, actionsDisabled,
+ repositoryName);
cache.put(cacheKey, result);
return result;
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
index 696f581150..8a5e781c16 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
@@ -57,11 +57,12 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
Cache<String, BuildConfiguration> cache,
PackageProviderForConfigurations packageProvider,
BuildOptions buildOptions,
- EventHandler eventHandler)
+ EventHandler eventHandler,
+ String mainRepositoryName)
throws InvalidConfigurationException, InterruptedException {
// Target configuration
BuildConfiguration targetConfiguration = configurationFactory.getConfiguration(
- packageProvider, buildOptions, false, cache);
+ packageProvider, buildOptions, false, cache, mainRepositoryName);
if (targetConfiguration == null) {
return null;
}
@@ -72,7 +73,7 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
// Note that this passes in the dataConfiguration, not the target
// configuration. This is intentional.
BuildConfiguration hostConfiguration = getHostConfigurationFromRequest(configurationFactory,
- packageProvider, dataConfiguration, buildOptions, cache);
+ packageProvider, dataConfiguration, buildOptions, cache, mainRepositoryName);
if (hostConfiguration == null) {
return null;
}
@@ -82,7 +83,7 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
for (SplitTransition<BuildOptions> transition : buildOptions.getPotentialSplitTransitions()) {
for (BuildOptions splitOptions : transition.split(buildOptions)) {
BuildConfiguration splitConfig = configurationFactory.getConfiguration(
- packageProvider, splitOptions, false, cache);
+ packageProvider, splitOptions, false, cache, mainRepositoryName);
splitTransitionsTable.put(transition, splitConfig);
}
}
@@ -156,14 +157,16 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
PackageProviderForConfigurations loadedPackageProvider,
BuildConfiguration requestConfig,
BuildOptions buildOptions,
- Cache<String, BuildConfiguration> cache)
+ Cache<String, BuildConfiguration> cache,
+ String repositoryName)
throws InvalidConfigurationException, InterruptedException {
BuildConfiguration.Options commonOptions = buildOptions.get(BuildConfiguration.Options.class);
if (!commonOptions.useDistinctHostConfiguration) {
return requestConfig;
} else {
BuildConfiguration hostConfig = configurationFactory.getConfiguration(
- loadedPackageProvider, buildOptions.createHostOptions(false), false, cache);
+ loadedPackageProvider, buildOptions.createHostOptions(false), false, cache,
+ repositoryName);
if (hostConfig == null) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
index a913927f8f..89778536da 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
@@ -201,7 +201,7 @@ public class BazelPythonSemantics implements PythonSemantics {
}
private static boolean isUnderWorkspace(PathFragment path) {
- return !path.startsWith(Label.EXTERNAL_PACKAGE_NAME);
+ return !path.startsWith(new PathFragment(Label.EXTERNAL_PATH_PREFIX));
}
private static String getZipRunfilesPath(PathFragment path, PathFragment workspaceName) {
@@ -211,7 +211,7 @@ public class BazelPythonSemantics implements PythonSemantics {
zipRunfilesPath = workspaceName.getRelative(path).normalize().toString();
} else {
// If the file is in external package, strip "external"
- zipRunfilesPath = path.relativeTo(Label.EXTERNAL_PACKAGE_NAME).normalize().toString();
+ zipRunfilesPath = path.relativeTo(Label.EXTERNAL_PATH_PREFIX).normalize().toString();
}
// We put the whole runfiles tree under the ZIP_RUNFILES_DIRECTORY_NAME directory, by doing this
// , we avoid the conflict between default workspace name "__main__" and __main__.py file.
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
index a45a907e30..a516a53e98 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
@@ -141,12 +141,6 @@ public final class BuildTool {
try {
env.getEventBus().post(new BuildStartingEvent(env, request));
LOG.info("Build identifier: " + request.getId());
- executionTool = new ExecutionTool(env, request);
- if (needsExecutionPhase(request.getBuildOptions())) {
- // Initialize the execution tool early if we need it. This hides the latency of setting up
- // the execution backends.
- executionTool.init();
- }
// Error out early if multi_cpus is set, but we're not in build or test command.
if (!request.getMultiCpus().isEmpty()) {
@@ -166,6 +160,11 @@ public final class BuildTool {
// Target pattern evaluation.
LoadingResult loadingResult = evaluateTargetPatterns(request, validator);
+ env.setWorkspaceName(loadingResult.getWorkspaceName());
+ executionTool = new ExecutionTool(env, request);
+ if (needsExecutionPhase(request.getBuildOptions())) {
+ executionTool.init();
+ }
// Exit if there are any pending exceptions from modules.
env.throwPendingException();
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 59e447eecd..7e11859c38 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -184,7 +184,6 @@ public class ExecutionTool {
this.runtime = env.getRuntime();
this.request = request;
-
// Create tools before getting the strategies from the modules as some of them need tools to
// determine whether the host actually supports certain strategies (e.g. sandboxing).
createToolsSymlinks();
@@ -333,7 +332,7 @@ public class ExecutionTool {
TopLevelArtifactContext topLevelArtifactContext)
throws BuildFailedException, InterruptedException, TestExecException, AbruptExitException {
Stopwatch timer = Stopwatch.createStarted();
- prepare(packageRoots, analysisResult.getWorkspaceName());
+ prepare(packageRoots);
ActionGraph actionGraph = analysisResult.getActionGraph();
@@ -347,7 +346,7 @@ public class ExecutionTool {
request.getBuildOptions().finalizeActions);
} else {
// TODO(bazel-team): this could be just another OutputService
- startLocalOutputBuild(analysisResult.getWorkspaceName());
+ startLocalOutputBuild();
}
List<BuildConfiguration> targetConfigurations = configurations.getTargetConfigurations();
@@ -355,10 +354,9 @@ public class ExecutionTool {
? targetConfigurations.get(0) : null;
if (targetConfigurations.size() == 1) {
String productName = runtime.getProductName();
- String dirName = env.getWorkspaceName();
- String workspaceName = analysisResult.getWorkspaceName();
+ String workspaceName = env.getWorkspaceName();
OutputDirectoryLinksUtils.createOutputDirectoryLinks(
- dirName, env.getWorkspace(), env.getDirectories().getExecRoot(workspaceName),
+ workspaceName, env.getWorkspace(), env.getDirectories().getExecRoot(workspaceName),
env.getDirectories().getOutputPath(workspaceName), getReporter(), targetConfiguration,
request.getBuildOptions().getSymlinkPrefix(productName), productName);
}
@@ -491,7 +489,7 @@ public class ExecutionTool {
}
}
- private void prepare(ImmutableMap<PackageIdentifier, Path> packageRoots, String workspaceName)
+ private void prepare(ImmutableMap<PackageIdentifier, Path> packageRoots)
throws ExecutorInitException {
// Prepare for build.
Profiler.instance().markPhase(ProfilePhase.PREPARE);
@@ -502,7 +500,7 @@ public class ExecutionTool {
// Plant the symlink forest.
try {
new SymlinkForest(
- packageRoots, getExecRoot(), runtime.getProductName(), workspaceName)
+ packageRoots, getExecRoot(), runtime.getProductName(), env.getWorkspaceName())
.plantSymlinkForest();
} catch (IOException e) {
throw new ExecutorInitException("Source forest creation failed", e);
@@ -511,7 +509,7 @@ public class ExecutionTool {
private void createToolsSymlinks() throws ExecutorInitException {
try {
- env.getBlazeWorkspace().getBinTools().setupBuildTools();
+ env.getBlazeWorkspace().getBinTools().setupBuildTools(env.getWorkspaceName());
} catch (ExecException e) {
throw new ExecutorInitException("Tools symlink creation failed", e);
}
@@ -532,9 +530,9 @@ public class ExecutionTool {
/**
* Prepare for a local output build.
*/
- private void startLocalOutputBuild(String workspaceName) throws ExecutorInitException {
+ private void startLocalOutputBuild() throws ExecutorInitException {
try (AutoProfiler p = AutoProfiler.profiled("Starting local output build", ProfilerTask.INFO)) {
- Path outputPath = env.getDirectories().getOutputPath(workspaceName);
+ Path outputPath = env.getDirectories().getOutputPath(env.getWorkspaceName());
Path localOutputPath = env.getDirectories().getLocalOutputPath();
if (outputPath.isSymbolicLink()) {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
index 0ae420a20c..838f3bad1e 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
@@ -78,15 +78,16 @@ public class OutputDirectoryLinksUtils {
}
// Points to execroot
- createLink(workspace, execRootSymlink(symlinkPrefix, workspaceName), execRoot, failures);
-
+ createLink(workspace, execRootSymlink(
+ symlinkPrefix, workspace.getBaseName()), execRoot, failures);
+ RepositoryName repositoryName = RepositoryName.createFromValidStrippedName(workspaceName);
if (targetConfig != null) {
createLink(workspace, symlinkPrefix + "bin",
- targetConfig.getBinDirectory(RepositoryName.MAIN).getPath(), failures);
+ targetConfig.getBinDirectory(repositoryName).getPath(), failures);
createLink(workspace, symlinkPrefix + "testlogs",
- targetConfig.getTestLogsDirectory(RepositoryName.MAIN).getPath(), failures);
+ targetConfig.getTestLogsDirectory(repositoryName).getPath(), failures);
createLink(workspace, symlinkPrefix + "genfiles",
- targetConfig.getGenfilesDirectory(RepositoryName.MAIN).getPath(), failures);
+ targetConfig.getGenfilesDirectory(repositoryName).getPath(), failures);
}
if (!failures.isEmpty()) {
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 91c013bdfa..e1607e96d8 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
@@ -712,6 +712,6 @@ public final class Rule implements Target, DependencyFilter.AttributeInfoProvide
* @return The repository name.
*/
public RepositoryName getRepository() {
- return getLabel().getPackageIdentifier().getRepository();
+ return RepositoryName.createFromValidStrippedName(pkg.getWorkspaceName());
}
}
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 abe66c67bb..0e5f0e4c1b 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
@@ -141,8 +141,6 @@ public class WorkspaceFactory {
/**
* Parses the given WORKSPACE file without resolving skylark imports.
- *
- * <p>Called by com.google.devtools.build.workspace.Resolver from //src/tools/generate_workspace.
*/
public void parse(ParserInputSource source)
throws BuildFileContainsErrorsException, InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java
index 4a1cbe2a18..d4c838969e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.rules.cpp.FdoSupport.FdoException;
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
+import com.google.devtools.build.lib.skyframe.WorkspaceNameValue;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -46,12 +47,13 @@ public class FdoSupportFunction implements SkyFunction {
public SkyValue compute(SkyKey skyKey, Environment env)
throws FdoSkyException, InterruptedException {
BlazeDirectories blazeDirectories = PrecomputedValue.BLAZE_DIRECTORIES.get(env);
+ WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env.getValue(
+ WorkspaceNameValue.key());
if (env.valuesMissing()) {
return null;
}
- // TODO(kchodorow): create a SkyFunction to get the main repository name and pass it in here.
- Path execRoot = blazeDirectories.getExecRoot();
+ Path execRoot = blazeDirectories.getExecRoot(workspaceNameValue.getName());
FdoSupportValue.Key key = (FdoSupportValue.Key) skyKey.argument();
FdoSupport fdoSupport;
try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java
index 8b6015d9da..57bf9fa505 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java
@@ -23,7 +23,6 @@ import com.google.devtools.build.lib.rules.test.TestRunnerAction.ResolvedPaths;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
import com.google.devtools.build.lib.view.test.TestStatus.TestResultData;
import java.util.Collection;
@@ -93,9 +92,9 @@ public class TestResult {
/**
* @return Coverage data artifact, if available and null otherwise.
*/
- public PathFragment getCoverageData() {
+ public Path getCoverageData() {
if (data.getHasCoverage()) {
- return testAction.getCoverageData().getExecPath();
+ return testAction.getCoverageData().getPath();
}
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
index 98c56c48c8..3246f2fe26 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
@@ -150,15 +150,6 @@ public final class BlazeWorkspace {
}
/**
- * Returns the execution root directory associated with this Blaze server
- * process. This is where all input and output files visible to the actual
- * build reside.
- */
- public Path getExecRoot() {
- return directories.getExecRoot();
- }
-
- /**
* Returns path to the cache directory. Path must be inside output base to
* ensure that users can run concurrent instances of blaze in different
* clients without attempting to concurrently write to the same action cache
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index 84d5a20825..fea9d72b1d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -91,6 +91,7 @@ public final class CommandEnvironment {
private long commandStartTime;
private OutputService outputService;
private Path workingDirectory;
+ private String workspaceName;
private String commandName;
private OptionsProvider options;
@@ -143,6 +144,7 @@ public final class CommandEnvironment {
// TODO(ulfjack): We don't call beforeCommand() in tests, but rely on workingDirectory being set
// in setupPackageCache(). This leads to NPE if we don't set it here.
this.workingDirectory = directories.getWorkspace();
+ this.workspaceName = null;
workspace.getSkyframeExecutor().setEventBus(eventBus);
}
@@ -292,13 +294,14 @@ public final class CommandEnvironment {
}
public String getWorkspaceName() {
- Path workspace = getDirectories().getWorkspace();
- if (workspace == null) {
- return "";
- }
- return workspace.getBaseName();
+ Preconditions.checkNotNull(workspaceName);
+ return workspaceName;
}
+ public void setWorkspaceName(String workspaceName) {
+ Preconditions.checkState(this.workspaceName == null, "workspace name can only be set once");
+ this.workspaceName = workspaceName;
+ }
/**
* Returns if the client passed a valid workspace to be used for the build.
*/
@@ -321,7 +324,8 @@ public final class CommandEnvironment {
* build reside.
*/
public Path getExecRoot() {
- return getDirectories().getExecRoot();
+ Preconditions.checkNotNull(workspaceName);
+ return getDirectories().getExecRoot(workspaceName);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java b/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java
index 8206527d4f..d23b7e5b5a 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java
@@ -30,9 +30,7 @@ import com.google.devtools.build.lib.rules.test.TestResult;
import com.google.devtools.build.lib.runtime.TerminalTestResultNotifier.TestSummaryOptions;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -45,7 +43,6 @@ import java.util.Set;
*/
@ThreadCompatible
public class TestResultAnalyzer {
- private final Path execRoot;
private final TestSummaryOptions summaryOptions;
private final ExecutionOptions executionOptions;
private final EventBus eventBus;
@@ -59,11 +56,9 @@ public class TestResultAnalyzer {
* @param executionOptions Parsed build/test execution options.
* @param eventBus For reporting failed to build and cached tests.
*/
- public TestResultAnalyzer(Path execRoot,
- TestSummaryOptions summaryOptions,
+ public TestResultAnalyzer(TestSummaryOptions summaryOptions,
ExecutionOptions executionOptions,
EventBus eventBus) {
- this.execRoot = execRoot;
this.summaryOptions = summaryOptions;
this.executionOptions = executionOptions;
this.eventBus = eventBus;
@@ -211,10 +206,9 @@ public class TestResultAnalyzer {
numLocalActionCached++;
}
- PathFragment coverageData = result.getCoverageData();
+ Path coverageData = result.getCoverageData();
if (coverageData != null) {
- summaryBuilder.addCoverageFiles(
- Collections.singletonList(execRoot.getRelative(coverageData)));
+ summaryBuilder.addCoverageFiles(Collections.singletonList(coverageData));
}
if (!executionOptions.runsPerTestDetectsFlakes) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index 368529e804..0a0cec59be 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -202,6 +202,7 @@ public final class CleanCommand implements BlazeCommand {
private void actuallyClean(CommandEnvironment env,
Path outputBase, Options cleanOptions, String symlinkPrefix) throws IOException,
ShutdownBlazeServerException, CommandException, ExecException, InterruptedException {
+ String workspaceDirectory = env.getWorkspace().getBaseName();
if (env.getOutputService() != null) {
env.getOutputService().clean();
}
@@ -225,7 +226,7 @@ public final class CleanCommand implements BlazeCommand {
// In order to be sure that we delete everything, delete the workspace directory both for
// --deep_execroot and for --nodeep_execroot.
for (String directory : new String[] {
- env.getWorkspaceName(), "execroot/" + env.getWorkspaceName() }) {
+ workspaceDirectory, "execroot/" + workspaceDirectory }) {
Path child = outputBase.getRelative(directory);
if (child.exists()) {
LOG.finest("Cleaning " + child + (cleanOptions.async ? " asynchronously..." : ""));
@@ -239,8 +240,8 @@ public final class CleanCommand implements BlazeCommand {
}
// remove convenience links
OutputDirectoryLinksUtils.removeOutputDirectoryLinks(
- env.getWorkspaceName(), env.getWorkspace(), env.getReporter(), symlinkPrefix,
- env.getRuntime().getProductName());
+ workspaceDirectory, env.getWorkspace(), env.getReporter(),
+ symlinkPrefix, env.getRuntime().getProductName());
// shutdown on expunge cleans
if (cleanOptions.expunge || cleanOptions.expunge_async) {
throw new ShutdownBlazeServerException(0);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
index 3f0ba6202f..bf47b1487d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
@@ -181,7 +181,7 @@ public abstract class InfoItem {
public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
throws AbruptExitException {
checkNotNull(env);
- return print(env.getRuntime().getWorkspace().getExecRoot());
+ return print(env.getDirectories().getExecRoot());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
index 970cb5c007..bbc7a02c4d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
@@ -192,7 +192,7 @@ public final class ProfileCommand implements BlazeCommand {
MultiProfileStatistics statistics =
new MultiProfileStatistics(
env.getWorkingDirectory(),
- env.getWorkspaceName(),
+ env.getWorkspace().getBaseName(),
options.getResidue(),
getInfoListener(env),
opts.vfsStatsLimit > 0);
@@ -248,7 +248,7 @@ public final class ProfileCommand implements BlazeCommand {
phaseStatistics.put(
phase,
new PhaseStatistics(
- phase, info, env.getWorkspaceName(), opts.vfsStatsLimit > 0));
+ phase, info, env.getWorkspace().getBaseName(), opts.vfsStatsLimit > 0));
}
CriticalPathStatistics critPathStats = new CriticalPathStatistics(info);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
index cd31c7d396..94b71d8df3 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
@@ -85,7 +85,6 @@ public class TestCommand implements BlazeCommand {
@Override
public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
TestResultAnalyzer resultAnalyzer = new TestResultAnalyzer(
- env.getDirectories().getExecRoot(),
options.getOptions(TestSummaryOptions.class),
options.getOptions(ExecutionOptions.class),
env.getEventBus());
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
index 2eff7c45cc..bb529e9a16 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
@@ -76,6 +76,7 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
private final UUID uuid = UUID.randomUUID();
private final AtomicInteger execCounter = new AtomicInteger();
+ private final String workspaceName;
private DarwinSandboxedStrategy(
BuildRequest buildRequest,
@@ -84,20 +85,23 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
boolean verboseFailures,
String productName,
ImmutableList<Path> confPaths,
- SpawnHelpers spawnHelpers) {
+ SpawnHelpers spawnHelpers,
+ String workspaceName) {
super(
buildRequest,
blazeDirs,
verboseFailures,
- buildRequest.getOptions(SandboxOptions.class));
+ buildRequest.getOptions(SandboxOptions.class),
+ workspaceName);
this.clientEnv = ImmutableMap.copyOf(clientEnv);
this.blazeDirs = blazeDirs;
- this.execRoot = blazeDirs.getExecRoot();
+ this.execRoot = blazeDirs.getExecRoot(workspaceName);
this.sandboxDebug = buildRequest.getOptions(SandboxOptions.class).sandboxDebug;
this.verboseFailures = verboseFailures;
this.productName = productName;
this.confPaths = confPaths;
this.spawnHelpers = spawnHelpers;
+ this.workspaceName = workspaceName;
}
public static DarwinSandboxedStrategy create(
@@ -105,7 +109,8 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
Map<String, String> clientEnv,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- String productName)
+ String productName,
+ String workspaceName)
throws IOException {
// On OS X, in addition to what is specified in $TMPDIR, two other temporary directories may be
// written to by processes. We have to get their location by calling "getconf".
@@ -125,7 +130,8 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
verboseFailures,
productName,
writablePaths.build(),
- new SpawnHelpers(blazeDirs.getExecRoot()));
+ new SpawnHelpers(blazeDirs.getExecRoot(workspaceName)),
+ workspaceName);
}
/**
@@ -328,8 +334,8 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
Path mount;
if (sourceFragment.isAbsolute()) {
mount = blazeDirs.getFileSystem().getPath(sourceFragment);
- } else if (blazeDirs.getExecRoot().getRelative(sourceFragment).exists()) {
- mount = blazeDirs.getExecRoot().getRelative(sourceFragment);
+ } else if (blazeDirs.getExecRoot(workspaceName).getRelative(sourceFragment).exists()) {
+ mount = blazeDirs.getExecRoot(workspaceName).getRelative(sourceFragment);
} else {
List<Path> searchPath =
SearchPath.parse(blazeDirs.getFileSystem(), clientEnv.get("PATH"));
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
index 71ff1fc482..65cbab9c0e 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
@@ -64,15 +64,17 @@ public class LinuxSandboxedStrategy extends SandboxStrategy {
BuildRequest buildRequest,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- String productName) {
+ String productName,
+ String workspaceName) {
super(
buildRequest,
blazeDirs,
verboseFailures,
- buildRequest.getOptions(SandboxOptions.class));
+ buildRequest.getOptions(SandboxOptions.class),
+ workspaceName);
this.sandboxOptions = buildRequest.getOptions(SandboxOptions.class);
this.blazeDirs = blazeDirs;
- this.execRoot = blazeDirs.getExecRoot();
+ this.execRoot = blazeDirs.getExecRoot(workspaceName);
this.verboseFailures = verboseFailures;
this.productName = productName;
}
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java
index f7b310a2fe..df05bb7551 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java
@@ -59,8 +59,11 @@ public class ProcessWrapperSandboxedStrategy extends SandboxStrategy {
BuildRequest buildRequest,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- String productName) {
- super(buildRequest, blazeDirs, verboseFailures, buildRequest.getOptions(SandboxOptions.class));
+ String productName,
+ String workspaceName) {
+ super(
+ buildRequest, blazeDirs, verboseFailures, buildRequest.getOptions(SandboxOptions.class),
+ workspaceName);
this.sandboxOptions = buildRequest.getOptions(SandboxOptions.class);
this.blazeDirs = blazeDirs;
this.execRoot = blazeDirs.getExecRoot();
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
index 26bf01ec69..caef3a34d6 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
@@ -54,7 +54,8 @@ final class SandboxActionContextProvider extends ActionContextProvider {
buildRequest,
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName()));
+ env.getRuntime().getProductName(),
+ env.getWorkspaceName()));
} else {
if (!buildRequest.getOptions(SandboxOptions.class).ignoreUnsupportedSandboxing) {
env.getReporter().handle(Event.warn(SANDBOX_NOT_SUPPORTED_MESSAGE));
@@ -64,7 +65,8 @@ final class SandboxActionContextProvider extends ActionContextProvider {
buildRequest,
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName()));
+ env.getRuntime().getProductName(),
+ env.getWorkspaceName()));
}
break;
case DARWIN:
@@ -75,7 +77,8 @@ final class SandboxActionContextProvider extends ActionContextProvider {
env.getClientEnv(),
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName()));
+ env.getRuntime().getProductName(),
+ env.getWorkspaceName()));
} else {
if (!buildRequest.getOptions(SandboxOptions.class).ignoreUnsupportedSandboxing) {
env.getReporter().handle(Event.warn(SANDBOX_NOT_SUPPORTED_MESSAGE));
@@ -88,7 +91,8 @@ final class SandboxActionContextProvider extends ActionContextProvider {
buildRequest,
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName()));
+ env.getRuntime().getProductName(),
+ env.getWorkspaceName()));
break;
default:
// No sandboxing available.
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java
index 80f0501afa..64533150bf 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java
@@ -62,9 +62,10 @@ abstract class SandboxStrategy implements SandboxedSpawnActionContext {
BuildRequest buildRequest,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- SandboxOptions sandboxOptions) {
+ SandboxOptions sandboxOptions,
+ String workspaceName) {
this.buildRequest = buildRequest;
- this.execRoot = blazeDirs.getExecRoot();
+ this.execRoot = blazeDirs.getExecRoot(workspaceName);
this.verboseFailures = verboseFailures;
this.sandboxOptions = sandboxOptions;
this.spawnInputExpander = new SpawnInputExpander(/*strict=*/false);
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
index d8bb0a7f58..5e1d3fc7b6 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
@@ -75,7 +75,7 @@ public final class SpawnHelpers {
targetDirectory,
manifestFile,
true,
- filesetContext.getWorkspaceName());
+ execRoot.getBaseName());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
index 3f18f8502b..71c5f0ac2c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
@@ -53,6 +53,12 @@ public class BuildConfigurationFunction implements SkyFunction {
@Override
public SkyValue compute(SkyKey skyKey, Environment env)
throws InterruptedException, BuildConfigurationFunctionException {
+ WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env
+ .getValue(WorkspaceNameValue.key());
+ if (workspaceNameValue == null) {
+ return null;
+ }
+
BuildConfigurationValue.Key key = (BuildConfigurationValue.Key) skyKey.argument();
Set<Fragment> fragments;
try {
@@ -70,7 +76,7 @@ public class BuildConfigurationFunction implements SkyFunction {
}
BuildConfiguration config = new BuildConfiguration(directories, fragmentsMap,
- key.getBuildOptions(), !key.actionsEnabled());
+ key.getBuildOptions(), !key.actionsEnabled(), workspaceNameValue.getName());
// Unlike static configurations, dynamic configurations don't need to embed transition logic
// within the configuration itself. However we still use this interface to provide a mapping
// between Transition types (e.g. HOST) and the dynamic transitions that apply those
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
index 1d5d2b36c5..73b28549dd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
@@ -60,7 +60,7 @@ public class BuildInfoCollectionFunction implements SkyFunction {
return null;
}
RepositoryName repositoryName = RepositoryName.createFromValidStrippedName(
- nameValue.maybeGetName());
+ nameValue.getName());
final ArtifactFactory factory = artifactFactory.get();
BuildInfoContext context = new BuildInfoContext() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java
index 7326fb1855..3c252f8886 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java
@@ -55,11 +55,17 @@ public class ConfigurationCollectionFunction implements SkyFunction {
@Override
public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException,
ConfigurationCollectionFunctionException {
+ WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env
+ .getValue(WorkspaceNameValue.key());
+ if (workspaceNameValue == null) {
+ return null;
+ }
ConfigurationCollectionKey collectionKey = (ConfigurationCollectionKey) skyKey.argument();
try {
BuildConfigurationCollection result = getConfigurations(env,
new SkyframePackageLoaderWithValueEnvironment(env, ruleClassProvider),
- collectionKey.getBuildOptions(), collectionKey.getMultiCpu());
+ collectionKey.getBuildOptions(), collectionKey.getMultiCpu(),
+ workspaceNameValue.getName());
// BuildConfigurationCollection can be created, but dependencies to some files might be
// missing. In that case we need to build configurationCollection again.
@@ -78,7 +84,8 @@ public class ConfigurationCollectionFunction implements SkyFunction {
Environment env,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- ImmutableSet<String> multiCpu)
+ ImmutableSet<String> multiCpu,
+ String repositoryName)
throws InvalidConfigurationException, InterruptedException {
// We cache all the related configurations for this target configuration in a cache that is
// dropped at the end of this method call. We instead rely on the cache for entire collections
@@ -91,7 +98,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
if (!multiCpu.isEmpty()) {
for (String cpu : multiCpu) {
BuildConfiguration targetConfiguration = createConfiguration(
- cache, env.getListener(), loadedPackageProvider, buildOptions, cpu);
+ cache, env.getListener(), loadedPackageProvider, buildOptions, cpu, repositoryName);
if (targetConfiguration == null || targetConfigurations.contains(targetConfiguration)) {
continue;
}
@@ -102,7 +109,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
}
} else {
BuildConfiguration targetConfiguration = createConfiguration(
- cache, env.getListener(), loadedPackageProvider, buildOptions, null);
+ cache, env.getListener(), loadedPackageProvider, buildOptions, null, repositoryName);
if (targetConfiguration == null) {
return null;
}
@@ -158,7 +165,8 @@ public class ConfigurationCollectionFunction implements SkyFunction {
ExtendedEventHandler originalEventListener,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- String cpuOverride)
+ String cpuOverride,
+ String repositoryName)
throws InvalidConfigurationException, InterruptedException {
ErrorSensingEventHandler eventHandler = new ErrorSensingEventHandler(originalEventListener);
if (cpuOverride != null) {
@@ -170,7 +178,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
}
BuildConfiguration targetConfig = configurationFactory.get().createConfigurations(
- cache, loadedPackageProvider, buildOptions, eventHandler);
+ cache, loadedPackageProvider, buildOptions, eventHandler, repositoryName);
if (targetConfig == null) {
return null;
}
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 1941489a77..370c69f595 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
@@ -453,13 +453,7 @@ public class PackageFunction implements SkyFunction {
if (workspaceNameValue == null) {
return null;
}
- String workspaceName = workspaceNameValue.maybeGetName();
- if (workspaceName == null) {
- throw new PackageFunctionException(
- new BuildFileContainsErrorsException(Label.EXTERNAL_PACKAGE_IDENTIFIER),
- Transience.PERSISTENT);
- }
-
+ String workspaceName = workspaceNameValue.getName();
RootedPath buildFileRootedPath = packageLookupValue.getRootedPath(packageId);
FileValue buildFileValue = null;
Path buildFilePath = buildFileRootedPath.asPath();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java
index f6dc151dfe..9284f5c2e9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java
@@ -14,9 +14,11 @@
package com.google.devtools.build.lib.skyframe;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.skyframe.SkyFunction;
+import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import javax.annotation.Nullable;
@@ -24,22 +26,24 @@ import javax.annotation.Nullable;
/**
* {@link SkyFunction} for {@link WorkspaceNameValue}s.
*
- * <p>All transitive errors (e.g. a symlink cycle encountered when consuming the WORKSPACE file)
- * result in a {@link NoSuchPackageException}.
+ * <p>All errors (e.g. parsing errors or a symlink cycle encountered when consuming the WORKSPACE
+ * file) result in a {@link NoSuchPackageException}.
*/
public class WorkspaceNameFunction implements SkyFunction {
@Override
@Nullable
- public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException {
+ public SkyValue compute(SkyKey skyKey, Environment env)
+ throws InterruptedException, WorkspaceNameFunctionException {
SkyKey externalPackageKey = PackageValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER);
PackageValue externalPackageValue = (PackageValue) env.getValue(externalPackageKey);
if (externalPackageValue == null) {
return null;
}
Package externalPackage = externalPackageValue.getPackage();
- return externalPackage.containsErrors()
- ? WorkspaceNameValue.withError()
- : WorkspaceNameValue.withName(externalPackage.getWorkspaceName());
+ if (externalPackage.containsErrors()) {
+ throw new WorkspaceNameFunctionException();
+ }
+ return WorkspaceNameValue.withName(externalPackage.getWorkspaceName());
}
@Override
@@ -47,4 +51,11 @@ public class WorkspaceNameFunction implements SkyFunction {
public String extractTag(SkyKey skyKey) {
return null;
}
+
+ private class WorkspaceNameFunctionException extends SkyFunctionException {
+ WorkspaceNameFunctionException() {
+ super(new BuildFileContainsErrorsException(Label.EXTERNAL_PACKAGE_IDENTIFIER),
+ Transience.PERSISTENT);
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java
index 1fccf6d4da..bbcebba5f4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java
@@ -17,7 +17,6 @@ import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import java.util.Objects;
-import javax.annotation.Nullable;
/**
* A value that solely represents the 'name' of a Bazel workspace, as defined in the WORKSPACE file.
@@ -30,20 +29,17 @@ import javax.annotation.Nullable;
public class WorkspaceNameValue implements SkyValue {
private static final SkyKey KEY =
SkyKey.create(SkyFunctions.WORKSPACE_NAME, DummyArgument.INSTANCE);
- private static final WorkspaceNameValue ERROR = new WorkspaceNameValue(null);
- @Nullable
private final String workspaceName;
- private WorkspaceNameValue(@Nullable String workspaceName) {
+ private WorkspaceNameValue(String workspaceName) {
this.workspaceName = workspaceName;
}
/**
- * Returns the name of the workspace, or {@code null} if there was an error in the WORKSPACE file.
+ * Returns the name of the workspace.
*/
- @Nullable
- public String maybeGetName() {
+ public String getName() {
return workspaceName;
}
@@ -52,11 +48,6 @@ public class WorkspaceNameValue implements SkyValue {
return KEY;
}
- /** Returns a {@link WorkspaceNameValue} for a workspace whose WORKSPACE file is in error. */
- public static WorkspaceNameValue withError() {
- return WorkspaceNameValue.ERROR;
- }
-
/** Returns a {@link WorkspaceNameValue} for a workspace with the given name. */
public static WorkspaceNameValue withName(String workspaceName) {
return new WorkspaceNameValue(Preconditions.checkNotNull(workspaceName));
@@ -83,7 +74,7 @@ public class WorkspaceNameValue implements SkyValue {
/** Singleton class used as the {@link SkyKey#argument} for {@link WorkspaceNameValue#key}. */
public static final class DummyArgument {
- public static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode();
+ static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode();
public static final DummyArgument INSTANCE = new DummyArgument();
private DummyArgument() {
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
index 8f2fda7acb..584f0867aa 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
@@ -36,7 +36,7 @@ final class WorkerActionContextProvider extends ActionContextProvider {
WorkerSpawnStrategy workerSpawnStrategy =
new WorkerSpawnStrategy(
- env.getDirectories(),
+ env.getExecRoot(),
workers,
buildRequest.getOptions(ExecutionOptions.class).verboseFailures,
maxRetries,
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java
index a81ef6eb52..a80f542ec8 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java
@@ -39,7 +39,6 @@ import com.google.devtools.build.lib.actions.SandboxedSpawnActionContext;
import com.google.devtools.build.lib.actions.Spawn;
import com.google.devtools.build.lib.actions.SpawnActionContext;
import com.google.devtools.build.lib.actions.UserExecException;
-import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.sandbox.SandboxHelpers;
@@ -184,7 +183,7 @@ public final class WorkerSpawnStrategy implements SandboxedSpawnActionContext {
private final boolean workerVerbose;
public WorkerSpawnStrategy(
- BlazeDirectories blazeDirs,
+ Path execRoot,
WorkerPool workers,
boolean verboseFailures,
int maxRetries,
@@ -192,7 +191,7 @@ public final class WorkerSpawnStrategy implements SandboxedSpawnActionContext {
Multimap<String, String> extraFlags) {
Preconditions.checkNotNull(workers);
this.workers = Preconditions.checkNotNull(workers);
- this.execRoot = blazeDirs.getExecRoot();
+ this.execRoot = execRoot;
this.verboseFailures = verboseFailures;
this.maxRetries = maxRetries;
this.workerVerbose = workerVerbose;