aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
authorGravatar kchodorow <kchodorow@google.com>2017-03-30 16:45:03 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2017-03-31 17:09:07 +0200
commit1d9e1ac90197b1d3d7b137ba3c1ada67bb9ba31b (patch)
treee1fd678b5e641169c50762929b7641a17b4e147f /src/main/java/com/google/devtools/build/lib/skyframe
parentea6f209f88e4292f0af5b75ef6872e1902eaeccd (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/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java17
6 files changed, 44 insertions, 34 deletions
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() {