diff options
author | 2017-04-04 13:53:14 +0000 | |
---|---|---|
committer | 2017-04-04 18:38:24 +0200 | |
commit | c4134802dd15d6ef5cca6521f6bf6aac395ee2ad (patch) | |
tree | bcb3f28c5a4357f0089c2c71b738d63a748ef788 /src/main/java/com/google/devtools/build/lib | |
parent | 64f80799ed5c6369ffb6814f939a7964b0fa7c49 (diff) |
Automated g4 rollback of commit 1d9e1ac90197b1d3d7b137ba3c1ada67bb9ba31b.
*** Reason for rollback ***
Breaks //src/test/shell/integration:force_delete_output_test
*** Original change description ***
Symlink output directories to the correct directory name
If the workspace directory is /path/to/my/proj and the name in the WORKSPACE
file is "floop", this will symlink the output directories to
output_base/execroot/floop instead of output_base/execroot/proj.
More prep for #1262, fixes #1681.
PiperOrigin-RevId: 152126545
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
37 files changed, 172 insertions, 218 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 a814560d5d..859a8b6344 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,12 +137,14 @@ 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); } @@ -181,6 +183,10 @@ 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); @@ -188,7 +194,7 @@ public final class Root implements Comparable<Root>, Serializable { @Override public int hashCode() { - return Objects.hash(execRoot, path.hashCode()); + return Objects.hash(execRoot, path.hashCode(), isMainRepo); } @Override @@ -200,7 +206,8 @@ public final class Root implements Comparable<Root>, Serializable { return false; } Root r = (Root) o; - return path.equals(r.path) && Objects.equals(execRoot, r.execRoot); + return path.equals(r.path) && Objects.equals(execRoot, r.execRoot) + && Objects.equals(isMainRepo, r.isMainRepo); } @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 25e95947e0..48b746c655 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,7 +15,6 @@ 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; @@ -27,22 +26,14 @@ import java.util.Collection; */ public class AnalysisPhaseStartedEvent { - private final ImmutableSet<Target> targets; + private final Iterable<Label> labels; /** * Construct the event. * @param targets The set of active targets that remain. */ public AnalysisPhaseStartedEvent(Collection<Target> targets) { - this.targets = ImmutableSet.copyOf(targets); - } - - /** - * @return The set of active targets remaining, which is a subset - * of the targets we attempted to load. - */ - public Iterable<Label> getLabels() { - return Iterables.transform(targets, new Function<Target, Label>() { + this.labels = Iterables.transform(targets, new Function<Target, Label>() { @Override public Label apply(Target input) { return input.getLabel(); @@ -50,7 +41,11 @@ public class AnalysisPhaseStartedEvent { }); } - public ImmutableSet<Target> getTargets() { - return targets; + /** + * @return The set of active targets remaining, which is a subset + * of the targets we attempted to load. + */ + public Iterable<Label> getLabels() { + return labels; } } 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 ae209c9495..75ac3a0d53 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,7 +39,6 @@ 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 */ @@ -49,8 +48,7 @@ public interface ConfigurationCollectionFactory { Cache<String, BuildConfiguration> cache, PackageProviderForConfigurations loadedPackageProvider, BuildOptions buildOptions, - EventHandler errorEventListener, - String mainRepositoryName) + EventHandler errorEventListener) 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 7c9e921aa0..a54befb9e3 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.getRepository().strippedName(); + return rule.getPackage().getWorkspaceName(); } /** 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 2363624388..73cc667034 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,14 +37,12 @@ import java.io.IOException; */ public final class BinTools { private final BlazeDirectories directories; - private final Path execrootParent; + private final Path binDir; // the working bin directory under execRoot 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.execrootParent = directories.getExecRoot().getParentDirectory(); + this.binDir = directories.getExecRoot().getRelative("_bin"); 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. @@ -54,7 +52,6 @@ public final class BinTools { } } this.embeddedTools = builder.build(); - this.binDir = null; } /** @@ -72,8 +69,7 @@ public final class BinTools { */ @VisibleForTesting public static BinTools empty(BlazeDirectories directories) { - return new BinTools(directories, ImmutableList.<String>of()).setBinDir( - directories.getWorkspace().getBaseName()); + return new BinTools(directories, ImmutableList.<String>of()); } /** @@ -83,8 +79,7 @@ public final class BinTools { */ @VisibleForTesting public static BinTools forUnitTesting(BlazeDirectories directories, Iterable<String> tools) { - return new BinTools(directories, ImmutableList.copyOf(tools)).setBinDir( - directories.getWorkspace().getBaseName()); + return new BinTools(directories, ImmutableList.copyOf(tools)); } /** @@ -93,7 +88,7 @@ public final class BinTools { */ @VisibleForTesting public static BinTools forIntegrationTesting( - BlazeDirectories directories, String srcDir, Iterable<String> tools, String repositoryName) + BlazeDirectories directories, String srcDir, Iterable<String> tools) throws IOException { Path srcPath = directories.getOutputBase().getFileSystem().getPath(srcDir); for (String embedded : tools) { @@ -106,7 +101,7 @@ public final class BinTools { // much point in creating a symlink to a non-existent binary here. continue; } - Path outputPath = directories.getExecRoot(repositoryName).getChild("_bin").getChild(embedded); + Path outputPath = directories.getExecRoot().getChild("_bin").getChild(embedded); if (outputPath.exists()) { outputPath.delete(); } @@ -114,7 +109,7 @@ public final class BinTools { outputPath.createSymbolicLink(runfilesPath); } - return new BinTools(directories, ImmutableList.copyOf(tools)).setBinDir(repositoryName); + return new BinTools(directories, ImmutableList.copyOf(tools)); } private static void scanDirectoryRecursively( @@ -148,7 +143,6 @@ 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()); @@ -162,17 +156,11 @@ 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(String workspaceName) throws ExecException { - setBinDir(workspaceName); + public void setupBuildTools() throws ExecException { try { FileSystemUtils.createDirectoryAndParents(binDir); } catch (IOException e) { @@ -185,7 +173,6 @@ 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 60c0e207da..c38cfc2e5e 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 @@ -1037,7 +1037,6 @@ 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. @@ -1107,21 +1106,18 @@ public final class BuildConfiguration { } Root getRoot( - RepositoryName repositoryName, String outputDirName, BlazeDirectories directories, - String mainRepositoryName) { + RepositoryName repositoryName, String outputDirName, BlazeDirectories directories) { // e.g., execroot/repo1 - Path execRoot = directories.getExecRoot(mainRepositoryName); + Path execRoot = directories.getExecRoot(); // 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.strippedName().equals(mainRepositoryName))); + return INTERNER.intern(Root.middlemanRoot(execRoot, outputDir, repositoryName.isMain())); } // e.g., [[execroot/repo1]/bazel-out/config/bin] return INTERNER.intern( - Root.asDerivedRoot(execRoot, outputDir.getRelative(name), - repositoryName.strippedName().equals(mainRepositoryName))); + Root.asDerivedRoot(execRoot, outputDir.getRelative(name), repositoryName.isMain())); } } @@ -1336,8 +1332,7 @@ public final class BuildConfiguration { public BuildConfiguration(BlazeDirectories directories, Map<Class<? extends Fragment>, Fragment> fragmentsMap, BuildOptions buildOptions, - boolean actionsDisabled, - String repositoryName) { + boolean actionsDisabled) { this.directories = directories; this.actionsEnabled = !actionsDisabled; this.fragments = ImmutableSortedMap.copyOf(fragmentsMap, lexicalFragmentSorter); @@ -1346,7 +1341,6 @@ 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) { @@ -1416,8 +1410,8 @@ public final class BuildConfiguration { } BuildOptions options = buildOptions.trim( getOptionsClasses(fragmentsMap.keySet(), ruleClassProvider)); - BuildConfiguration newConfig = new BuildConfiguration( - directories, fragmentsMap, options, !actionsEnabled, mainRepositoryName); + BuildConfiguration newConfig = + new BuildConfiguration(directories, fragmentsMap, options, !actionsEnabled); newConfig.setConfigurationTransitions(this.transitions); return newConfig; } @@ -1993,8 +1987,7 @@ public final class BuildConfiguration { * Returns the output directory for this build configuration. */ public Root getOutputDirectory(RepositoryName repositoryName) { - return OutputDirectory.OUTPUT.getRoot( - repositoryName, outputDirName, directories, mainRepositoryName); + return OutputDirectory.OUTPUT.getRoot(repositoryName, outputDirName, directories); } /** @@ -2013,8 +2006,7 @@ public final class BuildConfiguration { * repositories (external) but will need to be fixed. */ public Root getBinDirectory(RepositoryName repositoryName) { - return OutputDirectory.BIN.getRoot( - repositoryName, outputDirName, directories, mainRepositoryName); + return OutputDirectory.BIN.getRoot(repositoryName, outputDirName, directories); } /** @@ -2028,8 +2020,7 @@ public final class BuildConfiguration { * Returns the include directory for this build configuration. */ public Root getIncludeDirectory(RepositoryName repositoryName) { - return OutputDirectory.INCLUDE.getRoot( - repositoryName, outputDirName, directories, mainRepositoryName); + return OutputDirectory.INCLUDE.getRoot(repositoryName, outputDirName, directories); } /** @@ -2042,8 +2033,7 @@ public final class BuildConfiguration { } public Root getGenfilesDirectory(RepositoryName repositoryName) { - return OutputDirectory.GENFILES.getRoot( - repositoryName, outputDirName, directories, mainRepositoryName); + return OutputDirectory.GENFILES.getRoot(repositoryName, outputDirName, directories); } /** @@ -2052,16 +2042,14 @@ public final class BuildConfiguration { * needed for Jacoco's coverage reporting tools. */ public Root getCoverageMetadataDirectory(RepositoryName repositoryName) { - return OutputDirectory.COVERAGE.getRoot( - repositoryName, outputDirName, directories, mainRepositoryName); + return OutputDirectory.COVERAGE.getRoot(repositoryName, outputDirName, directories); } /** * Returns the testlogs directory for this build configuration. */ public Root getTestLogsDirectory(RepositoryName repositoryName) { - return OutputDirectory.TESTLOGS.getRoot( - repositoryName, outputDirName, directories, mainRepositoryName); + return OutputDirectory.TESTLOGS.getRoot(repositoryName, outputDirName, directories); } /** @@ -2088,8 +2076,7 @@ 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, mainRepositoryName); + return OutputDirectory.MIDDLEMAN.getRoot(repositoryName, outputDirName, directories); } public boolean getAllowRuntimeDepsOnNeverLink() { @@ -2104,10 +2091,6 @@ 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 2478d404d8..595f5271d2 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,11 +69,10 @@ public final class ConfigurationFactory { Cache<String, BuildConfiguration> cache, PackageProviderForConfigurations loadedPackageProvider, BuildOptions buildOptions, - EventHandler errorEventListener, - String mainRepositoryName) + EventHandler errorEventListener) throws InvalidConfigurationException, InterruptedException { return configurationCollectionFactory.createConfigurations(this, cache, - loadedPackageProvider, buildOptions, errorEventListener, mainRepositoryName); + loadedPackageProvider, buildOptions, errorEventListener); } /** @@ -87,8 +86,7 @@ public final class ConfigurationFactory { PackageProviderForConfigurations loadedPackageProvider, BuildOptions buildOptions, boolean actionsDisabled, - Cache<String, BuildConfiguration> cache, - String repositoryName) + Cache<String, BuildConfiguration> cache) throws InvalidConfigurationException, InterruptedException { String cacheKey = buildOptions.computeCacheKey(); @@ -111,8 +109,7 @@ public final class ConfigurationFactory { return null; } - result = new BuildConfiguration(directories, fragments, buildOptions, actionsDisabled, - repositoryName); + result = new BuildConfiguration(directories, fragments, buildOptions, actionsDisabled); 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 8a5e781c16..696f581150 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,12 +57,11 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact Cache<String, BuildConfiguration> cache, PackageProviderForConfigurations packageProvider, BuildOptions buildOptions, - EventHandler eventHandler, - String mainRepositoryName) + EventHandler eventHandler) throws InvalidConfigurationException, InterruptedException { // Target configuration BuildConfiguration targetConfiguration = configurationFactory.getConfiguration( - packageProvider, buildOptions, false, cache, mainRepositoryName); + packageProvider, buildOptions, false, cache); if (targetConfiguration == null) { return null; } @@ -73,7 +72,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, mainRepositoryName); + packageProvider, dataConfiguration, buildOptions, cache); if (hostConfiguration == null) { return null; } @@ -83,7 +82,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, mainRepositoryName); + packageProvider, splitOptions, false, cache); splitTransitionsTable.put(transition, splitConfig); } } @@ -157,16 +156,14 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact PackageProviderForConfigurations loadedPackageProvider, BuildConfiguration requestConfig, BuildOptions buildOptions, - Cache<String, BuildConfiguration> cache, - String repositoryName) + Cache<String, BuildConfiguration> cache) 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, - repositoryName); + loadedPackageProvider, buildOptions.createHostOptions(false), false, cache); 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 89778536da..a913927f8f 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(new PathFragment(Label.EXTERNAL_PATH_PREFIX)); + return !path.startsWith(Label.EXTERNAL_PACKAGE_NAME); } 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_PATH_PREFIX).normalize().toString(); + zipRunfilesPath = path.relativeTo(Label.EXTERNAL_PACKAGE_NAME).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 a516a53e98..a45a907e30 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,6 +141,12 @@ 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()) { @@ -160,11 +166,6 @@ 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 7e11859c38..59e447eecd 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,6 +184,7 @@ 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(); @@ -332,7 +333,7 @@ public class ExecutionTool { TopLevelArtifactContext topLevelArtifactContext) throws BuildFailedException, InterruptedException, TestExecException, AbruptExitException { Stopwatch timer = Stopwatch.createStarted(); - prepare(packageRoots); + prepare(packageRoots, analysisResult.getWorkspaceName()); ActionGraph actionGraph = analysisResult.getActionGraph(); @@ -346,7 +347,7 @@ public class ExecutionTool { request.getBuildOptions().finalizeActions); } else { // TODO(bazel-team): this could be just another OutputService - startLocalOutputBuild(); + startLocalOutputBuild(analysisResult.getWorkspaceName()); } List<BuildConfiguration> targetConfigurations = configurations.getTargetConfigurations(); @@ -354,9 +355,10 @@ public class ExecutionTool { ? targetConfigurations.get(0) : null; if (targetConfigurations.size() == 1) { String productName = runtime.getProductName(); - String workspaceName = env.getWorkspaceName(); + String dirName = env.getWorkspaceName(); + String workspaceName = analysisResult.getWorkspaceName(); OutputDirectoryLinksUtils.createOutputDirectoryLinks( - workspaceName, env.getWorkspace(), env.getDirectories().getExecRoot(workspaceName), + dirName, env.getWorkspace(), env.getDirectories().getExecRoot(workspaceName), env.getDirectories().getOutputPath(workspaceName), getReporter(), targetConfiguration, request.getBuildOptions().getSymlinkPrefix(productName), productName); } @@ -489,7 +491,7 @@ public class ExecutionTool { } } - private void prepare(ImmutableMap<PackageIdentifier, Path> packageRoots) + private void prepare(ImmutableMap<PackageIdentifier, Path> packageRoots, String workspaceName) throws ExecutorInitException { // Prepare for build. Profiler.instance().markPhase(ProfilePhase.PREPARE); @@ -500,7 +502,7 @@ public class ExecutionTool { // Plant the symlink forest. try { new SymlinkForest( - packageRoots, getExecRoot(), runtime.getProductName(), env.getWorkspaceName()) + packageRoots, getExecRoot(), runtime.getProductName(), workspaceName) .plantSymlinkForest(); } catch (IOException e) { throw new ExecutorInitException("Source forest creation failed", e); @@ -509,7 +511,7 @@ public class ExecutionTool { private void createToolsSymlinks() throws ExecutorInitException { try { - env.getBlazeWorkspace().getBinTools().setupBuildTools(env.getWorkspaceName()); + env.getBlazeWorkspace().getBinTools().setupBuildTools(); } catch (ExecException e) { throw new ExecutorInitException("Tools symlink creation failed", e); } @@ -530,9 +532,9 @@ public class ExecutionTool { /** * Prepare for a local output build. */ - private void startLocalOutputBuild() throws ExecutorInitException { + private void startLocalOutputBuild(String workspaceName) throws ExecutorInitException { try (AutoProfiler p = AutoProfiler.profiled("Starting local output build", ProfilerTask.INFO)) { - Path outputPath = env.getDirectories().getOutputPath(env.getWorkspaceName()); + Path outputPath = env.getDirectories().getOutputPath(workspaceName); 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 838f3bad1e..0ae420a20c 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,16 +78,15 @@ public class OutputDirectoryLinksUtils { } // Points to execroot - createLink(workspace, execRootSymlink( - symlinkPrefix, workspace.getBaseName()), execRoot, failures); - RepositoryName repositoryName = RepositoryName.createFromValidStrippedName(workspaceName); + createLink(workspace, execRootSymlink(symlinkPrefix, workspaceName), execRoot, failures); + if (targetConfig != null) { createLink(workspace, symlinkPrefix + "bin", - targetConfig.getBinDirectory(repositoryName).getPath(), failures); + targetConfig.getBinDirectory(RepositoryName.MAIN).getPath(), failures); createLink(workspace, symlinkPrefix + "testlogs", - targetConfig.getTestLogsDirectory(repositoryName).getPath(), failures); + targetConfig.getTestLogsDirectory(RepositoryName.MAIN).getPath(), failures); createLink(workspace, symlinkPrefix + "genfiles", - targetConfig.getGenfilesDirectory(repositoryName).getPath(), failures); + targetConfig.getGenfilesDirectory(RepositoryName.MAIN).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 246ff07550..0a9bd9c82e 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 @@ -728,6 +728,6 @@ public final class Rule implements Target, DependencyFilter.AttributeInfoProvide * @return The repository name. */ public RepositoryName getRepository() { - return RepositoryName.createFromValidStrippedName(pkg.getWorkspaceName()); + return getLabel().getPackageIdentifier().getRepository(); } } 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 0e5f0e4c1b..abe66c67bb 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,6 +141,8 @@ 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 d4c838969e..4a1cbe2a18 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,7 +16,6 @@ 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; @@ -47,13 +46,12 @@ 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; } - Path execRoot = blazeDirectories.getExecRoot(workspaceNameValue.getName()); + // TODO(kchodorow): create a SkyFunction to get the main repository name and pass it in here. + Path execRoot = blazeDirectories.getExecRoot(); 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 57bf9fa505..8b6015d9da 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,6 +23,7 @@ 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; @@ -92,9 +93,9 @@ public class TestResult { /** * @return Coverage data artifact, if available and null otherwise. */ - public Path getCoverageData() { + public PathFragment getCoverageData() { if (data.getHasCoverage()) { - return testAction.getCoverageData().getPath(); + return testAction.getCoverageData().getExecPath(); } 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 3246f2fe26..98c56c48c8 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,6 +150,15 @@ 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 00a69dc5d0..0014eac0be 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 @@ -92,7 +92,6 @@ public final class CommandEnvironment { private long commandStartTime; private OutputService outputService; private Path workingDirectory; - private String workspaceName; private String commandName; private OptionsProvider options; @@ -145,7 +144,6 @@ 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); } @@ -295,14 +293,13 @@ public final class CommandEnvironment { } public String getWorkspaceName() { - Preconditions.checkNotNull(workspaceName); - return workspaceName; + Path workspace = getDirectories().getWorkspace(); + if (workspace == null) { + return ""; + } + return workspace.getBaseName(); } - 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. */ @@ -325,8 +322,7 @@ public final class CommandEnvironment { * build reside. */ public Path getExecRoot() { - Preconditions.checkNotNull(workspaceName); - return getDirectories().getExecRoot(workspaceName); + return getDirectories().getExecRoot(); } /** 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 d23b7e5b5a..8206527d4f 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,7 +30,9 @@ 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; @@ -43,6 +45,7 @@ import java.util.Set; */ @ThreadCompatible public class TestResultAnalyzer { + private final Path execRoot; private final TestSummaryOptions summaryOptions; private final ExecutionOptions executionOptions; private final EventBus eventBus; @@ -56,9 +59,11 @@ public class TestResultAnalyzer { * @param executionOptions Parsed build/test execution options. * @param eventBus For reporting failed to build and cached tests. */ - public TestResultAnalyzer(TestSummaryOptions summaryOptions, + public TestResultAnalyzer(Path execRoot, + TestSummaryOptions summaryOptions, ExecutionOptions executionOptions, EventBus eventBus) { + this.execRoot = execRoot; this.summaryOptions = summaryOptions; this.executionOptions = executionOptions; this.eventBus = eventBus; @@ -206,9 +211,10 @@ public class TestResultAnalyzer { numLocalActionCached++; } - Path coverageData = result.getCoverageData(); + PathFragment coverageData = result.getCoverageData(); if (coverageData != null) { - summaryBuilder.addCoverageFiles(Collections.singletonList(coverageData)); + summaryBuilder.addCoverageFiles( + Collections.singletonList(execRoot.getRelative(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 2a92e42cbb..368529e804 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,7 +202,6 @@ 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 +224,8 @@ public final class CleanCommand implements BlazeCommand { env.getBlazeWorkspace().clearCaches(); // 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[] {workspaceDirectory, "execroot"}) { + for (String directory : new String[] { + env.getWorkspaceName(), "execroot/" + env.getWorkspaceName() }) { Path child = outputBase.getRelative(directory); if (child.exists()) { LOG.finest("Cleaning " + child + (cleanOptions.async ? " asynchronously..." : "")); @@ -239,8 +239,8 @@ public final class CleanCommand implements BlazeCommand { } // remove convenience links OutputDirectoryLinksUtils.removeOutputDirectoryLinks( - workspaceDirectory, env.getWorkspace(), env.getReporter(), - symlinkPrefix, env.getRuntime().getProductName()); + env.getWorkspaceName(), 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 bf47b1487d..3f0ba6202f 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.getDirectories().getExecRoot()); + return print(env.getRuntime().getWorkspace().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 bbc7a02c4d..970cb5c007 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.getWorkspace().getBaseName(), + env.getWorkspaceName(), 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.getWorkspace().getBaseName(), opts.vfsStatsLimit > 0)); + phase, info, env.getWorkspaceName(), 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 94b71d8df3..cd31c7d396 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,6 +85,7 @@ 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 bb529e9a16..2eff7c45cc 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,7 +76,6 @@ 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, @@ -85,23 +84,20 @@ public class DarwinSandboxedStrategy extends SandboxStrategy { boolean verboseFailures, String productName, ImmutableList<Path> confPaths, - SpawnHelpers spawnHelpers, - String workspaceName) { + SpawnHelpers spawnHelpers) { super( buildRequest, blazeDirs, verboseFailures, - buildRequest.getOptions(SandboxOptions.class), - workspaceName); + buildRequest.getOptions(SandboxOptions.class)); this.clientEnv = ImmutableMap.copyOf(clientEnv); this.blazeDirs = blazeDirs; - this.execRoot = blazeDirs.getExecRoot(workspaceName); + this.execRoot = blazeDirs.getExecRoot(); 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( @@ -109,8 +105,7 @@ public class DarwinSandboxedStrategy extends SandboxStrategy { Map<String, String> clientEnv, BlazeDirectories blazeDirs, boolean verboseFailures, - String productName, - String workspaceName) + String productName) 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". @@ -130,8 +125,7 @@ public class DarwinSandboxedStrategy extends SandboxStrategy { verboseFailures, productName, writablePaths.build(), - new SpawnHelpers(blazeDirs.getExecRoot(workspaceName)), - workspaceName); + new SpawnHelpers(blazeDirs.getExecRoot())); } /** @@ -334,8 +328,8 @@ public class DarwinSandboxedStrategy extends SandboxStrategy { Path mount; if (sourceFragment.isAbsolute()) { mount = blazeDirs.getFileSystem().getPath(sourceFragment); - } else if (blazeDirs.getExecRoot(workspaceName).getRelative(sourceFragment).exists()) { - mount = blazeDirs.getExecRoot(workspaceName).getRelative(sourceFragment); + } else if (blazeDirs.getExecRoot().getRelative(sourceFragment).exists()) { + mount = blazeDirs.getExecRoot().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 65cbab9c0e..71ff1fc482 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,17 +64,15 @@ public class LinuxSandboxedStrategy extends SandboxStrategy { BuildRequest buildRequest, BlazeDirectories blazeDirs, boolean verboseFailures, - String productName, - String workspaceName) { + String productName) { super( buildRequest, blazeDirs, verboseFailures, - buildRequest.getOptions(SandboxOptions.class), - workspaceName); + buildRequest.getOptions(SandboxOptions.class)); this.sandboxOptions = buildRequest.getOptions(SandboxOptions.class); this.blazeDirs = blazeDirs; - this.execRoot = blazeDirs.getExecRoot(workspaceName); + this.execRoot = blazeDirs.getExecRoot(); 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 df05bb7551..f7b310a2fe 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,11 +59,8 @@ public class ProcessWrapperSandboxedStrategy extends SandboxStrategy { BuildRequest buildRequest, BlazeDirectories blazeDirs, boolean verboseFailures, - String productName, - String workspaceName) { - super( - buildRequest, blazeDirs, verboseFailures, buildRequest.getOptions(SandboxOptions.class), - workspaceName); + String productName) { + super(buildRequest, blazeDirs, verboseFailures, buildRequest.getOptions(SandboxOptions.class)); 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 caef3a34d6..26bf01ec69 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,8 +54,7 @@ final class SandboxActionContextProvider extends ActionContextProvider { buildRequest, env.getDirectories(), verboseFailures, - env.getRuntime().getProductName(), - env.getWorkspaceName())); + env.getRuntime().getProductName())); } else { if (!buildRequest.getOptions(SandboxOptions.class).ignoreUnsupportedSandboxing) { env.getReporter().handle(Event.warn(SANDBOX_NOT_SUPPORTED_MESSAGE)); @@ -65,8 +64,7 @@ final class SandboxActionContextProvider extends ActionContextProvider { buildRequest, env.getDirectories(), verboseFailures, - env.getRuntime().getProductName(), - env.getWorkspaceName())); + env.getRuntime().getProductName())); } break; case DARWIN: @@ -77,8 +75,7 @@ final class SandboxActionContextProvider extends ActionContextProvider { env.getClientEnv(), env.getDirectories(), verboseFailures, - env.getRuntime().getProductName(), - env.getWorkspaceName())); + env.getRuntime().getProductName())); } else { if (!buildRequest.getOptions(SandboxOptions.class).ignoreUnsupportedSandboxing) { env.getReporter().handle(Event.warn(SANDBOX_NOT_SUPPORTED_MESSAGE)); @@ -91,8 +88,7 @@ final class SandboxActionContextProvider extends ActionContextProvider { buildRequest, env.getDirectories(), verboseFailures, - env.getRuntime().getProductName(), - env.getWorkspaceName())); + env.getRuntime().getProductName())); 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 64533150bf..80f0501afa 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,10 +62,9 @@ abstract class SandboxStrategy implements SandboxedSpawnActionContext { BuildRequest buildRequest, BlazeDirectories blazeDirs, boolean verboseFailures, - SandboxOptions sandboxOptions, - String workspaceName) { + SandboxOptions sandboxOptions) { this.buildRequest = buildRequest; - this.execRoot = blazeDirs.getExecRoot(workspaceName); + this.execRoot = blazeDirs.getExecRoot(); 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 5e1d3fc7b6..d8bb0a7f58 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, - execRoot.getBaseName()); + filesetContext.getWorkspaceName()); } } 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 71c5f0ac2c..3f18f8502b 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,12 +53,6 @@ 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 { @@ -76,7 +70,7 @@ public class BuildConfigurationFunction implements SkyFunction { } BuildConfiguration config = new BuildConfiguration(directories, fragmentsMap, - key.getBuildOptions(), !key.actionsEnabled(), workspaceNameValue.getName()); + key.getBuildOptions(), !key.actionsEnabled()); // 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 79011a82a9..4e91031903 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 @@ -64,7 +64,7 @@ public class BuildInfoCollectionFunction implements SkyFunction { return null; } RepositoryName repositoryName = RepositoryName.createFromValidStrippedName( - nameValue.getName()); + nameValue.maybeGetName()); 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 3c252f8886..7326fb1855 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,17 +55,11 @@ 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(), - workspaceNameValue.getName()); + collectionKey.getBuildOptions(), collectionKey.getMultiCpu()); // BuildConfigurationCollection can be created, but dependencies to some files might be // missing. In that case we need to build configurationCollection again. @@ -84,8 +78,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { Environment env, PackageProviderForConfigurations loadedPackageProvider, BuildOptions buildOptions, - ImmutableSet<String> multiCpu, - String repositoryName) + ImmutableSet<String> multiCpu) 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 @@ -98,7 +91,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { if (!multiCpu.isEmpty()) { for (String cpu : multiCpu) { BuildConfiguration targetConfiguration = createConfiguration( - cache, env.getListener(), loadedPackageProvider, buildOptions, cpu, repositoryName); + cache, env.getListener(), loadedPackageProvider, buildOptions, cpu); if (targetConfiguration == null || targetConfigurations.contains(targetConfiguration)) { continue; } @@ -109,7 +102,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { } } else { BuildConfiguration targetConfiguration = createConfiguration( - cache, env.getListener(), loadedPackageProvider, buildOptions, null, repositoryName); + cache, env.getListener(), loadedPackageProvider, buildOptions, null); if (targetConfiguration == null) { return null; } @@ -165,8 +158,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { ExtendedEventHandler originalEventListener, PackageProviderForConfigurations loadedPackageProvider, BuildOptions buildOptions, - String cpuOverride, - String repositoryName) + String cpuOverride) throws InvalidConfigurationException, InterruptedException { ErrorSensingEventHandler eventHandler = new ErrorSensingEventHandler(originalEventListener); if (cpuOverride != null) { @@ -178,7 +170,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { } BuildConfiguration targetConfig = configurationFactory.get().createConfigurations( - cache, loadedPackageProvider, buildOptions, eventHandler, repositoryName); + cache, loadedPackageProvider, buildOptions, eventHandler); 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 370c69f595..1941489a77 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,7 +453,13 @@ public class PackageFunction implements SkyFunction { if (workspaceNameValue == null) { return null; } - String workspaceName = workspaceNameValue.getName(); + String workspaceName = workspaceNameValue.maybeGetName(); + if (workspaceName == null) { + throw new PackageFunctionException( + new BuildFileContainsErrorsException(Label.EXTERNAL_PACKAGE_IDENTIFIER), + Transience.PERSISTENT); + } + 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 9284f5c2e9..f6dc151dfe 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,11 +14,9 @@ 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; @@ -26,24 +24,22 @@ import javax.annotation.Nullable; /** * {@link SkyFunction} for {@link WorkspaceNameValue}s. * - * <p>All errors (e.g. parsing errors or a symlink cycle encountered when consuming the WORKSPACE - * file) result in a {@link NoSuchPackageException}. + * <p>All transitive errors (e.g. 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, WorkspaceNameFunctionException { + public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException { SkyKey externalPackageKey = PackageValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER); PackageValue externalPackageValue = (PackageValue) env.getValue(externalPackageKey); if (externalPackageValue == null) { return null; } Package externalPackage = externalPackageValue.getPackage(); - if (externalPackage.containsErrors()) { - throw new WorkspaceNameFunctionException(); - } - return WorkspaceNameValue.withName(externalPackage.getWorkspaceName()); + return externalPackage.containsErrors() + ? WorkspaceNameValue.withError() + : WorkspaceNameValue.withName(externalPackage.getWorkspaceName()); } @Override @@ -51,11 +47,4 @@ 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 bbcebba5f4..1fccf6d4da 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,6 +17,7 @@ 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. @@ -29,17 +30,20 @@ import java.util.Objects; 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(String workspaceName) { + private WorkspaceNameValue(@Nullable String workspaceName) { this.workspaceName = workspaceName; } /** - * Returns the name of the workspace. + * Returns the name of the workspace, or {@code null} if there was an error in the WORKSPACE file. */ - public String getName() { + @Nullable + public String maybeGetName() { return workspaceName; } @@ -48,6 +52,11 @@ 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)); @@ -74,7 +83,7 @@ public class WorkspaceNameValue implements SkyValue { /** Singleton class used as the {@link SkyKey#argument} for {@link WorkspaceNameValue#key}. */ public static final class DummyArgument { - static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode(); + public 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 584f0867aa..8f2fda7acb 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.getExecRoot(), + env.getDirectories(), 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 a80f542ec8..a81ef6eb52 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,6 +39,7 @@ 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; @@ -183,7 +184,7 @@ public final class WorkerSpawnStrategy implements SandboxedSpawnActionContext { private final boolean workerVerbose; public WorkerSpawnStrategy( - Path execRoot, + BlazeDirectories blazeDirs, WorkerPool workers, boolean verboseFailures, int maxRetries, @@ -191,7 +192,7 @@ public final class WorkerSpawnStrategy implements SandboxedSpawnActionContext { Multimap<String, String> extraFlags) { Preconditions.checkNotNull(workers); this.workers = Preconditions.checkNotNull(workers); - this.execRoot = execRoot; + this.execRoot = blazeDirs.getExecRoot(); this.verboseFailures = verboseFailures; this.maxRetries = maxRetries; this.workerVerbose = workerVerbose; |