Skip to content

Toolchain being resolved for a wrong platform in Bazel 8 #28127

@mariusz-wlodarczyk

Description

@mariusz-wlodarczyk

Description of the bug:

We have a situation where we're using a Go binary (courtesy of rules_go's go_binary) in files of a CC toolchain (as a wrapper for the actual compiler driver as it's a proprietary toolchain with some non-standard behaviors, e.g. licensing requirements).

It looks like this:

# toolchains/wrapper/BUILD
go_binary(
    name = "wrapper",
    embed = [":wrapper_lib"],
    visibility = ["//visibility:public"],
)
# toolchains/custom_toolchain/BUILD
toolchain(
    name = "toolchain",
    exec_compatible_with = [
        "@platforms//os:linux",
        "@platforms//cpu:x86_64",
    ],
    target_compatible_with = [
        "//:custom_cpu",
    ],
    toolchain = ":cc_toolchain",
    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
    tags = ["manual"],
)

filegroup(
    name = "all_files",
    srcs = [
        "//toolchains/wrapper",
    ],
    tags = ["manual"],
)

cc_toolchain(
    name = "cc_toolchain",
    all_files = ":all_files",
    ar_files = ":all_files",
    compiler_files = ":all_files",
    dwp_files = ":all_files",
    linker_files = ":all_files",
    objcopy_files = ":all_files",
    strip_files = ":all_files",
    tags = ["manual"],
    toolchain_config = ":cc_toolchain_config",
)

cc_toolchain_config(
    name = "cc_toolchain_config",
    driver_executable = "//toolchains/wrapper",
    tags = ["manual"],
)
# BUILD
constraint_value(
    name = "custom_cpu",
    constraint_setting = "@platforms//cpu:cpu",
)

platform(
    name = "custom_platform",
    constraint_values = [
        ":custom_cpu",
    ],
)

cc_library(
    name = "my_lib",
    srcs = ["lib.c"],
)

So, the thing is that with Bazel 7 (any minor version) the Go toolchain used for building the go_binary target is selected for the host platform (that is, when I select a different target platform with --platforms):

$ bazel build :my_lib --platforms=:custom_platform --toolchain_resolution_debug='.*'
...
INFO: ToolchainResolution: Target platform //:custom_platform: Selected execution platform @@platforms//host:host,
INFO: ToolchainResolution: Performing resolution of @@rules_go~//go:toolchain for target platform @@platforms//host:host
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_aix_ppc64-impl; mismatching values: aix, ppc
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_386-impl; mismatching values: android, x86_32
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_amd64-impl; mismatching values: android
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_arm-impl; mismatching values: android, armv7
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_arm64-impl; mismatching values: android, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_386-impl; mismatching values: osx, x86_32
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_amd64-impl; mismatching values: osx
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_arm-impl; mismatching values: osx, armv7
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_arm64-impl; mismatching values: osx, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_dragonfly_amd64-impl; mismatching values: dragonfly
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_386-impl; mismatching values: freebsd, x86_32
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_amd64-impl; mismatching values: freebsd
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_arm-impl; mismatching values: freebsd, armv7
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_arm64-impl; mismatching values: freebsd, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_illumos_amd64-impl; mismatching values: illumos
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_ios_amd64-impl; mismatching values: ios
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_ios_arm64-impl; mismatching values: ios, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_js_wasm-impl; mismatching values: js, wasm
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_386-impl; mismatching values: x86_32
      ToolchainResolution:   Toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_amd64-impl is compatible with target plaform, searching for execution platforms:
      ToolchainResolution:     Compatible execution platform @@platforms//host:host
      ToolchainResolution:   All execution platforms have been assigned a @@rules_go~//go:toolchain toolchain, stopping
      ToolchainResolution: Recap of selected @@rules_go~//go:toolchain toolchains for target platform @@platforms//host:host:
      ToolchainResolution:   Selected @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_amd64-impl to run on execution platform @@platforms//host:host
INFO: ToolchainResolution: Target platform @@platforms//host:host: Selected execution platform @@platforms//host:host, type @@rules_go~//go:toolchain -> toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_amd64-impl
INFO: ToolchainResolution: Target platform @@platforms//host:host: Selected execution platform @@platforms//host:host,
INFO: ToolchainResolution: Target platform @@platforms//host:host: Selected execution platform @@platforms//host:host,
INFO: ToolchainResolution: Target platform @@platforms//host:host: Selected execution platform @@platforms//host:host,
INFO: ToolchainResolution: Performing resolution of @@rules_go~//go:toolchain for target platform @@platforms//host:host
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_aix_ppc64-impl; mismatching values: aix, ppc
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_386-impl; mismatching values: android, x86_32
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_amd64-impl; mismatching values: android
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_arm-impl; mismatching values: android, armv7
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_android_arm64-impl; mismatching values: android, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_386-impl; mismatching values: osx, x86_32
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_amd64-impl; mismatching values: osx
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_arm-impl; mismatching values: osx, armv7
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_darwin_arm64-impl; mismatching values: osx, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_dragonfly_amd64-impl; mismatching values: dragonfly
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_386-impl; mismatching values: freebsd, x86_32
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_amd64-impl; mismatching values: freebsd
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_arm-impl; mismatching values: freebsd, armv7
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_freebsd_arm64-impl; mismatching values: freebsd, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_illumos_amd64-impl; mismatching values: illumos
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_ios_amd64-impl; mismatching values: ios
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_ios_arm64-impl; mismatching values: ios, aarch64
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_js_wasm-impl; mismatching values: js, wasm
      ToolchainResolution:   Rejected toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_386-impl; mismatching values: x86_32
      ToolchainResolution:   Toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_amd64-impl is compatible with target plaform, searching for execution platforms:
      ToolchainResolution:     Compatible execution platform @@platforms//host:host
      ToolchainResolution:   All execution platforms have been assigned a @@rules_go~//go:toolchain toolchain, stopping
      ToolchainResolution: Recap of selected @@rules_go~//go:toolchain toolchains for target platform @@platforms//host:host:
      ToolchainResolution:   Selected @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_amd64-impl to run on execution platform @@platforms//host:host
INFO: ToolchainResolution: Target platform @@platforms//host:host: Selected execution platform @@platforms//host:host, type @@rules_go~//go:toolchain -> toolchain @@rules_go~~go_sdk~go_toolchain_wrapper__download_0//:go_linux_amd64-impl
INFO: ToolchainResolution: Target platform @@platforms//host:host: Selected execution platform @@platforms//host:host,
...
INFO: Build completed successfully, 9 total actions

But, using Bazel 8 (any minor version) resuls in Bazel searching for the Go toolchain for the target platform, not the execution platform (as was the case with Bazel 7):

$ bazel build :my_lib --platforms=:custom_platform --toolchain_resolution_debug='.*'
INFO: ToolchainResolution: Target platform //:custom_platform: Selected execution platform @@platforms//host:host,
INFO: ToolchainResolution: Target platform @@platforms//host:host: Selected execution platform @@platforms//host:host,
INFO: ToolchainResolution: Performing resolution of @@rules_go+//go:toolchain for target platform //:custom_platform
      ToolchainResolution:   Rejected toolchain @@rules_go++go_sdk+go_toolchain_wrapper__download_0//:go_aix_ppc64-impl; mismatching values: aix, ppc
      ...
      ToolchainResolution:   Rejected toolchain @@rules_go++go_sdk+rules_go__download_0_windows_arm64//:go_windows_arm64-impl; mismatching values: windows, aarch64
      ToolchainResolution: No @@rules_go+//go:toolchain toolchain found for target platform //:custom_platform.
ERROR: /home/mario/ttt/toolchains/wrapper/BUILD:10:10: While resolving toolchains for target //toolchains/wrapper:wrapper (b5bf0ec): No matching toolchains found for types:
  @@rules_go+//go:toolchain
To debug, rerun with --toolchain_resolution_debug='@@rules_go+//go:toolchain'
For more information on platforms or toolchains see https://bazel.build/concepts/platforms-intro.
ERROR: Analysis of target '//:my_lib' failed; build aborted: Analysis failed
INFO: Elapsed time: 22.037s, Critical Path: 0.04s
INFO: 1 process: 1 internal.
ERROR: Build did NOT complete successfully

Essentially, Bazel 7 does:

Performing resolution of @@rules_go~//go:toolchain for target platform @@platforms//host:host

whereas Bazel 8 does:

Performing resolution of @@rules_go+//go:toolchain for target platform //:custom_platform

which, obviously, does not work as there is no Go toolchain for a custom CPU (@platforms//cpu:cpu).

Changing vesions of rules_go, platforms and rules_cc does not influence this behavior.

Is there something that could be done to work around that? I know we could use a custom constraint setting (rather than @platforms//cpu:cpu) to select our CC toolchain but that's not a nice solution as it'd require a lot of changes in our codebase.

Which category does this issue belong to?

Core

What's the simplest, easiest way to reproduce this bug? Please provide a minimal example if possible.

Please find the reproducible example below:

bazel_8_go_toolchain_resolution_issue.zip

Which operating system are you running Bazel on?

Linux

What is the output of bazel info release?

release 7.x.x/release 8.x.x

If bazel info release returns development version or (@non-git), tell us how you built Bazel.

n/a

What's the output of git remote get-url origin; git rev-parse HEAD ?

n/a

If this is a regression, please try to identify the Bazel commit where the bug was introduced with bazelisk --bisect.

n/a

Have you found anything relevant by searching the web?

Nothing in GH issues, nor SO.

Any other information, logs, or outputs that you want to share?

n/a

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions