Skip to content

Commit ceddfb1

Browse files
Googlercopybara-github
authored andcommitted
Enable rule transition to inspect configurable attributes' value
Fixes #15157 PiperOrigin-RevId: 558262406 Change-Id: I514c95c0470a2d171a5b276f25b65a4adddf17e9
1 parent c9d7ff9 commit ceddfb1

29 files changed

+862
-113
lines changed

src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,7 @@ public ImmutableCollection<String> getStarlarkFragmentNames() {
906906
return starlarkVisibleFragments.keySet();
907907
}
908908

909-
private BuildEventId getEventId() {
909+
public BuildEventId getEventId() {
910910
return BuildEventIdUtil.configurationId(checksum());
911911
}
912912

src/main/java/com/google/devtools/build/lib/analysis/config/ConfigMatchingProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ public static ConfigMatchingProvider create(
5858
/** The target's label. */
5959
public abstract Label label();
6060

61-
abstract ImmutableMultimap<String, String> settingsMap();
61+
public abstract ImmutableMultimap<String, String> settingsMap();
6262

63-
abstract ImmutableMap<Label, String> flagSettingsMap();
63+
public abstract ImmutableMap<Label, String> flagSettingsMap();
6464

65-
abstract ImmutableSet<Label> constraintValuesSetting();
65+
public abstract ImmutableSet<Label> constraintValuesSetting();
6666

6767
/**
6868
* Whether or not the configuration criteria defined by this target match its actual

src/main/java/com/google/devtools/build/lib/analysis/config/RequiredFragmentsUtil.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ public static RequiredConfigFragmentsProvider getRuleRequiredFragmentsIfEnabled(
106106
.addRuleImplSpecificRequiredConfigFragments(requiredFragments, attributes, configuration);
107107
}
108108
addRequiredFragmentsFromRuleTransitions(
109-
requiredFragments, target, attributes, configuration.getBuildOptionDetails());
109+
configConditions,
110+
configuration.checksum(),
111+
requiredFragments,
112+
target,
113+
attributes,
114+
configuration.getBuildOptionDetails());
110115

111116
// We consider build settings (which are both targets and configuration) to require themselves.
112117
if (target.isBuildSetting()) {
@@ -216,6 +221,8 @@ private static RequiredConfigFragmentsProvider.Builder getRequiredFragments(
216221
* because the child's properties determine that dependency.
217222
*/
218223
private static void addRequiredFragmentsFromRuleTransitions(
224+
ConfigConditions configConditions,
225+
String configHash,
219226
RequiredConfigFragmentsProvider.Builder requiredFragments,
220227
Rule target,
221228
ConfiguredAttributeMapper attributeMap,
@@ -224,7 +231,7 @@ private static void addRequiredFragmentsFromRuleTransitions(
224231
target
225232
.getRuleClassObject()
226233
.getTransitionFactory()
227-
.create(RuleTransitionData.create(target))
234+
.create(RuleTransitionData.create(target, configConditions.asProviders(), configHash))
228235
.addRequiredFragments(requiredFragments, optionDetails);
229236
}
230237
// We don't set the execution platform in this data because a) that doesn't affect which

src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
4040
import com.google.devtools.build.lib.packages.BazelStarlarkContext.Phase;
4141
import com.google.devtools.build.lib.packages.Rule;
42+
import com.google.devtools.build.lib.packages.RuleTransitionData;
4243
import com.google.devtools.build.lib.packages.StructImpl;
4344
import com.google.devtools.build.lib.packages.SymbolGenerator;
4445
import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigurationTransitionApi;
@@ -95,7 +96,7 @@ public enum Settings {
9596

9697
// The values in this cache should always be instances of StarlarkTransition, but referencing that
9798
// here results in a circular dependency.
98-
private final transient Cache<Rule, PatchTransition> ruleTransitionCache =
99+
private final transient Cache<RuleTransitionData, PatchTransition> ruleTransitionCache =
99100
Caffeine.newBuilder().weakKeys().build();
100101

101102
private StarlarkDefinedConfigTransition(
@@ -216,7 +217,8 @@ public final Location getLocation() {
216217
/**
217218
* Returns a cache that can be used to ensure that this {@link StarlarkDefinedConfigTransition}
218219
* results in at most one {@link
219-
* com.google.devtools.build.lib.analysis.starlark.StarlarkTransition} instance per {@link Rule}.
220+
* com.google.devtools.build.lib.analysis.starlark.StarlarkTransition} instance per {@link
221+
* RuleTransitionData}.
220222
*
221223
* <p>The cache uses {@link Caffeine#weakKeys} to permit collection of transition objects when the
222224
* corresponding {@link Rule} is collectable. As a consequence, it uses identity comparison for
@@ -231,7 +233,7 @@ public final Location getLocation() {
231233
* practice to have few or even one transition invoke multiple times over multiple configured
232234
* targets.
233235
*/
234-
public final Cache<Rule, PatchTransition> getRuleTransitionCache() {
236+
public final Cache<RuleTransitionData, PatchTransition> getRuleTransitionCache() {
235237
return ruleTransitionCache;
236238
}
237239

src/main/java/com/google/devtools/build/lib/analysis/producers/BUILD

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ java_library(
1515
name = "producers",
1616
srcs = glob(["*.java"]),
1717
deps = [
18+
"//third_party:guava",
1819
"//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
1920
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
2021
"//src/main/java/com/google/devtools/build/lib/analysis:aspect_collection",
@@ -23,10 +24,13 @@ java_library(
2324
"//src/main/java/com/google/devtools/build/lib/analysis:config/config_conditions",
2425
"//src/main/java/com/google/devtools/build/lib/analysis:config/config_matching_provider",
2526
"//src/main/java/com/google/devtools/build/lib/analysis:config/configuration_transition_event",
27+
"//src/main/java/com/google/devtools/build/lib/analysis:config/core_options",
2628
"//src/main/java/com/google/devtools/build/lib/analysis:config/invalid_configuration_exception",
2729
"//src/main/java/com/google/devtools/build/lib/analysis:config/starlark_transition_cache",
30+
"//src/main/java/com/google/devtools/build/lib/analysis:config/toolchain_type_requirement",
2831
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/composing_transition",
2932
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/configuration_transition",
33+
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/patch_transition",
3034
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/transition_collector",
3135
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/transition_factory",
3236
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
@@ -52,10 +56,12 @@ java_library(
5256
"//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
5357
"//src/main/java/com/google/devtools/build/lib/causes",
5458
"//src/main/java/com/google/devtools/build/lib/cmdline",
59+
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
5560
"//src/main/java/com/google/devtools/build/lib/events",
5661
"//src/main/java/com/google/devtools/build/lib/packages",
5762
"//src/main/java/com/google/devtools/build/lib/packages:configured_attribute_mapper",
5863
"//src/main/java/com/google/devtools/build/lib/packages:exec_group",
64+
#"//src/main/java/com/google/devtools/build/lib/rules/config",
5965
"//src/main/java/com/google/devtools/build/lib/skyframe:aspect_creation_exception",
6066
"//src/main/java/com/google/devtools/build/lib/skyframe:aspect_key_creator",
6167
"//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
@@ -78,7 +84,6 @@ java_library(
7884
"//src/main/java/net/starlark/java/syntax",
7985
"//src/main/protobuf:failure_details_java_proto",
8086
"//third_party:auto_value",
81-
"//third_party:guava",
8287
"//third_party:jsr305",
8388
],
8489
)

src/main/java/com/google/devtools/build/lib/analysis/producers/ConfigConditionsProducer.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import com.google.common.collect.ImmutableList;
1717
import com.google.common.collect.ImmutableMap;
1818
import com.google.devtools.build.lib.analysis.InconsistentNullConfigException;
19-
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
2019
import com.google.devtools.build.lib.analysis.TransitiveDependencyState;
2120
import com.google.devtools.build.lib.analysis.config.ConfigConditions;
2221
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
@@ -28,6 +27,7 @@
2827
import com.google.devtools.build.lib.packages.Rule;
2928
import com.google.devtools.build.lib.packages.RuleClass;
3029
import com.google.devtools.build.lib.packages.Target;
30+
import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
3131
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
3232
import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
3333
import com.google.devtools.build.lib.skyframe.ConfiguredValueCreationException;
@@ -47,7 +47,9 @@ interface ResultSink {
4747
}
4848

4949
// -------------------- Input --------------------
50-
private final TargetAndConfiguration targetAndConfiguration;
50+
private final Label targetLabel;
51+
private final Target target;
52+
private final BuildConfigurationKey buildConfigurationKey;
5153
@Nullable private final PlatformInfo targetPlatformInfo;
5254
private final TransitiveDependencyState transitiveState;
5355

@@ -66,18 +68,22 @@ interface ResultSink {
6668
private DetailedExitCode mostImportantExitCode;
6769

6870
ConfigConditionsProducer(
69-
TargetAndConfiguration targetAndConfiguration,
71+
Target target,
72+
Label targetLabel,
73+
BuildConfigurationKey buildConfigurationKey,
7074
@Nullable PlatformInfo targetPlatformInfo,
7175
TransitiveDependencyState transitiveState,
7276
ResultSink sink,
7377
StateMachine runAfter) {
74-
this.targetAndConfiguration = targetAndConfiguration;
78+
this.targetLabel = targetLabel;
79+
this.target = target;
80+
this.buildConfigurationKey = buildConfigurationKey;
7581
this.targetPlatformInfo = targetPlatformInfo;
7682
this.transitiveState = transitiveState;
7783
this.sink = sink;
7884
this.runAfter = runAfter;
7985

80-
this.configLabels = computeConfigLabels(targetAndConfiguration.getTarget());
86+
this.configLabels = computeConfigLabels(target);
8187
this.prerequisites =
8288
configLabels == null ? null : new ConfiguredTargetAndData[configLabels.size()];
8389
}
@@ -98,7 +104,7 @@ public StateMachine step(Tasks tasks) {
98104
new ConfiguredTargetAndDataProducer(
99105
ConfiguredTargetKey.builder()
100106
.setLabel(configLabels.get(i))
101-
.setConfiguration(targetAndConfiguration.getConfiguration())
107+
.setConfigurationKey(buildConfigurationKey)
102108
.build(),
103109
/* transitionKeys= */ ImmutableList.of(),
104110
transitiveState,
@@ -147,16 +153,14 @@ private StateMachine constructConfigConditions(Tasks tasks) {
147153
asConfigConditions.put(
148154
label, ConfigConditions.fromConfiguredTarget(prerequisite, targetPlatformInfo));
149155
} catch (ConfigConditions.InvalidConditionException e) {
150-
var targetLabel = targetAndConfiguration.getLabel();
151156
String message =
152157
String.format(
153158
"%s is not a valid select() condition for %s.\n",
154159
prerequisite.getTargetLabel(), targetLabel)
155160
+ String.format(
156161
"To inspect the select(), run: bazel query --output=build %s.\n", targetLabel)
157162
+ "For more help, see https://bazel.build/reference/be/functions#select.\n\n";
158-
sink.acceptConfigConditionsError(
159-
new ConfiguredValueCreationException(targetAndConfiguration, message));
163+
sink.acceptConfigConditionsError(new ConfiguredValueCreationException(target, message));
160164
return runAfter;
161165
}
162166
}
@@ -200,9 +204,7 @@ private void emitErrorIfMostImportant(@Nullable DetailedExitCode newExitCode) {
200204
// The precise error is reported by the dependency that failed to load.
201205
// TODO(gregce): beautify this error: https://github.com/bazelbuild/bazel/issues/11984.
202206
new ConfiguredValueCreationException(
203-
targetAndConfiguration,
204-
"errors encountered resolving select() keys for "
205-
+ targetAndConfiguration.getLabel()));
207+
target, "errors encountered resolving select() keys for " + targetLabel));
206208
}
207209
}
208210
}

src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyContextProducer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.google.devtools.build.lib.analysis.TransitiveDependencyState;
1919
import com.google.devtools.build.lib.analysis.config.ConfigConditions;
2020
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
21+
import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
2122
import com.google.devtools.build.lib.skyframe.ConfiguredValueCreationException;
2223
import com.google.devtools.build.lib.skyframe.toolchains.ToolchainException;
2324
import com.google.devtools.build.lib.skyframe.toolchains.UnloadedToolchainContext;
@@ -56,6 +57,7 @@ public interface ResultSink {
5657
// -------------------- Input --------------------
5758
private final UnloadedToolchainContextsInputs unloadedToolchainContextsInputs;
5859
private final TargetAndConfiguration targetAndConfiguration;
60+
private final BuildConfigurationKey buildConfigurationKey;
5961
private final TransitiveDependencyState transitiveState;
6062

6163
// -------------------- Output --------------------
@@ -70,9 +72,12 @@ public interface ResultSink {
7072
public DependencyContextProducer(
7173
UnloadedToolchainContextsInputs unloadedToolchainContextsInputs,
7274
TargetAndConfiguration targetAndConfiguration,
75+
BuildConfigurationKey buildConfigurationKey,
7376
TransitiveDependencyState transitiveState,
7477
ResultSink sink) {
7578
this.unloadedToolchainContextsInputs = unloadedToolchainContextsInputs;
79+
this.buildConfigurationKey = buildConfigurationKey;
80+
this.unloadedToolchainContexts = null;
7681
this.targetAndConfiguration = targetAndConfiguration;
7782
this.transitiveState = transitiveState;
7883
this.sink = sink;
@@ -104,7 +109,9 @@ private StateMachine computeConfigConditions(Tasks tasks) {
104109
}
105110

106111
return new ConfigConditionsProducer(
107-
targetAndConfiguration,
112+
targetAndConfiguration.getTarget(),
113+
targetAndConfiguration.getTarget().getLabel(),
114+
buildConfigurationKey,
108115
unloadedToolchainContexts == null ? null : unloadedToolchainContexts.getTargetPlatform(),
109116
transitiveState,
110117
(ConfigConditionsProducer.ResultSink) this,

src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyContextProducerWithCompatibilityCheck.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ public StateMachine step(Tasks tasks) {
8181
// If `defaultToolchainContextKey` is null, there's no platform info, incompatibility check
8282
// or toolchain resolution. Short-circuits and computes only the ConfigConditions.
8383
return new ConfigConditionsProducer(
84-
targetAndConfiguration,
84+
targetAndConfiguration.getTarget(),
85+
targetAndConfiguration.getTarget().getLabel(),
86+
configuredTargetKey.getConfigurationKey(),
8587
/* targetPlatformInfo= */ null,
8688
transitiveState,
8789
(ConfigConditionsProducer.ResultSink) this,
@@ -119,7 +121,9 @@ private StateMachine computeConfigConditions(Tasks tasks) {
119121
}
120122

121123
return new ConfigConditionsProducer(
122-
targetAndConfiguration,
124+
targetAndConfiguration.getTarget(),
125+
targetAndConfiguration.getTarget().getLabel(),
126+
configuredTargetKey.getConfigurationKey(),
123127
targetPlatformInfo,
124128
transitiveState,
125129
(ConfigConditionsProducer.ResultSink) this,

src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyProducer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,10 @@ private StateMachine postEvent(Tasks tasks) {
376376
DependencyError.of(
377377
new DependencyEvaluationException(
378378
new ConfiguredValueCreationException(
379+
parameters.target(),
379380
parameters.location(),
380381
message,
381-
toLabel,
382+
parameters.label(),
382383
parameters.eventId(),
383384
/* rootCauses= */ null,
384385
/* detailedExitCode= */ null),

src/main/java/com/google/devtools/build/lib/analysis/producers/PrerequisitesProducer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ public void acceptConfiguredAspectError(DuplicateException error) {
242242
sink.acceptPrerequisitesAspectError(
243243
new DependencyEvaluationException(
244244
new ConfiguredValueCreationException(
245+
parameters.target(),
245246
parameters.location(),
246247
error.getMessage(),
247248
parameters.label(),

0 commit comments

Comments
 (0)