This example shows how to define and use a simple custom C++ toolchain.
Output is non-functional: simple scripts replace compilation and linking with I compiled!
and I linked!
messages.
BUILD provides detailed implementation walkthrough. The fundamental sequence is:
1
is C++-specific: the logic and structure depends specifically on C++'s language model. Other languages have their own models.
2
supports two variations. --crosstool_top
/ --cpu
, the legacy version, is C++-specific. --platforms
, the modern version, is much more generic and supports all languages and features like incompatible target skipping. See Building with Platforms and its C++ notes for full review.
$ bazel clean $ bazel build //examples/custom_toolchain:buildme $ file bazel-bin/examples/custom_toolchain/libbuildme.a bazel-bin/examples/custom_toolchain/libbuildme.a: current ar archive
This mode requires --incompatible_enable_cc_toolchain_resolution
. Without this flag, --platforms
and --extra_toolchains
are ignored and the default toolchain triggers.
$ bazel clean $ bazel build //examples/custom_toolchain:buildme --platforms=//examples/custom_toolchain:x86_platform --extra_toolchains=//examples/custom_toolchain:platform_based_toolchain --incompatible_enable_cc_toolchain_resolution DEBUG: /usr/local/google/home/gregce/bazel/rules_cc/examples/custom_toolchain/toolchain_config.bzl:17:10: Invoking my custom toolchain! INFO: From Compiling examples/custom_toolchain/buildme.cc: examples/custom_toolchain/sample_compiler: running sample cc_library compiler (produces .o output). INFO: From Linking examples/custom_toolchain/libbuildme.a: examples/custom_toolchain/sample_linker: running sample cc_library linker (produces .a output). $ cat bazel-bin/examples/custom_toolchain/libbuildme.a examples/custom_toolchain/sample_linker: sample output
This example uses a long command line for demonstration purposes. A real project would register toolchains in WORKSPACE
and auto-set --incompatible_enable_cc_toolchain_resolution
. That reduces the command to:
$ bazel build //examples/custom_toolchain:buildme --platforms=//examples/custom_toolchain:x86_platform
$ bazel clean $ bazel build //examples/custom_toolchain:buildme --crosstool_top=//examples/custom_toolchain:legacy_selector --cpu=x86 DEBUG: /usr/local/google/home/gregce/bazel/rules_cc/examples/custom_toolchain/toolchain_config.bzl:17:10: Invoking my custom toolchain! INFO: From Compiling examples/custom_toolchain/buildme.cc: examples/custom_toolchain/sample_compiler: running sample cc_library compiler (produces .o output). INFO: From Linking examples/custom_toolchain/libbuildme.a: examples/custom_toolchain/sample_linker: running sample cc_library linker (produces .a output). $ cat bazel-bin/examples/custom_toolchain/libbuildme.a examples/custom_toolchain/sample_linker: sample output