# Layout of Product and Package Directories

The Platform Source Tree
contains a top-level directory called `packages` containing all the
[build packages](packages.md) for that layer. The present document describes
the packages that are common to all of the layers. Each layer will introduce
additional packages specific to that layer.

## Directory map

In the diagram below, "pkg" refers to Fuchsia packages, the unit of installation
in Fuchsia.

```
//<layer>/products
    default          # default build configuration for this layer
                     # by convention, default preinstalls development tools,
                     # and makes all prod packages available.
//<layer>/packages
    <layer>          # all production pkg up to this layer
    buildbot         # all pkg declared at this layer; used by CQ/CI
    default          # monolith packages for daily development at this layer
    preinstall       # devtools for daily development at this layer
    kitchen_sink     # all pkg up to this layer
    all              # grab bag of every pkg in this layer
    prod/            # pkg that can be picked up in production
    tests/           # correctness tests (target & host)
    tools/           # dev tools not for prod (target & host)
    benchmarks/      # performance tests
    examples/        # pkg demonstrating features offered by this layer
  * experimental/    # pkg not quite ready for prod
  * config/          # config files for the system (e.g. what to boot into)
    sdk/             # SDK definitions
    ...              # each layer will also define additional packages
```

## Cross-layer dependencies

- `<layer>(N)` depends on `<layer>(N-1)` and adds all the production artifacts
  of (N)
  - this defines a pure production build
- `buildbot(N)` depends on `<layer>(N-1)` and adds all artifacts of (N)
  - this defines a build suitable for verifying the integrity of (N)
- `kitchen_sink(N)` depends on `kitchen_sink(N-1)` and adds all artifacts of (N)
  - this defines a build suitable for developing (N) as well as its dependencies

## Inner-layer dependencies

Most directories in a `packages` directory contain a special `all` package which
aggregates all packages in this directory. Every `all` package should roll up to
the root `all` package, thereby creating a convenient shortcut to build "all
packages in the layer".
Note that the directories that do not require aggregation are marked with `*` in
the diagram above.

## Disabling packages

Some packages might need to get (temporarily) disabled as refactorings occur in
the Fuchsia codebase. In order to disable a package `<layer>/<type>/foo`, move
it under `<layer>/<type>/disabled/foo` and remove it from `<layer>/<type>/all`.
Note that this does not apply to packages in directories that do not require
aggregation, as these packages are strictly opt-in already.

## Verification

The [`//scripts/packages/verify_layer`][verify-layer] tool is used to verify
that a layer's `packages` and `products` directory's structure matches the
description in the present document.

Note that only package files are allowed in such a directory, with the exception
of `README.md` files for documentation purposes.

[verify-layer]: /scripts/packages/README.md
