rules_cc/examples/custom_toolchain
Googler 56f4a8bfa1 Add testing for Bazel@HEAD and Bazel 6
PiperOrigin-RevId: 684046113
Change-Id: I98875f8c67b491759f121c21e33ed04ec1d590e0
2024-10-09 08:26:06 -07:00
..
BUILD Add testing for Bazel@HEAD and Bazel 6 2024-10-09 08:26:06 -07:00
README.md Typo fixes 2021-02-11 16:07:27 -05:00
buildme.cc Add custom C++ toolchain example. 2021-02-11 15:53:44 -05:00
sample_compiler Add custom C++ toolchain example. 2021-02-11 15:53:44 -05:00
sample_linker Add custom C++ toolchain example. 2021-02-11 15:53:44 -05:00
toolchain_config.bzl Sync cc toolchain from Bazel's tools/cpp 2024-10-03 09:32:38 -07:00

README.md

Writing a custom C++ toolchain

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. Define the toolchain
  2. Define how to invoke the toolchain.

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.

Building with the default toolchain

$ 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

Custom toolchain with platforms

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

Custom toolchain with legacy selection:

$ 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