@@ -1066,4 +1066,163 @@ function test_aquery_incompatible_target() {
1066
1066
expect_log "target platform (//target_skipping:foo3_platform) didn't satisfy constraint //target_skipping:foo1"
1067
1067
}
1068
1068
1069
+ # Use aspects to interact with incompatible targets and validate the behaviour.
1070
+ function test_aspect_skipping() {
1071
+ cat >> target_skipping/BUILD <<EOF
1072
+ load(":defs.bzl", "basic_rule", "rule_with_aspect")
1073
+ # This target is compatible with all platforms and configurations. This target
1074
+ # exists to validate the behaviour of aspects running against incompatible
1075
+ # targets. The expectation is that the aspect should _not_ propagate to this
1076
+ # compatible target from an incomaptible target. I.e. an aspect should _not_
1077
+ # evaluate this target if "basic_foo3_target" is incompatible.
1078
+ basic_rule(
1079
+ name = "basic_universal_target",
1080
+ )
1081
+ # An alias to validate that incompatible target skipping works as expected with
1082
+ # aliases and aspects.
1083
+ alias(
1084
+ name = "aliased_basic_universal_target",
1085
+ actual = ":basic_universal_target",
1086
+ )
1087
+ basic_rule(
1088
+ name = "basic_foo3_target",
1089
+ deps = [
1090
+ ":aliased_basic_universal_target",
1091
+ ],
1092
+ target_compatible_with = [
1093
+ ":foo3",
1094
+ ],
1095
+ )
1096
+ # This target is only compatible when "basic_foo3_target" is compatible. This
1097
+ # target exists to validate the behaviour of aspects running against
1098
+ # incompatible targets. The expectation is that the aspect should _not_
1099
+ # evaluate this target when "basic_foo3_target" is incompatible.
1100
+ basic_rule(
1101
+ name = "other_basic_target",
1102
+ deps = [
1103
+ ":basic_foo3_target",
1104
+ ],
1105
+ )
1106
+ alias(
1107
+ name = "aliased_other_basic_target",
1108
+ actual = ":other_basic_target",
1109
+ )
1110
+ rule_with_aspect(
1111
+ name = "inspected_foo3_target",
1112
+ inspect = ":aliased_other_basic_target",
1113
+ )
1114
+ basic_rule(
1115
+ name = "previously_inspected_basic_target",
1116
+ deps = [
1117
+ ":inspected_foo3_target",
1118
+ ],
1119
+ )
1120
+ rule_with_aspect(
1121
+ name = "twice_inspected_foo3_target",
1122
+ inspect = ":previously_inspected_basic_target",
1123
+ )
1124
+ genrule(
1125
+ name = "generated_file",
1126
+ outs = ["generated_file.txt"],
1127
+ cmd = "echo '' > \$ (OUTS)",
1128
+ target_compatible_with = [
1129
+ ":foo1",
1130
+ ],
1131
+ )
1132
+ rule_with_aspect(
1133
+ name = "inspected_generated_file",
1134
+ inspect = ":generated_file",
1135
+ )
1136
+ EOF
1137
+ cat > target_skipping/defs.bzl <<EOF
1138
+ BasicProvider = provider()
1139
+ def _basic_rule_impl(ctx):
1140
+ return [DefaultInfo(), BasicProvider()]
1141
+ basic_rule = rule(
1142
+ implementation = _basic_rule_impl,
1143
+ attrs = {
1144
+ "deps": attr.label_list(
1145
+ providers = [BasicProvider],
1146
+ ),
1147
+ },
1148
+ )
1149
+ def _inspecting_aspect_impl(target, ctx):
1150
+ print("Running aspect on " + str(target))
1151
+ return []
1152
+ _inspecting_aspect = aspect(
1153
+ implementation = _inspecting_aspect_impl,
1154
+ attr_aspects = ["deps"],
1155
+ )
1156
+ def _rule_with_aspect_impl(ctx):
1157
+ out = ctx.actions.declare_file(ctx.label.name)
1158
+ ctx.actions.write(out, "")
1159
+ return [
1160
+ DefaultInfo(files=depset([out])),
1161
+ BasicProvider(),
1162
+ ]
1163
+ rule_with_aspect = rule(
1164
+ implementation = _rule_with_aspect_impl,
1165
+ attrs = {
1166
+ "inspect": attr.label(
1167
+ aspects = [_inspecting_aspect],
1168
+ ),
1169
+ },
1170
+ )
1171
+ EOF
1172
+ cd target_skipping || fail "couldn't cd into workspace"
1173
+ local debug_message1="Running aspect on <target //target_skipping:basic_universal_target>"
1174
+ local debug_message2="Running aspect on <target //target_skipping:basic_foo3_target>"
1175
+ local debug_message3="Running aspect on <target //target_skipping:other_basic_target>"
1176
+ local debug_message4="Running aspect on <target //target_skipping:previously_inspected_basic_target>"
1177
+ local debug_message5="Running aspect on <target //target_skipping:generated_file>"
1178
+ # Validate that aspects run against compatible targets.
1179
+ bazel build \
1180
+ --show_result=10 \
1181
+ --host_platform=@//target_skipping:foo3_platform \
1182
+ --platforms=@//target_skipping:foo3_platform \
1183
+ //target_skipping:all &> "${TEST_log} " \
1184
+ || fail "Bazel failed unexpectedly."
1185
+ expect_log "${debug_message1} "
1186
+ expect_log "${debug_message2} "
1187
+ expect_log "${debug_message3} "
1188
+ expect_log "${debug_message4} "
1189
+ expect_not_log "${debug_message5} "
1190
+ # Invert the compatibility and validate that aspects run on the other targets
1191
+ # now.
1192
+ bazel build \
1193
+ --show_result=10 \
1194
+ --host_platform=@//target_skipping:foo1_bar1_platform \
1195
+ --platforms=@//target_skipping:foo1_bar1_platform \
1196
+ //target_skipping:all &> "${TEST_log} " \
1197
+ || fail "Bazel failed unexpectedly."
1198
+ expect_not_log "${debug_message1} "
1199
+ expect_not_log "${debug_message2} "
1200
+ expect_not_log "${debug_message3} "
1201
+ expect_not_log "${debug_message4} "
1202
+ expect_log "${debug_message5} "
1203
+ # Validate that explicitly trying to build a target with an aspect against an
1204
+ # incompatible target produces the normal error message.
1205
+ bazel build \
1206
+ --show_result=10 \
1207
+ --host_platform=@//target_skipping:foo1_bar1_platform \
1208
+ --platforms=@//target_skipping:foo1_bar1_platform \
1209
+ //target_skipping:twice_inspected_foo3_target &> "${TEST_log} " \
1210
+ && fail "Bazel passed unexpectedly."
1211
+ # TODO(#15427): Should use expect_log_once here when the issue is fixed.
1212
+ expect_log 'ERROR: Target //target_skipping:twice_inspected_foo3_target is incompatible and cannot be built, but was explicitly requested.'
1213
+ expect_log '^Dependency chain:$'
1214
+ expect_log '^ //target_skipping:twice_inspected_foo3_target$'
1215
+ expect_log '^ //target_skipping:previously_inspected_basic_target$'
1216
+ expect_log '^ //target_skipping:inspected_foo3_target$'
1217
+ expect_log '^ //target_skipping:aliased_other_basic_target$'
1218
+ expect_log '^ //target_skipping:other_basic_target$'
1219
+ expect_log " //target_skipping:basic_foo3_target <-- target platform (//target_skipping:foo1_bar1_platform) didn't satisfy constraint //target_skipping:foo3$"
1220
+ expect_log 'FAILED: Build did NOT complete successfully'
1221
+ expect_not_log "${debug_message1} "
1222
+ expect_not_log "${debug_message2} "
1223
+ expect_not_log "${debug_message3} "
1224
+ expect_not_log "${debug_message4} "
1225
+ expect_not_log "${debug_message5} "
1226
+ }
1227
+
1069
1228
run_suite "target_compatible_with tests"
0 commit comments