Kernel in the build

Commandline options

Kernel commandline options can be added to a product assembly either indirectly (as a platform implementation detail), or directly by a developer for local debug and testing.

Specifying options in board or product files

Products and boards can only add kernel commandline options indirectly, via product assembly: - As part of an Assembly Input Bundle. - As part of the platform configuration rules in assembly.

Specifying options locally

For local development, a list of strings that should be appended to the kernel command line can be specified as part of assembly developer overrides.

This takes two steps:

1. Define an assembly overrides target

Define an assembly overrides target in //local/BUILD.gn or other BUILD.gn file under //local/*.

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

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

This only needs to be done once per set of overrides, and can then be re-used with any product assembly or any outdir in your build.

The next step is to tell GN which developer overrides target to use for your product.

2a. Use that target with the "main" product assembly

For the "main" product assembly (the one named in your fx set command), you tell GN to use the above-defined product assembly target with the following:

fx set ... --assembly-override //local:custom_kernel_args

Alternatively, an existing args.gn file can be modified by running fx args and adding or modifying a line as follows:

product_assembly_overrides_label = "//local:custom_kernel_args"

2b. Product assemblies other than the "main" assembly

A slightly more verbose mechanism is required for assemblies other than the "main" product assembly, such as the zedboot or recovery assemblies. This is done using a wildcard-based pattern-match:

fx set ... --assembly-override '//build/images/zedboot/*=//local:custom_kernel_args'

or ```posix-terminal fx set ... --assembly-override '//products/microfuchsia/*=//local:custom_kernel_args'

When dealing with multiple product assemblies, it's easier to specify this directly in args.gn:

product_assembly_overrides = [
  {
    # core products:
    assembly = "//build/images/fuchsia/*"
    overrides = "//local:custom_kernel_args"
  },
  {
    assembly = "//build/images/zedboot/*"
    overrides = "//local:zedboot_overrides"
  },
  {
    assembly = "//products/microfuchsia/*"
    overrides = "//local:zedboot_overrides"
  }
]

Note that when using a //vendor/* board, the product assembly target will also be in the //vendor repo (e.g //vendor/<foo>/products/minimal).