blob: 57b0b63ce3af9469311f467b9f745e0843cd6f08 [file] [log] [blame] [view]
# Fuchsia Build System: Variants
The Fuchsia GN build machinery allows for separate components to be built
in different "variants". A variant usually just means using extra compiler
options, but they can do more than that if you write some more GN code.
The variants defined so far enable things like
[sanitizers](https://github.com/google/sanitizers/wiki) and
[LTO](https://llvm.org/docs/LinkTimeOptimization.html).
The GN build argument
[`select_variant`](/docs/gen/build_arguments.md#select_variant)
controls which components are built in which variants. It applies
automatically to every `executable`, `loadable_module`, or `driver_module`
target in GN files. It's a flexible mechanism in which you give a list of
matching rules to apply to each target to decide which variant to use (if
any). To support this flexibility, the value for `select_variant` uses a
detailed GN syntax. For simple cases, this can just be a list of strings.
Using `fx set`:
```sh
fx set core.x64 --variant={host_asan,asan/cat,asan/ledger}
```
Alternatively, you can add or modify the variants on an existing build by
editing the GN args (substituting your build's GN output directory
for `out/default` as necessary):
```sh
./buildtools/gn args out/default
```
That command will bring up an editor. Append to that file:
```
select_variant = [ "host_asan", "asan/cat", "asan/ledger" ]
```
1. The first switch applies the `host_asan` matching rule, which enables
[AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html)
for all the executables built to run on the build host.
2. The second switch applies the `asan` matching rule, which enables
AddressSanitizer for executables built to run on the target (i.e. the
Fuchsia device). The `/cat` suffix constrains this matching rule only
to the binary named `cat`.
3. The third switch is like the second, but matches the binary named `ledger`.
The GN code supports much more flexible matching rules than just the binary
name, but there are no shorthands for those. See the
[`select_variant`](/docs/gen/build_arguments.md#select_variant)
build argument documentation for more details.
To see the list of variants available and learn more about how to define
new ones, see the
[`known_variants`](/docs/gen/build_arguments.md#known_variants)
build argument.