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