diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
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() { |