blob: 108ee950c40c6e23498c044814e672639d8d7ba2 [file] [log] [blame] [view]
# Assembling structured configuration
[Structured configuration][sc-docs] allows developers to package components with
different values in different contexts. Product assembly allows developers to
define structured configuration values based on high-level platform and product
configuration.
To vary your component's configuration by product or build type you must declare
a schema, identify how values will be derived from a product's configuration,
and generate your component's config.
## Define a configuration schema
Your component must have a declared configuration schema in its manifest. For
example:
```json5
...
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/assembly/structured_config/configured_by_assembly/meta/to_configure.cml" region_tag="config" %}
```
For more information see the [documentation for structured config][sc-docs].
## Identify product assembly configuration
Many configuration options can be represented as the difference between
[`eng` builds and non-`eng` builds][build-types].
If the configuration of your component can't be deduced solely from build type,
email the [Software Assembly list][sa-email] to discuss the schema which should
be used (note that this list is publicly viewable, please use Google-internal
lists to discuss internal-only configuration). Once a schema has been decided,
add it to the [product configuration library][config-schema].
## Configure the package
Determine your package's name and your component's manifest resource path.
Define logic to populate configuration for it in the [product assembly
tool][configure-product]. For example, to configure a value based on the build
type:
```rs
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="src/lib/assembly/platform_configuration/src/subsystems/example.rs" region_tag="example_patches" adjust_indentation="auto" %}
```
Note: A given component cannot mix [configuration values produced by GN][gn-doc]
and values produced by software assembly.
## Update size limits configuration (if any)
When producing configuration values for a package, product assembly must write
its outputs to a different location in the build directory than the path
normally produced by the build system. There are binary size checks that rely on
paths to package manifests that exist in the build directory, so it is important
that you update the package's output path in the build configuration rules.
For example, before having its configuration generated by product assembly,
the `session_manager` package was listed in [the core product's size
limits][core-limits] as:
```gn
{
component = "Component Framework"
src = [
# ...
"packages/base/session_manager",
]
# ...
},
```
When using product assembly for its config, `session_manager` must now be
specified in size limits as:
```gn
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="products/common/core_size_limits.gni" region_tag="session_manager_size_limit" adjust_indentation="auto" %}
```
[sc-docs]: structured_config.md
<!-- TODO(https://fxbug.dev/42055979) update link to match proper docs -->
[build-types]: /docs/contribute/governance/rfcs/0115_build_types.md
[sa-email]: mailto:software-assembly@fuchsia.dev
[config-schema]: /src/lib/assembly/config_schema/src/product_config.rs
[configure-product]: /src/lib/assembly/platform_configuration/src/lib.rs
[gn-doc]: structured_config.md#define--package-configuration-values-using-gn
[core-limits]: /products/common/core_size_limits.gni