Update ToolchainResolver to properly deal with aliases as toolchain targets.
Closes #7543.
PiperOrigin-RevId: 235751297
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
index 801df3d..64c8af2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
@@ -33,6 +33,7 @@
import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Event;
+import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
@@ -521,17 +522,22 @@
ImmutableList.Builder<TemplateVariableInfo> templateVariableProviders =
new ImmutableList.Builder<>();
for (ConfiguredTargetAndData target : toolchainTargets) {
- Label discoveredLabel = target.getTarget().getLabel();
+ Label discoveredLabel;
+ // Aliases are in toolchainTypeToResolved by the original alias label, not via the final
+ // target's label.
+ if (target.getConfiguredTarget() instanceof AliasConfiguredTarget) {
+ discoveredLabel =
+ ((AliasConfiguredTarget) target.getConfiguredTarget()).getOriginalLabel();
+ } else {
+ discoveredLabel = target.getConfiguredTarget().getLabel();
+ }
ToolchainTypeInfo toolchainType = toolchainTypeToResolved().inverse().get(discoveredLabel);
+ ToolchainInfo toolchainInfo = PlatformProviderUtils.toolchain(target.getConfiguredTarget());
// If the toolchainType hadn't been resolved to an actual toolchain, resolution would have
// failed with an error much earlier. This null check is just for safety.
- if (toolchainType != null) {
- ToolchainInfo toolchainInfo =
- PlatformProviderUtils.toolchain(target.getConfiguredTarget());
- if (toolchainInfo != null) {
- toolchains.put(toolchainType, toolchainInfo);
- }
+ if (toolchainType != null && toolchainInfo != null) {
+ toolchains.put(toolchainType, toolchainInfo);
}
// Find any template variables present for this toolchain.
diff --git a/src/test/shell/bazel/toolchain_test.sh b/src/test/shell/bazel/toolchain_test.sh
index f8c11cc..e713e10 100755
--- a/src/test/shell/bazel/toolchain_test.sh
+++ b/src/test/shell/bazel/toolchain_test.sh
@@ -187,6 +187,94 @@
expect_log 'Using toolchain: rule message: "this is the rule", toolchain extra_str: "foo from test_toolchain"'
}
+function test_toolchain_alias_use_in_rule {
+ write_test_toolchain
+ write_test_rule
+
+ cat >> BUILD <<EOF
+load('//toolchain:toolchain_test_toolchain.bzl', 'test_toolchain')
+
+# Define the toolchain.
+filegroup(name = 'dep_rule_test_toolchain')
+test_toolchain(
+ name = 'test_toolchain_impl_1',
+ extra_label = ':dep_rule_test_toolchain',
+ extra_str = 'foo from test_toolchain',
+ visibility = ['//visibility:public'])
+alias(
+ name = 'test_toolchain_impl_1_alias',
+ actual = ':test_toolchain_impl_1',
+ visibility = ['//visibility:public'])
+
+# Declare the toolchain.
+toolchain(
+ name = 'test_toolchain_1',
+ toolchain_type = '//toolchain:test_toolchain',
+ exec_compatible_with = [],
+ target_compatible_with = [],
+ toolchain = ':test_toolchain_impl_1_alias',
+ visibility = ['//visibility:public'])
+EOF
+
+ mkdir -p demo
+ cat >> demo/BUILD <<EOF
+load('//toolchain:rule_use_toolchain.bzl', 'use_toolchain')
+# Use the toolchain.
+use_toolchain(
+ name = 'use',
+ message = 'this is the rule')
+EOF
+
+ bazel build --extra_toolchains=//:test_toolchain_1 //demo:use &> $TEST_log || fail "Build failed"
+ expect_log 'Using toolchain: rule message: "this is the rule", toolchain extra_str: "foo from test_toolchain"'
+}
+
+function test_toolchain_alias_chain_use_in_rule {
+ write_test_toolchain
+ write_test_rule
+
+ cat >> BUILD <<EOF
+load('//toolchain:toolchain_test_toolchain.bzl', 'test_toolchain')
+
+# Define the toolchain.
+filegroup(name = 'dep_rule_test_toolchain')
+test_toolchain(
+ name = 'test_toolchain_impl_1',
+ extra_label = ':dep_rule_test_toolchain',
+ extra_str = 'foo from test_toolchain',
+ visibility = ['//visibility:public'])
+alias(
+ name = 'test_toolchain_impl_1_alias_alpha',
+ actual = ':test_toolchain_impl_1',
+ visibility = ['//visibility:public'])
+alias(
+ name = 'test_toolchain_impl_1_alias_beta',
+ actual = ':test_toolchain_impl_1_alias_alpha',
+ visibility = ['//visibility:public'])
+
+# Declare the toolchain.
+toolchain(
+ name = 'test_toolchain_1',
+ toolchain_type = '//toolchain:test_toolchain',
+ exec_compatible_with = [],
+ target_compatible_with = [],
+ toolchain = ':test_toolchain_impl_1_alias_beta',
+ visibility = ['//visibility:public'])
+EOF
+
+ mkdir -p demo
+ cat >> demo/BUILD <<EOF
+load('//toolchain:rule_use_toolchain.bzl', 'use_toolchain')
+# Use the toolchain.
+use_toolchain(
+ name = 'use',
+ message = 'this is the rule')
+EOF
+
+ bazel build --extra_toolchains=//:test_toolchain_1 //demo:use &> $TEST_log || fail "Build failed"
+ expect_log 'Using toolchain: rule message: "this is the rule", toolchain extra_str: "foo from test_toolchain"'
+}
+
function test_toolchain_use_in_rule_missing {
write_test_toolchain
write_test_rule