# 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](BUILD) provides detailed implementation walkthrough. The fundamental
sequence is:

1. Define the toolchain
1. 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](https://docs.bazel.build/versions/master/platforms.html#skipping-incompatible-targets). See
[Building with
Platforms](https://docs.bazel.build/versions/master/platforms-intro.html) and
its [C++
notes](https://docs.bazel.build/versions/master/platforms-intro.html#c) 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](https://docs.bazel.build/versions/master/toolchains.html#registering-and-building-with-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
```
