aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java8
6 files changed, 35 insertions, 21 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 9b5bdad15c..c3773c2a7c 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
@@ -16,14 +16,12 @@ package com.google.devtools.build.lib.skyframe;
import static com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.MutableClassToInstanceMap;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfigurationCollectionFactory;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.skyframe.SkyFunction;
@@ -91,13 +89,8 @@ public class BuildConfigurationFunction implements SkyFunction {
// Get SkyKeys for the fragments we need to load.
Set<SkyKey> fragmentKeys = new LinkedHashSet<>();
for (Class<? extends BuildConfiguration.Fragment> fragmentClass : key.getFragments()) {
- // We don't want to invalidate the fragment Skyframe key due to existence of absence of
- // options the fragment doesn't use.
- BuildOptions optionsUsedByFragment = key.getBuildOptions().trim(
- BuildConfiguration.getOptionsClasses(
- ImmutableList.<Class<? extends BuildConfiguration.Fragment>>of(fragmentClass),
- ruleClassProvider));
- fragmentKeys.add(ConfigurationFragmentValue.key(optionsUsedByFragment, fragmentClass));
+ fragmentKeys.add(
+ ConfigurationFragmentValue.key(key.getBuildOptions(), fragmentClass, ruleClassProvider));
}
// Load them as Skyframe deps.
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 aea49f20c7..a5061b25f9 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
@@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.config.PackageProviderForConfigura
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.skyframe.ConfigurationCollectionValue.ConfigurationCollectionKey;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -44,9 +45,12 @@ import javax.annotation.Nullable;
public class ConfigurationCollectionFunction implements SkyFunction {
private final Supplier<ConfigurationFactory> configurationFactory;
+ private final RuleClassProvider ruleClassProvider;
- public ConfigurationCollectionFunction(Supplier<ConfigurationFactory> configurationFactory) {
+ public ConfigurationCollectionFunction(Supplier<ConfigurationFactory> configurationFactory,
+ RuleClassProvider ruleClassProvider) {
this.configurationFactory = configurationFactory;
+ this.ruleClassProvider = ruleClassProvider;
}
@Override
@@ -54,9 +58,9 @@ public class ConfigurationCollectionFunction implements SkyFunction {
ConfigurationCollectionFunctionException {
ConfigurationCollectionKey collectionKey = (ConfigurationCollectionKey) skyKey.argument();
try {
- BuildConfigurationCollection result =
- getConfigurations(env, new SkyframePackageLoaderWithValueEnvironment(env),
- collectionKey.getBuildOptions(), collectionKey.getMultiCpu());
+ BuildConfigurationCollection result = getConfigurations(env,
+ new SkyframePackageLoaderWithValueEnvironment(env, ruleClassProvider),
+ collectionKey.getBuildOptions(), collectionKey.getMultiCpu());
// BuildConfigurationCollection can be created, but dependencies to some files might be
// missing. In that case we need to build configurationCollection again.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentFunction.java
index 8da3a9cc3a..ac541411cd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentFunction.java
@@ -27,6 +27,7 @@ import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.Package;
+import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.skyframe.ConfigurationFragmentValue.ConfigurationFragmentKey;
import com.google.devtools.build.lib.vfs.Path;
@@ -43,10 +44,13 @@ import java.io.IOException;
public class ConfigurationFragmentFunction implements SkyFunction {
private final Supplier<ImmutableList<ConfigurationFragmentFactory>> configurationFragments;
+ private final RuleClassProvider ruleClassProvider;
public ConfigurationFragmentFunction(
- Supplier<ImmutableList<ConfigurationFragmentFactory>> configurationFragments) {
+ Supplier<ImmutableList<ConfigurationFragmentFactory>> configurationFragments,
+ RuleClassProvider ruleClassProvider) {
this.configurationFragments = configurationFragments;
+ this.ruleClassProvider = ruleClassProvider;
}
@Override
@@ -58,7 +62,7 @@ public class ConfigurationFragmentFunction implements SkyFunction {
ConfigurationFragmentFactory factory = getFactory(configurationFragmentKey.getFragmentType());
try {
PackageProviderForConfigurations packageProvider =
- new SkyframePackageLoaderWithValueEnvironment(env);
+ new SkyframePackageLoaderWithValueEnvironment(env, ruleClassProvider);
ConfigurationEnvironment confEnv = new ConfigurationBuilderEnvironment(packageProvider);
Fragment fragment = factory.create(confEnv, buildOptions);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java
index 10a5f18dce..3e14e7f53a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java
@@ -14,11 +14,13 @@
package com.google.devtools.build.lib.skyframe;
import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
@@ -46,9 +48,16 @@ public class ConfigurationFragmentValue implements SkyValue {
}
@ThreadSafe
- public static SkyKey key(BuildOptions buildOptions, Class<? extends Fragment> fragmentType) {
+ public static SkyKey key(BuildOptions buildOptions, Class<? extends Fragment> fragmentType,
+ RuleClassProvider ruleClassProvider) {
+ // Trim the options down to just those used by this fragment. This ensures we don't end
+ // up with different Skyframe keys due to trimming of unrelated options.
+ BuildOptions optionsUsedByFragment = buildOptions.trim(
+ BuildConfiguration.getOptionsClasses(
+ ImmutableList.<Class<? extends BuildConfiguration.Fragment>>of(fragmentType),
+ ruleClassProvider));
return new SkyKey(SkyFunctions.CONFIGURATION_FRAGMENT,
- new ConfigurationFragmentKey(buildOptions, fragmentType));
+ new ConfigurationFragmentKey(optionsUsedByFragment, fragmentType));
}
static final class ConfigurationFragmentKey implements Serializable {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index c21a4160fd..4b31a6673b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -372,9 +372,9 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
map.put(SkyFunctions.BUILD_CONFIGURATION,
new BuildConfigurationFunction(directories, ruleClassProvider));
map.put(SkyFunctions.CONFIGURATION_COLLECTION, new ConfigurationCollectionFunction(
- configurationFactory));
+ configurationFactory, ruleClassProvider));
map.put(SkyFunctions.CONFIGURATION_FRAGMENT, new ConfigurationFragmentFunction(
- configurationFragments));
+ configurationFragments, ruleClassProvider));
map.put(
SkyFunctions.WORKSPACE_FILE,
new WorkspaceFileFunction(ruleClassProvider, pkgFactory, directories));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java
index 95ff677240..7e2a6be2f7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.Package;
+import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor.SkyframePackageLoader;
import com.google.devtools.build.lib.vfs.RootedPath;
@@ -40,9 +41,12 @@ import java.io.IOException;
*/
class SkyframePackageLoaderWithValueEnvironment implements PackageProviderForConfigurations {
private final SkyFunction.Environment env;
+ private final RuleClassProvider ruleClassProvider;
- public SkyframePackageLoaderWithValueEnvironment(SkyFunction.Environment env) {
+ public SkyframePackageLoaderWithValueEnvironment(SkyFunction.Environment env,
+ RuleClassProvider ruleClassProvider) {
this.env = env;
+ this.ruleClassProvider = ruleClassProvider;
}
private Package getPackage(final PackageIdentifier pkgIdentifier)
@@ -77,7 +81,7 @@ class SkyframePackageLoaderWithValueEnvironment implements PackageProviderForCon
public <T extends Fragment> T getFragment(BuildOptions buildOptions, Class<T> fragmentType)
throws InvalidConfigurationException {
ConfigurationFragmentValue fragmentNode = (ConfigurationFragmentValue) env.getValueOrThrow(
- ConfigurationFragmentValue.key(buildOptions, fragmentType),
+ ConfigurationFragmentValue.key(buildOptions, fragmentType, ruleClassProvider),
InvalidConfigurationException.class);
if (fragmentNode == null) {
return null;