diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
11 files changed, 146 insertions, 60 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index 917dfcb9dd..37ca17c17f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.analysis.DependencyResolver.InconsistentAsp import com.google.devtools.build.lib.analysis.TargetAndConfiguration; import com.google.devtools.build.lib.analysis.ToolchainContext; 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.ConfigMatchingProvider; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.analysis.configuredtargets.MergedConfiguredTarget; @@ -97,6 +98,7 @@ public final class AspectFunction implements SkyFunction { private final BuildViewProvider buildViewProvider; private final RuleClassProvider ruleClassProvider; private final Supplier<Boolean> removeActionsAfterEvaluation; + private final BuildOptions defaultBuildOptions; /** * Indicates whether the set of packages transitively loaded for a given {@link AspectValue} will * be needed for package root resolution later in the build. If not, they are not collected and @@ -108,12 +110,14 @@ public final class AspectFunction implements SkyFunction { BuildViewProvider buildViewProvider, RuleClassProvider ruleClassProvider, Supplier<Boolean> removeActionsAfterEvaluation, - boolean storeTransitivePackagesForPackageRootResolution) { + boolean storeTransitivePackagesForPackageRootResolution, + BuildOptions defaultBuildOptions) { this.buildViewProvider = buildViewProvider; this.ruleClassProvider = ruleClassProvider; this.removeActionsAfterEvaluation = Preconditions.checkNotNull(removeActionsAfterEvaluation); this.storeTransitivePackagesForPackageRootResolution = storeTransitivePackagesForPackageRootResolution; + this.defaultBuildOptions = defaultBuildOptions; } /** @@ -382,7 +386,8 @@ public final class AspectFunction implements SkyFunction { ruleClassProvider, view.getHostConfiguration(originalTargetAndAspectConfiguration.getConfiguration()), transitivePackagesForPackageRootResolution, - transitiveRootCauses); + transitiveRootCauses, + defaultBuildOptions); } catch (ConfiguredTargetFunctionException e) { throw new AspectCreationException(e.getMessage()); } 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 e335ceaa71..6b39f2883b 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 @@ -21,6 +21,7 @@ import com.google.common.collect.MutableClassToInstanceMap; import com.google.devtools.build.lib.analysis.BlazeDirectories; 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; @@ -39,11 +40,15 @@ public class BuildConfigurationFunction implements SkyFunction { private final BlazeDirectories directories; private final ConfiguredRuleClassProvider ruleClassProvider; + private final BuildOptions defaultBuildOptions; - public BuildConfigurationFunction(BlazeDirectories directories, - RuleClassProvider ruleClassProvider) { + public BuildConfigurationFunction( + BlazeDirectories directories, + RuleClassProvider ruleClassProvider, + BuildOptions defaultBuildOptions) { this.directories = directories; this.ruleClassProvider = (ConfiguredRuleClassProvider) ruleClassProvider; + this.defaultBuildOptions = defaultBuildOptions; } @Override @@ -71,12 +76,11 @@ public class BuildConfigurationFunction implements SkyFunction { fragmentsMap.put(fragment.getClass(), fragment); } + BuildOptions options = defaultBuildOptions.applyDiff(key.getOptionsDiff()); + BuildConfiguration config = new BuildConfiguration( - directories, - fragmentsMap, - key.getBuildOptions(), - workspaceNameValue.getName()); + directories, fragmentsMap, options, key.getOptionsDiff(), workspaceNameValue.getName()); return new BuildConfigurationValue(config); } @@ -85,9 +89,9 @@ public class BuildConfigurationFunction implements SkyFunction { // Get SkyKeys for the fragments we need to load. Set<SkyKey> fragmentKeys = new LinkedHashSet<>(); + BuildOptions options = defaultBuildOptions.applyDiff(key.getOptionsDiff()); for (Class<? extends BuildConfiguration.Fragment> fragmentClass : key.getFragments()) { - fragmentKeys.add( - ConfigurationFragmentValue.key(key.getBuildOptions(), fragmentClass, ruleClassProvider)); + fragmentKeys.add(ConfigurationFragmentValue.key(options, fragmentClass, ruleClassProvider)); } // Load them as Skyframe deps. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java index b445cc0a2b..8eed98ce64 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java @@ -13,7 +13,6 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Interner; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -44,7 +43,6 @@ import java.util.Set; @AutoCodec @ThreadSafe public class BuildConfigurationValue implements SkyValue { - private static final Interner<Key> keyInterner = BlazeInterners.newWeakInterner(); private final BuildConfiguration configuration; @@ -60,40 +58,50 @@ public class BuildConfigurationValue implements SkyValue { * Returns the key for a requested configuration. * * @param fragments the fragments the configuration should contain - * @param buildOptions the build options the fragments should be built from + * @param optionsDiff the {@link BuildOptions.OptionsDiffForReconstruction} object the {@link + * BuildOptions} should be rebuilt from */ @ThreadSafe public static Key key( - Set<Class<? extends BuildConfiguration.Fragment>> fragments, BuildOptions buildOptions) { + Set<Class<? extends BuildConfiguration.Fragment>> fragments, + BuildOptions.OptionsDiffForReconstruction optionsDiff) { return key( FragmentClassSet.of( ImmutableSortedSet.copyOf(BuildConfiguration.lexicalFragmentSorter, fragments)), - buildOptions); + optionsDiff); } - public static Key key(FragmentClassSet fragmentClassSet, BuildOptions buildOptions) { - return keyInterner.intern(new Key(fragmentClassSet, buildOptions)); + public static Key key( + FragmentClassSet fragmentClassSet, BuildOptions.OptionsDiffForReconstruction optionsDiff) { + return Key.create(fragmentClassSet, optionsDiff); } /** {@link SkyKey} for {@link BuildConfigurationValue}. */ @VisibleForSerialization public static final class Key implements SkyKey, Serializable { + private static final Interner<Key> keyInterner = BlazeInterners.newWeakInterner(); + private final FragmentClassSet fragments; - private final BuildOptions buildOptions; + private final BuildOptions.OptionsDiffForReconstruction optionsDiff; // If hashCode really is -1, we'll recompute it from scratch each time. Oh well. private volatile int hashCode = -1; - private Key(FragmentClassSet fragments, BuildOptions buildOptions) { + private static Key create( + FragmentClassSet fragments, BuildOptions.OptionsDiffForReconstruction optionsDiff) { + return keyInterner.intern(new Key(fragments, optionsDiff)); + } + + Key(FragmentClassSet fragments, BuildOptions.OptionsDiffForReconstruction optionsDiff) { this.fragments = fragments; - this.buildOptions = Preconditions.checkNotNull(buildOptions); + this.optionsDiff = optionsDiff; } ImmutableSortedSet<Class<? extends BuildConfiguration.Fragment>> getFragments() { return fragments.fragmentClasses(); } - BuildOptions getBuildOptions() { - return buildOptions; + BuildOptions.OptionsDiffForReconstruction getOptionsDiff() { + return optionsDiff; } @Override @@ -110,14 +118,14 @@ public class BuildConfigurationValue implements SkyValue { return false; } Key otherConfig = (Key) o; - return buildOptions.equals(otherConfig.buildOptions) + return optionsDiff.equals(otherConfig.optionsDiff) && Objects.equals(fragments, otherConfig.fragments); } @Override public int hashCode() { if (hashCode == -1) { - hashCode = Objects.hash(fragments, buildOptions); + hashCode = Objects.hash(fragments, optionsDiff); } return hashCode; } @@ -131,7 +139,7 @@ public class BuildConfigurationValue implements SkyValue { @Override public void serialize(SerializationContext context, Key obj, CodedOutputStream codedOut) throws SerializationException, IOException { - context.serialize(obj.buildOptions, codedOut); + context.serialize(obj.optionsDiff, codedOut); codedOut.writeInt32NoTag(obj.fragments.fragmentClasses().size()); for (Class<? extends BuildConfiguration.Fragment> fragment : obj.fragments.fragmentClasses()) { @@ -143,7 +151,7 @@ public class BuildConfigurationValue implements SkyValue { @SuppressWarnings("unchecked") // Class<? extends...> cast public Key deserialize(DeserializationContext context, CodedInputStream codedIn) throws SerializationException, IOException { - BuildOptions buildOptions = context.deserialize(codedIn); + BuildOptions.OptionsDiffForReconstruction optionsDiff = context.deserialize(codedIn); int fragmentsSize = codedIn.readInt32(); ImmutableSortedSet.Builder<Class<? extends BuildConfiguration.Fragment>> fragmentsBuilder = ImmutableSortedSet.orderedBy(BuildConfiguration.lexicalFragmentSorter); @@ -157,7 +165,7 @@ public class BuildConfigurationValue implements SkyValue { "Couldn't deserialize BuildConfigurationValue$Key fragment class", e); } } - return key(fragmentsBuilder.build(), buildOptions); + return key(fragmentsBuilder.build(), optionsDiff); } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java index 2df73d1791..a4bb22fce0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.analysis.DependencyResolver.InconsistentAsp import com.google.devtools.build.lib.analysis.TargetAndConfiguration; import com.google.devtools.build.lib.analysis.ToolchainContext; 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.ConfigMatchingProvider; import com.google.devtools.build.lib.analysis.config.ConfigurationResolver; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; @@ -116,6 +117,7 @@ public final class ConfiguredTargetFunction implements SkyFunction { private final RuleClassProvider ruleClassProvider; private final Semaphore cpuBoundSemaphore; private final Supplier<Boolean> removeActionsAfterEvaluation; + private final BuildOptions defaultBuildOptions; /** * Indicates whether the set of packages transitively loaded for a given {@link * ConfiguredTargetValue} will be needed for package root resolution later in the build. If not, @@ -128,13 +130,15 @@ public final class ConfiguredTargetFunction implements SkyFunction { RuleClassProvider ruleClassProvider, Semaphore cpuBoundSemaphore, Supplier<Boolean> removeActionsAfterEvaluation, - boolean storeTransitivePackagesForPackageRootResolution) { + boolean storeTransitivePackagesForPackageRootResolution, + BuildOptions defaultBuildOptions) { this.buildViewProvider = buildViewProvider; this.ruleClassProvider = ruleClassProvider; this.cpuBoundSemaphore = cpuBoundSemaphore; this.removeActionsAfterEvaluation = Preconditions.checkNotNull(removeActionsAfterEvaluation); this.storeTransitivePackagesForPackageRootResolution = storeTransitivePackagesForPackageRootResolution; + this.defaultBuildOptions = defaultBuildOptions; } @Override @@ -269,7 +273,8 @@ public final class ConfiguredTargetFunction implements SkyFunction { ruleClassProvider, view.getHostConfiguration(configuration), transitivePackagesForPackageRootResolution, - transitiveLoadingRootCauses); + transitiveLoadingRootCauses, + defaultBuildOptions); if (env.valuesMissing()) { return null; } @@ -380,6 +385,9 @@ public final class ConfiguredTargetFunction implements SkyFunction { * @param hostConfiguration the host configuration. There's a noticeable performance hit from * instantiating this on demand for every dependency that wants it, so it's best to compute * the host configuration as early as possible and pass this reference to all consumers + * @param defaultBuildOptions the default build options provided by the server; these are used to + * create diffs for {@link BuildConfigurationValue.Key}s to prevent storing the entire + * BuildOptions object. */ @Nullable static OrderedSetMultimap<Attribute, ConfiguredTargetAndData> computeDependencies( @@ -392,7 +400,8 @@ public final class ConfiguredTargetFunction implements SkyFunction { RuleClassProvider ruleClassProvider, BuildConfiguration hostConfiguration, @Nullable NestedSetBuilder<Package> transitivePackagesForPackageRootResolution, - NestedSetBuilder<Label> transitiveLoadingRootCauses) + NestedSetBuilder<Label> transitiveLoadingRootCauses, + BuildOptions defaultBuildOptions) throws DependencyEvaluationException, ConfiguredTargetFunctionException, AspectCreationException, InterruptedException { // Create the map from attributes to set of (target, configuration) pairs. @@ -407,7 +416,8 @@ public final class ConfiguredTargetFunction implements SkyFunction { toolchainContext == null ? ImmutableSet.of() : toolchainContext.getResolvedToolchainLabels(), - transitiveLoadingRootCauses); + transitiveLoadingRootCauses, + defaultBuildOptions); } catch (EvalException e) { // EvalException can only be thrown by computed Skylark attributes in the current rule. env.getListener().handle(Event.error(e.getLocation(), e.getMessage())); @@ -423,8 +433,14 @@ public final class ConfiguredTargetFunction implements SkyFunction { // Trim each dep's configuration so it only includes the fragments needed by its transitive // closure. if (ctgValue.getConfiguration() != null) { - depValueNames = ConfigurationResolver.resolveConfigurations(env, ctgValue, depValueNames, - hostConfiguration, ruleClassProvider); + depValueNames = + ConfigurationResolver.resolveConfigurations( + env, + ctgValue, + depValueNames, + hostConfiguration, + ruleClassProvider, + defaultBuildOptions); // It's important that we don't use "if (env.missingValues()) { return null }" here (or // in the following lines). See the comments in getDynamicConfigurations' Skyframe call // for explanation. @@ -686,7 +702,8 @@ public final class ConfiguredTargetFunction implements SkyFunction { throws ConfiguredTargetFunctionException, InterruptedException { StoredEventHandler events = new StoredEventHandler(); BuildConfiguration ownerConfig = - ConfiguredTargetFactory.getArtifactOwnerConfiguration(env, configuration); + ConfiguredTargetFactory.getArtifactOwnerConfiguration( + env, configuration, defaultBuildOptions); if (env.valuesMissing()) { return null; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java index f9489794cc..e5692d3376 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java @@ -80,7 +80,7 @@ public class ConfiguredTargetKey extends ActionLookupKey { ? KeyAndHost.NULL_INSTANCE : new KeyAndHost( BuildConfigurationValue.key( - configuration.fragmentClasses(), configuration.getOptions()), + configuration.fragmentClasses(), configuration.getBuildOptionsDiff()), configuration.isHostConfiguration()); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java index c8e61fe10a..2a35b9f186 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.Dependency; import com.google.devtools.build.lib.analysis.DependencyResolver.InconsistentAspectOrderException; import com.google.devtools.build.lib.analysis.TargetAndConfiguration; 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.ConfigMatchingProvider; import com.google.devtools.build.lib.analysis.config.ConfigurationResolver; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; @@ -64,12 +65,15 @@ public class PostConfiguredTargetFunction implements SkyFunction { private final SkyframeExecutor.BuildViewProvider buildViewProvider; private final RuleClassProvider ruleClassProvider; + private final BuildOptions defaultBuildOptions; public PostConfiguredTargetFunction( SkyframeExecutor.BuildViewProvider buildViewProvider, - RuleClassProvider ruleClassProvider) { + RuleClassProvider ruleClassProvider, + BuildOptions defaultBuildOptions) { this.buildViewProvider = Preconditions.checkNotNull(buildViewProvider); this.ruleClassProvider = ruleClassProvider; + this.defaultBuildOptions = defaultBuildOptions; } @Nullable @@ -125,10 +129,12 @@ public class PostConfiguredTargetFunction implements SkyFunction { hostConfiguration, /*aspect=*/ null, configConditions, - /*toolchainLabels=*/ ImmutableSet.of()); + /*toolchainLabels*/ ImmutableSet.of(), + defaultBuildOptions); if (ct.getConfiguration() != null) { - deps = ConfigurationResolver.resolveConfigurations(env, ctgValue, deps, hostConfiguration, - ruleClassProvider); + deps = + ConfigurationResolver.resolveConfigurations( + env, ctgValue, deps, hostConfiguration, ruleClassProvider, defaultBuildOptions); } } catch (EvalException | ConfiguredTargetFunction.DependencyEvaluationException | InvalidConfigurationException | InconsistentAspectOrderException e) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java index 88cced7588..3c25ef34d6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java @@ -34,6 +34,7 @@ import com.google.devtools.build.lib.analysis.BuildView; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; +import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; import com.google.devtools.build.lib.buildtool.BuildRequestOptions; import com.google.devtools.build.lib.cmdline.PackageIdentifier; @@ -147,7 +148,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { PathFragment additionalBlacklistedPackagePrefixesFile, CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy, List<BuildFileName> buildFilesByPriority, - ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile) { + ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile, + BuildOptions defaultBuildOptions) { super( evaluatorSupplier, pkgFactory, @@ -162,7 +164,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { additionalBlacklistedPackagePrefixesFile, crossRepositoryLabelViolationStrategy, buildFilesByPriority, - actionOnIOExceptionReadingBuildFile); + actionOnIOExceptionReadingBuildFile, + defaultBuildOptions); this.diffAwarenessManager = new DiffAwarenessManager(diffAwarenessFactories); this.customDirtinessCheckers = customDirtinessCheckers; } @@ -181,7 +184,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { PathFragment additionalBlacklistedPackagePrefixesFile, CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy, List<BuildFileName> buildFilesByPriority, - ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile) { + ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile, + BuildOptions defaultBuildOptions) { SequencedSkyframeExecutor skyframeExecutor = new SequencedSkyframeExecutor( InMemoryMemoizingEvaluator.SUPPLIER, @@ -198,7 +202,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { additionalBlacklistedPackagePrefixesFile, crossRepositoryLabelViolationStrategy, buildFilesByPriority, - actionOnIOExceptionReadingBuildFile); + actionOnIOExceptionReadingBuildFile, + defaultBuildOptions); skyframeExecutor.init(); return skyframeExecutor; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java index f8c5b8babb..ddb1a7c09d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.actions.ActionKeyContext; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; +import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.skyframe.SkyFunction; @@ -29,6 +30,12 @@ import com.google.devtools.build.skyframe.SkyFunctionName; */ public class SequencedSkyframeExecutorFactory implements SkyframeExecutorFactory { + private final BuildOptions defaultBuildOptions; + + public SequencedSkyframeExecutorFactory(BuildOptions defaultBuildOptions) { + this.defaultBuildOptions = defaultBuildOptions; + } + @Override public SkyframeExecutor create( PackageFactory pkgFactory, @@ -54,6 +61,7 @@ public class SequencedSkyframeExecutorFactory implements SkyframeExecutorFactory BazelSkyframeExecutorConstants.ADDITIONAL_BLACKLISTED_PACKAGE_PREFIXES_FILE, BazelSkyframeExecutorConstants.CROSS_REPOSITORY_LABEL_VIOLATION_STRATEGY, BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY, - BazelSkyframeExecutorConstants.ACTION_ON_IO_EXCEPTION_READING_BUILD_FILE); + BazelSkyframeExecutorConstants.ACTION_ON_IO_EXCEPTION_READING_BUILD_FILE, + defaultBuildOptions); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java index 3cb34515df..115c5c1fa8 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java @@ -126,7 +126,8 @@ public final class SkyframeBuildView { public SkyframeBuildView(BlazeDirectories directories, SkyframeExecutor skyframeExecutor, ConfiguredRuleClassProvider ruleClassProvider) { - this.factory = new ConfiguredTargetFactory(ruleClassProvider); + this.factory = + new ConfiguredTargetFactory(ruleClassProvider, skyframeExecutor.getDefaultBuildOptions()); this.artifactFactory = new ArtifactFactory(directories.getExecRoot(), directories.getRelativeOutputPath()); this.skyframeExecutor = skyframeExecutor; @@ -568,7 +569,8 @@ public final class SkyframeBuildView { // case. So further optimization is necessary to make that viable (proto_library in particular // contributes to much of the difference). BuildConfiguration trimmedConfig = - topLevelHostConfiguration.clone(fragmentClasses, ruleClassProvider); + topLevelHostConfiguration.clone( + fragmentClasses, ruleClassProvider, skyframeExecutor.getDefaultBuildOptions()); hostConfigurationCache.put(fragmentClasses, trimmedConfig); return trimmedConfig; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java index 8b3d23daf5..f4940066c8 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java @@ -124,11 +124,15 @@ public final class SkyframeDependencyResolver extends DependencyResolver { @Nullable @Override protected List<BuildConfiguration> getConfigurations( - FragmentClassSet fragments, Iterable<BuildOptions> buildOptions) + FragmentClassSet fragments, + Iterable<BuildOptions> buildOptions, + BuildOptions defaultBuildOptions) throws InvalidConfigurationException, InterruptedException { List<SkyKey> keys = new ArrayList<>(); for (BuildOptions options : buildOptions) { - keys.add(BuildConfigurationValue.key(fragments, options)); + keys.add( + BuildConfigurationValue.key( + fragments, BuildOptions.diffForReconstruction(defaultBuildOptions, options))); } Map<SkyKey, ValueOrException<InvalidConfigurationException>> configValues = env.getValuesOrThrow(keys, InvalidConfigurationException.class); 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 d5c54471a3..d8686adf31 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 @@ -293,6 +293,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { private final ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile; + private final BuildOptions defaultBuildOptions; + private PerBuildSyscallCache perBuildSyscallCache; private int lastConcurrencyLevel = -1; @@ -312,7 +314,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { PathFragment additionalBlacklistedPackagePrefixesFile, CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy, List<BuildFileName> buildFilesByPriority, - ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile) { + ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile, + BuildOptions defaultBuildOptions) { // Strictly speaking, these arguments are not required for initialization, but all current // callsites have them at hand, so we might as well set them during construction. this.evaluatorSupplier = evaluatorSupplier; @@ -338,6 +341,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { this.additionalBlacklistedPackagePrefixesFile = additionalBlacklistedPackagePrefixesFile; this.ruleClassProvider = pkgFactory.getRuleClassProvider(); + this.defaultBuildOptions = defaultBuildOptions; this.skyframeBuildView = new SkyframeBuildView( directories, this, @@ -423,19 +427,24 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { ruleClassProvider, cpuBoundSemaphore, removeActionsAfterEvaluation, - shouldStoreTransitivePackagesInLoadingAndAnalysis())); + shouldStoreTransitivePackagesInLoadingAndAnalysis(), + defaultBuildOptions)); map.put( SkyFunctions.ASPECT, new AspectFunction( new BuildViewProvider(), ruleClassProvider, removeActionsAfterEvaluation, - shouldStoreTransitivePackagesInLoadingAndAnalysis())); + shouldStoreTransitivePackagesInLoadingAndAnalysis(), + defaultBuildOptions)); map.put(SkyFunctions.LOAD_SKYLARK_ASPECT, new ToplevelSkylarkAspectFunction()); - map.put(SkyFunctions.POST_CONFIGURED_TARGET, - new PostConfiguredTargetFunction(new BuildViewProvider(), ruleClassProvider)); - map.put(SkyFunctions.BUILD_CONFIGURATION, - new BuildConfigurationFunction(directories, ruleClassProvider)); + map.put( + SkyFunctions.POST_CONFIGURED_TARGET, + new PostConfiguredTargetFunction( + new BuildViewProvider(), ruleClassProvider, defaultBuildOptions)); + map.put( + SkyFunctions.BUILD_CONFIGURATION, + new BuildConfigurationFunction(directories, ruleClassProvider, defaultBuildOptions)); map.put( SkyFunctions.CONFIGURATION_FRAGMENT, new ConfigurationFragmentFunction(configurationFragments, ruleClassProvider, directories)); @@ -907,7 +916,9 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { requiredToolchains, config == null ? null - : BuildConfigurationValue.key(config.fragmentClasses(), config.getOptions())); + : BuildConfigurationValue.key( + config.fragmentClasses(), + BuildOptions.diffForReconstruction(defaultBuildOptions, config.getOptions()))); } /** @@ -1299,6 +1310,11 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { return getConfiguredTargetMapForTesting(eventHandler, originalConfig, keys).values().asList(); } + @VisibleForTesting + public BuildOptions getDefaultBuildOptions() { + return defaultBuildOptions; + } + /** * Returns a map from {@link Dependency} inputs to the {@link ConfiguredTargetAndData}s * corresponding to those dependencies. @@ -1457,7 +1473,11 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { final ImmutableList<SkyKey> configSkyKeys = optionsList .stream() - .map(elem -> BuildConfigurationValue.key(allFragments, elem)) + .map( + elem -> + BuildConfigurationValue.key( + allFragments, + BuildOptions.diffForReconstruction(defaultBuildOptions, elem))) .collect(ImmutableList.toImmutableList()); // Skyframe-evaluate the configurations and throw errors if any. @@ -1554,7 +1574,10 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { if (depFragments != null) { for (BuildOptions toOptions : ConfigurationResolver.applyTransition( fromOptions, key.getTransition(), depFragments, ruleClassProvider, true)) { - configSkyKeys.add(BuildConfigurationValue.key(depFragments, toOptions)); + configSkyKeys.add( + BuildConfigurationValue.key( + depFragments, + BuildOptions.diffForReconstruction(defaultBuildOptions, toOptions))); } } } @@ -1569,7 +1592,9 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { if (depFragments != null) { for (BuildOptions toOptions : ConfigurationResolver.applyTransition( fromOptions, key.getTransition(), depFragments, ruleClassProvider, true)) { - SkyKey configKey = BuildConfigurationValue.key(depFragments, toOptions); + SkyKey configKey = + BuildConfigurationValue.key( + depFragments, BuildOptions.diffForReconstruction(defaultBuildOptions, toOptions)); BuildConfigurationValue configValue = ((BuildConfigurationValue) configsResult.get(configKey)); // configValue will be null here if there was an exception thrown during configuration @@ -1640,7 +1665,9 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { FragmentClassSet fragments, BuildOptions options) throws InterruptedException { - SkyKey key = BuildConfigurationValue.key(fragments, options); + SkyKey key = + BuildConfigurationValue.key( + fragments, BuildOptions.diffForReconstruction(defaultBuildOptions, options)); BuildConfigurationValue result = (BuildConfigurationValue) buildDriver .evaluate(ImmutableList.of(key), false, DEFAULT_THREAD_COUNT, eventHandler).get(key); return result.getConfiguration(); |