Skip to content

Commit 706f5ac

Browse files
philsccopybara-github
authored andcommitted
Fix bazel crash when passing config_setting to target_compatible_with
When you pass a `config_setting` into a target's `target_compatible_with` attribute, we see the following crash: FATAL: bazel crashed due to an internal error. Printing stack trace: java.lang.RuntimeException: Unrecoverable error while evaluating node 'ConfiguredTargetKey{label=//:hello, config=BuildConfigurationValue.Key[86e57527e1c8bb10edc853e734cb858f8159d8f3e0a4df9ceb16f80aad784b93]}' (requested by nodes ) at com.google.devtools.build.skyframe.AbstractParallelEvaluator$Evaluate.run(AbstractParallelEvaluator.java:563) at com.google.devtools.build.lib.concurrent.AbstractQueueVisitor$WrappedRunnable.run(AbstractQueueVisitor.java:398) at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(Unknown Source) at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source) at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source) at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) Caused by: java.lang.NullPointerException at com.google.devtools.build.lib.analysis.platform.ConstraintCollection.hasConstraintValue(ConstraintCollection.java:216) at com.google.devtools.build.lib.analysis.RuleContext.targetPlatformHasConstraint(RuleContext.java:1226) at com.google.devtools.build.lib.analysis.constraints.RuleContextConstraintSemantics.lambda$incompatibleConfiguredTarget$1(RuleContextConstraintSemantics.java:904) at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) at com.google.common.collect.CollectSpliterators$1.lambda$forEachRemaining$1(CollectSpliterators.java:120) at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(Unknown Source) at com.google.common.collect.CollectSpliterators$1.forEachRemaining(CollectSpliterators.java:120) at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source) at com.google.devtools.build.lib.analysis.constraints.RuleContextConstraintSemantics.incompatibleConfiguredTarget(RuleContextConstraintSemantics.java:905) at com.google.devtools.build.lib.analysis.ConfiguredTargetFactory.createRule(ConfiguredTargetFactory.java:327) at com.google.devtools.build.lib.analysis.ConfiguredTargetFactory.createConfiguredTarget(ConfiguredTargetFactory.java:194) at com.google.devtools.build.lib.skyframe.SkyframeBuildView.createConfiguredTarget(SkyframeBuildView.java:938) at com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.createConfiguredTarget(ConfiguredTargetFunction.java:1013) at com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.compute(ConfiguredTargetFunction.java:371) at com.google.devtools.build.skyframe.AbstractParallelEvaluator$Evaluate.run(AbstractParallelEvaluator.java:477) ... 7 more This happens because we discard various errors generated in the `RuleContext` builder when the `target_compatible_with` attribute is specified. This is not the desired behaviour. This patch changes the code so that the `RuleContext` errors are checked before evaluating the `target_compatible_with` attribute. That way Bazel can tell the user something's wrong without crashing. In the above example we now see this error message: ERROR: /bazel-cache/phil/bazel/_bazel_phil/c2296ba7b90d1074a9fe6e8d3b871222/sandbox/linux-sandbox/129/execroot/io_bazel/_tmp/c749fd38ac9a4ad6bd41e9653bbceab5/workspace/target_skipping/BUILD:101:10: in target_compatible_with attribute of sh_binary rule //target_skipping:problematic_foo3_target: '//target_skipping:foo3_config_setting' does not have mandatory providers: 'ConstraintValueInfo' That should be sufficient to let the user know that they need to specify `constraint_value` targets instead. Fixes bazelbuild#13250 Closes bazelbuild#13254. PiperOrigin-RevId: 364308810
1 parent 72b1c2c commit 706f5ac

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -322,12 +322,6 @@ private ConfiguredTarget createRule(
322322
prerequisiteMap.values()))
323323
.build();
324324

325-
ConfiguredTarget incompatibleTarget =
326-
RuleContextConstraintSemantics.incompatibleConfiguredTarget(ruleContext, prerequisiteMap);
327-
if (incompatibleTarget != null) {
328-
return incompatibleTarget;
329-
}
330-
331325
List<NestedSet<AnalysisFailure>> analysisFailures = depAnalysisFailures(ruleContext);
332326
if (!analysisFailures.isEmpty()) {
333327
return erroredConfiguredTargetWithFailures(ruleContext, analysisFailures);
@@ -336,6 +330,12 @@ private ConfiguredTarget createRule(
336330
return erroredConfiguredTarget(ruleContext);
337331
}
338332

333+
ConfiguredTarget incompatibleTarget =
334+
RuleContextConstraintSemantics.incompatibleConfiguredTarget(ruleContext, prerequisiteMap);
335+
if (incompatibleTarget != null) {
336+
return incompatibleTarget;
337+
}
338+
339339
try {
340340
Class<?> missingFragmentClass = null;
341341
for (Class<?> fragmentClass :

src/test/shell/integration/target_compatible_with_test.sh

+30
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,36 @@ function tear_down() {
192192
bazel shutdown
193193
}
194194
195+
# Validates that we get a good error message when passing a config_setting into
196+
# the target_compatible_with attribute. This is a regression test for
197+
# https://github.com/bazelbuild/bazel/issues/13250.
198+
function test_config_setting_in_target_compatible_with() {
199+
cat >> target_skipping/BUILD <<EOF
200+
config_setting(
201+
name = "foo3_config_setting",
202+
constraint_values = [":foo3"],
203+
)
204+
205+
sh_binary(
206+
name = "problematic_foo3_target",
207+
srcs = ["pass.sh"],
208+
target_compatible_with = [
209+
":foo3_config_setting",
210+
],
211+
)
212+
EOF
213+
214+
cd target_skipping || fail "couldn't cd into workspace"
215+
216+
bazel build \
217+
--show_result=10 \
218+
--host_platform=@//target_skipping:foo3_platform \
219+
--platforms=@//target_skipping:foo3_platform \
220+
... &> "${TEST_log}" && fail "Bazel succeeded unexpectedly."
221+
222+
expect_log "'//target_skipping:foo3_config_setting' does not have mandatory providers: 'ConstraintValueInfo'"
223+
}
224+
195225
# Validates that the console log provides useful information to the user for
196226
# builds.
197227
function test_console_log_for_builds() {

0 commit comments

Comments
 (0)