blob: 99fd56a93801c99a4dffaf2ead7399a70650053f [file] [log] [blame] [view]
# Use developer overrides for assembly of a Fuchsia product
The Fuchsia build system uses a combination of platform, product, and board
configurations to create a final product bundle. While these configurations
define the canonical version of a product, you may need to make temporary
modifications for testing or debugging. For more conceptual information about
software assembly, see [Software Assembly][software-assembly-concepts].
Developer overrides provide a mechanism to make local-only modifications to a
product's configuration without changing the source files in the Fuchsia tree.
This document explains how you can use developer overrides to modify a product's
configuration.
## Using assembly overrides {:#use-assembly-overrides}
To use developer overrides for assembly, you need to:
1. **Define the overrides** in a GN target, typically in `//local/BUILD.gn`.
2. **Apply the overrides** to your build configuration.
For example, to enable a kernel argument, first define the override in
`//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("enable_kernel_debug") {
kernel = {
command_line_args = [ "foo" ]
}
}
```
Then, apply this override to your build configuration using one of the following
methods:
* [Using `fx set`](#fx-set)
* [Using `fx args` or `args.gn``](#args-gn)
### Using `fx set` {:#fx-set}
The `fx set` command includes the `--assembly-override` option to specify an
override for the main product assembly (not the test assembly, recovery, etc...).
For example:
Note: The value used for `--assembly-override` is the identifier that you used
in your `//local/BUILD.gn` file.
```gn
fx set core.x64 --assembly-override //local:enable_kernel_debug
```
The `--assembly-override` option supports two formats:
Note: You can provide this option multiple times, but each instance must apply
to a different assembly target. An error is generated if more than one override
target matches the same assembly target.
* `--assembly-override <overrides_target>`: Applies the overrides to the main
product assembly.
For example, the following command applies the `//local:enable_kernel_debug`
override to the `core.x64` product:
```posix-terminal
fx set core.x64 --assembly-override //local:enable_kernel_debug
```
* `--assembly-override <assembly_target_pattern>=<overrides_target>`: Applies
the overrides to a specific assembly target pattern.
For example, to apply overrides defined in `//local:zedboot_overrides` only
to the `zedboot` assembly, you would run the following:
```posix-terminal
fx set core.x64 --assembly-override '//build/images/zedboot/*=//local:zedboot_overrides'
```
For more information, see the following sections:
* To learn how to specify the assembly target, see
[Product Label Patterns](#product-label-patterns).
* To learn how to define the override target, see
[Defining an `assembly_developer_overrides` target](#defining-an-assembly_developer_overrides-target).
### Using `fx args` or `args.gn` {:#args-gn}
You can apply overrides by editing your `args.gn` file or using
[`fx args`][fx-args-ref]. The following GN arguments are available:
* [`product_assembly_overrides_label`](#product-assembly-overrides-labe):
Specifies a single override target for the main product assembly.
* [`product_assembly_overrides_contents`](#product-assembly-overrides-contents):
Defines the overrides inline within `args.gn` for the main product assembly.
* [`product_assembly_overrides`](#product-assembly-overrides-contents): A list
that explicitly maps override targets to the assembly targets they apply to.
#### `product_assembly_overrides_label` {:#product-assembly-overrides-label}
The `product_assembly_overrides_label` argument applies the specified overrides
to the main assembly of the selected product. It does not affect other
product assemblies like recovery, zedboot, or tests.
Example `args.gn`:
```gn
import("//products/...")
import("//boards/...")
product_assembly_overrides_label = "//local:my_overrides"
```
#### `product_assembly_overrides_contents` {:#product-assembly-overrides-contents}
The `product_assembly_overrides_contents` argument allows you to define
overrides directly in your `args.gn`. These overrides only apply to the main
product assembly.
Example `args.gn`:
```gn
import("//products/...")
import("//boards/...")
product_assembly_overrides_contents = {
kernel = {
command_line_args = [ "kernel.enable-debugging-syscalls=true" ]
}
}
```
The value uses the same syntax as the `assembly_developer_overrides()` GN
template, see
[Defining an `assembly_developer_overrides` target](#defining-an-assembly_developer_overrides-target).
#### `product_assembly_overrides` {:#product-assembly-overrides}
The `product_assembly_overrides` argument is used to specify overrides for
multiple or non-main assemblies. It uses [GN label patterns][gn-label-patterns]
to match override targets to their corresponding assembly targets.
Example `args.gn`:
Note: You can also place this configuration in `//local/args.gn`, and `fx set`
automatically appends it to the `args.gn` in your build directory.
```gn
import("//products/....")
import("//boards/....")
product_assembly_overrides = [
{
# zedboot
assembly = "//build/images/zedboot/*"
overrides = "//local:zedboot_overrides"
},
{
# For assemblies in Bazel, use their product label
assembly = "//products/minimal/*"
overrides = "//local:minimal_overrides"
},
{
# core or terminal products:
assembly = "//build/images/fuchsia/*"
overrides = "//local:enable_kernel_debug"
},
]
```
## Defining an `assembly_developer_overrides` target {:#defining-an-assembly_developer_overrides-target}
To define a set of developer overrides, use the `assembly_developer_overrides()`
template in a `BUILD.gn` file. It is recommended to place these definitions in
the `//local` directory of your Fuchsia checkout, as this directory is ignored
by git.
Example `//local/BUILD.gn`:
Note: To see available override options, see
[Available override options](#available-override-options).
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("enable_kernel_debug") {
kernel = {
command_line_args = [
"foo",
]
}
}
# Multiple override sets can be defined in the same file.
assembly_developer_overrides("bar_debug") {
kernel = {
command_line_args = [ "bar" ]
}
}
```
## Available override options {:#available-override-options}
The following sections describe the available options that can be configured
within an `assembly_developer_overrides` target:
* [Developer-only assembly options](#developer-only-assembly-options)
* [Platform configuration](#platform-configuration)
* [Kernel command-line arguments](#kernel-command-line-arguments)
* [Additional packages](#additional-packages)
* [Shell commands](#shell-commands)
* [Board configuration](#board-configuration)
* [Compiled packages and components](#compiled-packages-and-components)
* [Appending to lists](#appending-to-lists-with-__append_to__key_)
### Developer-only assembly options {:#developer-only-assembly-options}
These assembly options can only be enabled through developer overrides, and are
not normally allowed in product or board configs.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("netboot_with_all_packages") {
developer_only_options = {
all_packages_in_base = true
netboot_mode = true
}
}
```
* `all_packages_in_base`: Redirects all `cache` and `on_demand` packages into
the `base` package set. This is useful for making debugging tools available
on a device when networking is non-functional.
* `netboot_mode`: Creates a Zircon Boot Image (ZBI) that includes the FVM/Fxfs
image inside a ramdisk, allowing the product to be netbooted.
### Platform configuration {:#platform-configuration}
You can override the `platform` configuration of a product assembly
configuration. For more information, see the
[`PlatformSettings` reference][PlatformSettings-config].
The values that you specify are merged with the product's platform configuration
on a field-by-field basis.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("enable_sl4f") {
platform = {
development_support = {
include_sl4f = true
include_netsvc = true
}
}
}
```
If you want to append to a list instead of replacing it, see
[Appending to lists with `__append_to_<key>`](#appending-to-lists-with-__append_to__key_).
### Kernel command line arguments {:#kernel-command-line-arguments}
You can add kernel command line arguments. The order of the kernel command
line arguments are not preserved. For a list of available options, see the
[Zircon Kernel Commandline Options][zircon-boot-options] documentation.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("bar_debug") {
kernel = {
command_line_args = [ "bar" ]
}
}
```
### Additional packages {:#additional-packages}
You can add developer-specified packages to the `base`, `cache`, `bootfs`, and
`flexible` package sets. The `flexible` package set is placed in `cache` for
`eng` build types and in `base` for `user` and `userdebug` build types.
The template requires specific GN labels for packages and does not use GN
metadata to traverse package groups.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("my_custom_base_packages") {
base_packages = [
"//some/gn/target/for/a:package",
"//some/other/target/for/a:package",
"//third_party/sbase",
]
}
```
### Shell commands {:#shell-commands}
To add command-line tools to the Fuchsia shell, you must both add the package
containing the tool and instruct assembly to create the launcher stub for the
component.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("my_custom_shell_commands") {
shell_commands = [
{
package = "cp"
components = [ "cp" ]
}
]
}
```
If making the package available through package discovery isn't sufficient, you
can also add the package to a package set.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("my_custom_shell_commands") {
shell_commands = [
{
package = "cp"
components = [ "cp" ]
}
]
# This GN target should define a package named "cp".
base_packages = [
"//some/gn/target/for/my/package:cp"
]
}
```
### Board configuration {:#board-configuration}
You can override board-specific configuration to test changes or new features.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("add_new_feature") {
board = {
provided_features = [ "fuchsia::new_feature" ]
filesystems = {
gpt_all = true
}
}
}
```
To append to a list instead of replacing it, see
[Appending to lists with `__append_to_<key>`](#appending-to-lists-with-__append_to__key_).
### Compiled packages and components
You can add developer-specified contents and CML shards to packages and
components that are compiled by assembly.
Example `//local/BUILD.gn`:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("add_core_shard") {
compiled_packages = [
{
name = "core"
components = [
{
component_name = "core"
// Paths to _files_, not targets.
shards = [ "//local/testing.core_shard.cml" ]
},
]
}
]
}
```
### Appending to lists with `__append_to_<key>` {:#appending-to-lists-with-__append_to__key_}
By default, developer overrides replace a list with the new contents that you
specify. To append to a list instead, use the `__append_to_<key>` syntax, where
`<key>` is the name of the list.
For example, given the following board configuration:
```gn
board_configuration("bar") {
provided_features = [ "fuchsia::feature1", "fuchsia::feature2"]
}
```
You can append a new feature using this override:
```gn
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("foo") {
board = {
__append_to_provided_features = [ "fuchsia::new_feature" ]
}
}
```
The resulting configuration will be:
```gn
board: {
provided_features: [
"fuchsia::feature1",
"fuchsia::feature2",
"fuchsia::new_feature",
]
}
```
## Important details
### Assembly warning text
Assembly operations with overrides always produce a warning that details the
overrides being applied. For example:
```gn
WARNING!: Adding the following via developer overrides from: //local:enable_kernel_debug
Additional kernel command line arguments:
foo
```
### Product label patterns {#product-label-patterns}
The mapping between an override target and a product bundle is done through
label pattern matching.
Important: Do not use `//*` as a pattern. It will match every assembly in the
build, including all tests, zedboot, and recovery images.
* `//some/label/with/wildcard/*`: Matches all assemblies in and under that
path.
* `//some/label/with/wildcard:*`: Matches all assemblies in that folder only.
Different assemblies are located at different paths in the build graph. Common
locations include the following:
* **GN-assembled products**:
* `bringup` products: `//build/images/bringup/*`
* `core` products: `//build/images/fuchsia/*`
* `zedboot`: `//build/images/zedboot/*`
* `guest`: `//build/images/guest/*`
* **Bazel-assembled products** (`minimal`, `terminal`, `workbench`, etc.):
* Boards in `fuchsia.git`: `//products/<name>/*`
[gn-label-patterns]: https://gn.googlesource.com/gn/+/master/docs/reference.md#label_pattern
[PlatformSettings-config]: /reference/assembly/PlatformSettings/index.md
[software-assembly-concepts]: /docs/concepts/software_assembly/overview.md
[zircon-boot-options]: /docs/gen/boot-options.md
[fx-args-ref]: /reference/tools/fx/cmd/args.md