Make toolchain.toolchain configurable. This attribute was previously non-configurable but as it turns out this restriction is not necessary. Loosening it allows toolchain authors to more easily switch between different toolchain implementations based on a select(). RELNOTES: None. PiperOrigin-RevId: 262599150
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ToolchainRule.java index c1aa78b..d5703f2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/platform/ToolchainRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ToolchainRule.java
@@ -84,10 +84,7 @@ <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ // This needs to not introduce a dependency so that we can load the toolchain only if it is // needed. - .add( - attr(TOOLCHAIN_ATTR, BuildType.NODEP_LABEL) - .mandatory() - .nonconfigurable("part of toolchain configuration")) + .add(attr(TOOLCHAIN_ATTR, BuildType.NODEP_LABEL).mandatory()) .build(); }
diff --git a/src/test/shell/bazel/toolchain_test.sh b/src/test/shell/bazel/toolchain_test.sh index 1b75ce1..c37fe28 100755 --- a/src/test/shell/bazel/toolchain_test.sh +++ b/src/test/shell/bazel/toolchain_test.sh
@@ -1559,6 +1559,84 @@ grep "config2 selected" bazel-bin/demo.log || fail "config2 expected" } +function test_toolchain_modes { + write_test_toolchain foo_toolchain + write_test_rule test_rule foo_toolchain + + mkdir -p project + cat > project/flags.bzl <<EOF +def _impl(ctx): + pass + +string_flag = rule( + implementation = _impl, + build_setting = config.string(flag = True), +) +EOF + + cat >> project/BUILD <<EOF +load('//toolchain:toolchain_foo_toolchain.bzl', 'foo_toolchain') +load('//toolchain:rule_test_rule.bzl', 'test_rule') +load('//project:flags.bzl', 'string_flag') + +string_flag( + name = 'version', + build_setting_default = 'production' +) + +config_setting( + name = 'production', + flag_values = { + ':version': 'production' + } +) + +config_setting( + name = 'unstable', + flag_values = { + ':version': 'unstable' + } +) + +filegroup(name = 'dep') +foo_toolchain( + name = 'production_toolchain', + extra_label = ':dep', + extra_str = 'production', +) + +foo_toolchain( + name = 'unstable_toolchain', + extra_label = ':dep', + extra_str = 'unstable', +) + +toolchain( + name = 'toolchain', + toolchain_type = '//toolchain:foo_toolchain', + toolchain = select({ + ':production': ':production_toolchain', + ':unstable': ':unstable_toolchain', + }) +) + +test_rule( + name = 'test', + message = 'hello', +) +EOF + + cat >> WORKSPACE <<EOF +register_toolchains('//project:toolchain') +EOF + + bazel build //project:test &> "${TEST_log}" || fail "Build failed" + expect_log 'Using toolchain: rule message: "hello", toolchain extra_str: "production"' + + bazel build --//project:version="unstable" //project:test &> "${TEST_log}" || fail "Build failed" + expect_log 'Using toolchain: rule message: "hello", toolchain extra_str: "unstable"' +} + # TODO(katre): Test using toolchain-provided make variables from a genrule. run_suite "toolchain tests"