blob: 53d65102acfe8f0552b22154765ce84d01c96551 [file] [log] [blame] [view]
# SDK build tools
This directory contains templates and scripts used to build and consume SDKs in
the Fuchsia GN build.
## Overview
The build output of "an SDK build" is a tarball containing files collected from
the source tree and the output directory, augmented with metadata files.
Metadata includes the nature of an element (e.g. programming language(s),
runtime type), its relationship with other elements (e.g. dependencies,
supporting tools), the context in which the element was constructed (e.g.
target architecture, high-level compilation options), etc...
Schemas for the various types of SDK elements are available under [meta/](meta).
## Implementation
Individual elements are declared using the [`sdk_atom`](sdk_atom.gni) template.
It should be rare for a developer to directly use that template though: in most
instances its use should be wrapped by another higher-level template, such as
language-based templates.
Groups of atoms are declared with the [`sdk_molecule`](sdk_molecule.gni)
template. A molecule can also depend on other molecules. Molecules are a great
way to provide hierarchy to SDK atoms.
## Declaring SDK elements
There are a few GN templates developers should use to enable the inclusion of
their code in an SDK:
- [`sdk_shared_library`](/cpp/sdk_shared_library.gni)
- [`sdk_source_set`](/cpp/sdk_source_set.gni)
- [`sdk_executable`](/cpp/sdk_executable.gni)
Some language-specific targets are also SDK-ready:
- [`dart_library`](/dart/dart_library.gni)
- [`fidl_library`](/fidl/fidl_library.gni)
- [`go_binary`](/go/go_binary.gni)
In order to add documentation to an SDK, use the
[`sdk_documentation`](/sdk/sdk_documentation.gni) template.
A target `//foo/bar` declared with one of these templates will yield an
additional target `//foo/bar:bar_sdk` which is an atom ready to be included in
an SDK.
Additionally, the [`sdk`](sdk.gni) template should be used to declare an
SDK.
### Visibility
The `sdk_atom` template declares a `category` parameter which allows developers
to control who may be able to use their atom. See the parameter's documentation
for more information on this.
## Creating a custom SDK
Once elements have been set up for inclusion in an SDK, declaring such an SDK
only takes a few steps:
1. Identify the atoms needed in the SDK;
2. Create a new SDK `//some/place:my_sdk` with the `sdk` template, regrouping
the atoms and molecules that should be included;
3. Add a new
[package](https://fuchsia.googlesource.com/fuchsia/+/master/docs/build/packages.md)
file for the molecule:
```
{
"labels": [
"//some/place:my_sdk"
]
}
```
The package file can now be used in a standard Fuchsia build and will produce
the archive at `//out/<build-type>/sdk/archive/my_sdk.tar.gz`.
Note that in order for the archive to be generated, an extra GN argument has to
be passed to GN:
```
build_sdk_archives=true
```
### Using a custom SDK in the build
By setting the `export` property to true on an SDK target, that SDK's contents
become available in the build output directory and may be used for other GN
targets to depend on. This is useful for example when building third-party code
which would otherwise rely on an official SDK.
For an SDK declared at `//some/place:my_sdk` and marked as "exported", an
additional GN target exists: `//some/place:my_sdk_export`.
This target will generate a usable SDK under
`//out/<build-type>/sdk/exported/my_sdk`.
## GN build arguments
##### `build_sdk_archives`
By default, the build system will not produce SDK tarballs as it is a somewhat
time-consuming build step. Set this argument to `true` in order to have tarballs
created under `$OUTPUT_DIR/sdk/archive`.
##### `warn_on_sdk_changes`
For each element in the SDK, a reference file representing its API is checked
into the source tree. If the API is modified but the reference file is not
updated, the build will fail. Set this argument to `true` in order to turn the
errors into mere warnings.