aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java42
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java51
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();