# Use developer overrides for assembly of a Fuchsia product

In some cases, you may want to override the configuration of a Fuchsia product.

## Use assembly overrides {:#use-assembly-overrides}

To start using developer overrides for assembly:

1. In your Fuchsia checkout, make a `//local/BUILD.gn` file:

   A `//local.BUILD.gn` file may look like:

   Note: For the fully list of values that you can specify, see
   [Product configuration][product-config-ref]. Additionally, you can use
   [`developer_only_options`](#use-developer_only_options) to enable certain
   options including board configurations.

    ```gn
    import("//build/assembly/developer_overrides.gni")

    assembly_developer_overrides("my_overrides") {
        kernel = {
            command_line_args = ["foo"]
        }
    }
    ```

   This is what this `BUILD.gn` file indicates:

   * The assembly developer override is named `my_overrides`. You can use
     any meaningful identifier for this field.
   * The keys `kernel`, `command_line_args` are all based on supported values
     for Platform configuration. For more information, see
     [`PlatformConfig`][platform-assembly-ref].

1. Once you have made a `//local/BUILD.gn` file that meets your requirements,
   you can set your `fx set` command to use this assembly platform
   configuration. For example:

   Note: The value used for `--assembly-override` is the identifier that you
   used in your `//local/BUILD.gn` file.

   ```posix-terminal
   fx set --assembly-override=//local:my_overrides
   ```

1. Build Fuchsia:

   ```posix-terminal
   fx build
   ```

   You should now be able to build Fuchsia as you normally would.

Additionally, you can also do the following:

* [Add a package](#add-package)
* [Add a shell command](#add-shell-command)
* [Use `developer_only_options`](#use-developer_only_options)

## Add a package {#add-package}

There may be some cases where you may need to include additional packages to
your product's packages. In this case, your `//local/BUILD.gn` may look
like:

```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",
  ]
}
```

## Add a shell command {#add-shell-command}

There may be some cases where you may need to include shell commands to your
product's configuration. When adding CLI tools for running in the Fuchsia shell,
it's necessary to both add the package and configure assembly to create the
launcher stub that runs the component for the binary. This is due that most CLI
tools are actually components.

To do this, define a `shell_commands` list within your
`assembly_developer_overrides`. Each entry in this list is an object with the
following keys:

* `package`: The name of the package that contains the shell command (for
  example, `cp`). This is the package name, not a GN target label.
* `components`: A list of the CLI binaries within the package that you want to
  register as shell commands. Assembly automatically adds the `meta/` prefix and
  `.cm` suffix to these names when looking for their component manifests.
  For example, `foo` becomes `meta/foo.cm`.

For example, to add the `cp` command from the `cp` package, your
`//local/BUILD.gn` may look like:

```gn
import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_custom_shell_commands") {
  shell_commands = [
    {
      package = "cp"
      components = [ "cp" ]
    }
  ]
}
```

And for adding multiple entries to the `shell_commands` list, see the following
example:

```gn
import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_multiple_shell_commands") {
  shell_commands = [
    {
      package = "foo"
      components = [ "foo_comp" ]
    },
    {
      package = "bar"
      components = [ "bar_comp1", "bar_comp2" ]
    }
  ]
}
```

### Add a shell command to a package set {#add-shell-command-package-set}

Additionally, if making the package available through package discovery
isn't sufficient, you can also add the package target to a package set.
For example, to add the package to the `base` package set, your
`//local/BUILD.gn` may look like:

```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 "foo_cli".
  base_packages = [
    "//some/gn/target/for/my/package:foo_cli"
  ]
}
```

## Use `developer_only_options` {#use-developer_only_options}

In some cases, you may want to use some of the `developer_only_options`. These
options can be combined with the general overrides covered in
[Use assembly overrides](#use-assembly-overrides).

Note: For a full list of supported `developer_only_options` see
[`developer_overrides.gni`].

In this case, your `//local/BUILD.gn` may look like:

```gn
import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_overrides") {
  developer_only_options = {
    all_packages_in_base = true
    netboot_mode = true
  }
}
```

### `all_packages_in_base`

This option redirects all cache and on_demand package-set packages into the base
package set. This feature allows the use of a product image that has cache or
universe packages in a context where networking may be unavailable or a package
server cannot be run.

The primary use case for this option is to allow debugging tools to be available
on-device when networking is non-functional.

### `netboot_mode`

This option creates a ZBI (Zircon Boot Image) that includes the fvm/fxfs image
inside a ramdisk, to allow the netbooting of the product.

This is a replacement for the `netboot` assembly that was previously generated
with `//build/images/fuchsia:netboot`.

## Override multiple platform configurations {:#override-multiple-platform-configurations}

You can also override multiple platform configuration areas within the same
`assembly_developer_overrides` definition.

For example, the following override customizes both development SSH keys and
USB peripheral functions:

```gn
import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_multi_overrides") {
  platform = {
    development_support = {
      authorized_ssh_keys_path = "//local/fuchsia_authorized_keys"
    }
    usb = {
      peripheral = {
        functions = [ "cdc" ]
      }
    }
  }
}
```

[platform-assembly-ref]: /reference/assembly/PlatformConfig/index.md
[product-config-ref]: /reference/assembly/index.md
[`developer_overrides.gni`]: https://source.corp.google.com/h/fuchsia/fuchsia/+/main:build/assembly/developer_overrides.gni;l=13-130
