diff options
author | kchodorow <kchodorow@google.com> | 2017-03-30 16:45:03 +0000 |
---|---|---|
committer | Philipp Wollermann <philwo@google.com> | 2017-03-31 17:09:07 +0200 |
commit | 1d9e1ac90197b1d3d7b137ba3c1ada67bb9ba31b (patch) | |
tree | e1fd678b5e641169c50762929b7641a17b4e147f /src/main/java/com/google/devtools/build/lib/analysis | |
parent | ea6f209f88e4292f0af5b75ef6872e1902eaeccd (diff) |
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: 151712384
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
6 files changed, 76 insertions, 36 deletions
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; } |