diff options
Diffstat (limited to 'src')
46 files changed, 248 insertions, 193 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; diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java index 0410e5ce50..5f58462fc6 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Executor; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.exec.util.TestExecutorBuilder; +import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import org.junit.Before; @@ -47,7 +48,8 @@ public class SymlinkActionTest extends BuildViewTestCase { public final void setUp() throws Exception { input = scratch.file("input.txt", "Hello, world."); inputArtifact = getSourceArtifact("input.txt"); - Path linkedInput = directories.getExecRoot().getRelative("input.txt"); + Path linkedInput = + directories.getExecRoot(TestConstants.WORKSPACE_NAME).getRelative("input.txt"); FileSystemUtils.createDirectoryAndParents(linkedInput.getParentDirectory()); linkedInput.createSymbolicLink(input); outputArtifact = getBinArtifactWithNoOwner("destination.txt"); diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java index 6e7d1064b6..88f8f4a4aa 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java @@ -51,7 +51,8 @@ public class BuildConfigurationTest extends ConfigurationTestCase { BuildConfiguration config = create("--cpu=piii"); String outputDirPrefix = outputBase - + "/workspace/blaze-out/gcc-4.4.0-glibc-2.3.6-grte-piii-fastbuild"; + + "/" + config.getMainRepositoryName() + + "/blaze-out/gcc-4.4.0-glibc-2.3.6-grte-piii-fastbuild"; assertEquals(outputDirPrefix, config.getOutputDirectory(RepositoryName.MAIN).getPath().toString()); @@ -72,7 +73,8 @@ public class BuildConfigurationTest extends ConfigurationTestCase { } BuildConfiguration config = create("--platform_suffix=-test"); - assertEquals(outputBase + "/workspace/blaze-out/gcc-4.4.0-glibc-2.3.6-grte-k8-fastbuild-test", + assertEquals(outputBase + "/" + config.getMainRepositoryName() + + "/blaze-out/gcc-4.4.0-glibc-2.3.6-grte-k8-fastbuild-test", config.getOutputDirectory(RepositoryName.MAIN).getPath().toString()); } diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java b/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java index 698a860e3d..23e678297b 100644 --- a/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java +++ b/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.exec.ExecutionOptions; import com.google.devtools.build.lib.exec.FileWriteStrategy; import com.google.devtools.build.lib.exec.SymlinkTreeStrategy; import com.google.devtools.build.lib.runtime.CommonCommandOptions; +import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.util.BlazeClock; import com.google.devtools.common.options.OptionsBase; import com.google.devtools.common.options.OptionsParser; @@ -96,7 +97,7 @@ public class TestExecutorBuilder { public BlazeExecutor build() throws ExecutorInitException { return new BlazeExecutor( - directories.getExecRoot(), + directories.getExecRoot(TestConstants.WORKSPACE_NAME), reporter, bus, BlazeClock.instance(), diff --git a/src/test/java/com/google/devtools/build/lib/integration/util/IntegrationMock.java b/src/test/java/com/google/devtools/build/lib/integration/util/IntegrationMock.java index 5b497450b3..32f5e2701f 100644 --- a/src/test/java/com/google/devtools/build/lib/integration/util/IntegrationMock.java +++ b/src/test/java/com/google/devtools/build/lib/integration/util/IntegrationMock.java @@ -36,7 +36,8 @@ public class IntegrationMock { * Populates the _embedded_binaries/ directory, containing all binaries/libraries, by symlinking * directories#getEmbeddedBinariesRoot() to the test's runfiles tree. */ - public BinTools getIntegrationBinTools(BlazeDirectories directories) throws IOException { + public BinTools getIntegrationBinTools(BlazeDirectories directories, String workspaceName) + throws IOException { Path embeddedDir = directories.getEmbeddedBinariesRoot(); FileSystemUtils.createDirectoryAndParents(embeddedDir); @@ -61,6 +62,6 @@ public class IntegrationMock { } return BinTools.forIntegrationTesting( - directories, embeddedDir.toString(), TestConstants.EMBEDDED_TOOLS); + directories, embeddedDir.toString(), TestConstants.EMBEDDED_TOOLS, workspaceName); } } diff --git a/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java index 7e2baafc3b..c1a104d599 100644 --- a/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java +++ b/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java @@ -30,11 +30,9 @@ import com.google.devtools.build.lib.rules.test.TestRunnerAction; import com.google.devtools.build.lib.runtime.TerminalTestResultNotifier.TestSummaryOptions; import com.google.devtools.build.lib.testutil.Suite; import com.google.devtools.build.lib.testutil.TestSpec; -import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus; import com.google.devtools.build.lib.view.test.TestStatus.TestResultData; import com.google.devtools.common.options.OptionsParser; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,12 +46,10 @@ public class TestResultAnalyzerTest { @Before public final void createMocks() throws Exception { - Path mockPath = mock(Path.class); OptionsParser testSpecificOptions = OptionsParser.newOptionsParser( TestSummaryOptions.class, ExecutionOptions.class); EventBus mockBus = mock(EventBus.class); underTest = new TestResultAnalyzer( - mockPath, testSpecificOptions.getOptions(TestSummaryOptions.class), testSpecificOptions.getOptions(ExecutionOptions.class), mockBus); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunctionTest.java index fbb1e644ef..e93669cdc2 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunctionTest.java @@ -55,8 +55,9 @@ public class WorkspaceNameFunctionTest extends BuildViewTestCase { reporter.removeHandler(failFastHandler); scratch.overwriteFile("WORKSPACE", "workspace(bad)"); assertThatEvaluationResult(eval()) - .hasEntryThat(key) - .isEqualTo(WorkspaceNameValue.withError()); + .hasErrorEntryForKeyThat(key) + .hasExceptionThat() + .isInstanceOf(NoSuchPackageException.class); assertContainsEvent("name 'bad' is not defined"); } @@ -77,9 +78,6 @@ public class WorkspaceNameFunctionTest extends BuildViewTestCase { public void testEqualsAndHashCode(){ new EqualsTester() .addEqualityGroup( - WorkspaceNameValue.withError(), - WorkspaceNameValue.withError()) - .addEqualityGroup( WorkspaceNameValue.withName("foo"), WorkspaceNameValue.withName("foo")) .addEqualityGroup( diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java index 5a31671b2d..720cb12654 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java @@ -730,7 +730,7 @@ public class SkylarkRuleContextTest extends SkylarkTestCase { assertThat(ruleClassProvider.getRunfilesPrefix()).isNotEmpty(); SkylarkRuleContext ruleContext = createRuleContext("//foo:foo"); Object result = evalRuleContextCode(ruleContext, "ruleContext.workspace_name"); - assertSame(result, ruleClassProvider.getRunfilesPrefix()); + assertEquals(result, ruleClassProvider.getRunfilesPrefix()); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java index 10e76cd33d..a78c662c3b 100644 --- a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java +++ b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java @@ -40,6 +40,7 @@ import com.google.devtools.build.lib.exec.ExecutionOptions; import com.google.devtools.build.lib.exec.SingleBuildFileCache; import com.google.devtools.build.lib.integration.util.IntegrationMock; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.testutil.TestFileOutErr; import com.google.devtools.build.lib.testutil.TestUtils; import com.google.devtools.build.lib.util.BlazeClock; @@ -92,7 +93,7 @@ public class StandaloneSpawnStrategyTest { BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, workspaceDir, "mock-product-name"); // This call implicitly symlinks the integration bin tools into the exec root. - IntegrationMock.get().getIntegrationBinTools(directories); + IntegrationMock.get().getIntegrationBinTools(directories, TestConstants.WORKSPACE_NAME); OptionsParser optionsParser = OptionsParser.newOptionsParser(ExecutionOptions.class); optionsParser.parse("--verbose_failures"); @@ -101,9 +102,10 @@ public class StandaloneSpawnStrategyTest { ResourceManager resourceManager = ResourceManager.instanceForTestingOnly(); resourceManager.setAvailableResources( ResourceSet.create(/*memoryMb=*/1, /*cpuUsage=*/1, /*ioUsage=*/1, /*localTestCount=*/1)); + Path execRoot = directories.getExecRoot(TestConstants.WORKSPACE_NAME); this.executor = new BlazeExecutor( - directories.getExecRoot(), + execRoot, reporter, bus, BlazeClock.instance(), @@ -112,7 +114,7 @@ public class StandaloneSpawnStrategyTest { ImmutableMap.<String, SpawnActionContext>of( "", new StandaloneSpawnStrategy( - directories.getExecRoot(), false, "mock-product-name", resourceManager)), + execRoot, false, "mock-product-name", resourceManager)), ImmutableList.<ActionContextProvider>of()); executor.getExecRoot().createDirectory(); diff --git a/src/test/shell/integration/runfiles_test.sh b/src/test/shell/integration/runfiles_test.sh index ef1faf0cf6..f8824fba11 100755 --- a/src/test/shell/integration/runfiles_test.sh +++ b/src/test/shell/integration/runfiles_test.sh @@ -140,9 +140,15 @@ EOF assert_equals 13 $(wc -l < MANIFEST) for i in $(find ${WORKSPACE_NAME} \! -type d); do - echo "$i $(readlink "$i")" - done >MANIFEST2 - diff -u <(sort MANIFEST) <(sort MANIFEST2) + if readlink "$i" > /dev/null; then + echo "$i $(readlink "$i")" >> ${TEST_TMPDIR}/MANIFEST2 + else + echo "$i " >> ${TEST_TMPDIR}/MANIFEST2 + fi + done + sort MANIFEST > ${TEST_TMPDIR}/MANIFEST_sorted + sort ${TEST_TMPDIR}/MANIFEST2 > ${TEST_TMPDIR}/MANIFEST2_sorted + diff -u ${TEST_TMPDIR}/MANIFEST_sorted ${TEST_TMPDIR}/MANIFEST2_sorted } function test_workspace_name_change() { |