blob: 84bee46720a69afa08891b61632c6b205dc31168 [file] [log] [blame] [view]
# Source code layout
## Status
We are currently migrating to this source code layout. Some aspects of this
document refect the current reality, but some aspects are still aspirational.
## Overview
Most first-party, open-source code is in the
["fuchsia.git" repository](https://fuchsia.googlesource.com/fuchsia). Most code in
this repository is organized into a recursive tree of areas, which have a
regular directory and dependency structure.
Source repositories (whether open- or closed-source) also follow the
conventions for areas and are mapped into subdirectories of `src` in
fuchsia.git. Currently, we have small number of petal repositories but will
"promote" areas into separate petal repositories as the system stabilizes.
The products directory contains a list of products that you can build. Some
products are quite small and build quickly (e.g., the [core](/products/core.gni)
product), whereas others are more elaborate (e.g., the
[workstation](/products/workstation.gni) product).
Most third-party dependencies are stored in separate repositories. These
repositories are included in a local checkout only when needed to support one of
the following source tree configurations:
* Bringup. This source tree configuration contains enough code to build the
[bringup](/products/bringup.gni) product.
* Open Source. This source tree configuration contains all the open source code
in the Fuchsia Source Tree.
* All Source. This source tree configuration contains all the open and closed
source code in the Fuchsia Source Tree.
## Areas
Most code is organized into a recursive tree of areas. Each area has a regular
directory and dependency structure, which helps people understand code structure
across the whole project.
### Directory Structure
Each area is required to have an [OWNERS](owners.md) file as well as
documentation and tests. Areas can also include binaries, libraries, drivers,
and other source code. In addition, areas can have subareas, which repeat the
pattern:
* `OWNERS`
* Each area or subarea must have a [list of owners](owners.md)
* `BUILD.gn`
* Build file defining the [canonical targets](#canonical-targets) for the
area. The area owners may add additional targets to this in addition to
the canonical targets.
* `docs/`
* This directory should contain docs for people working in this area
* Docs for end-developers (or people working in other areas of Fuchsia)
should be in the top-level docs or sdk repository
* `bundles/`
* This directory contains bundles of package targets in this area. Each area
should contain at least a `tests` bundle with unit tests for the area, but
may include other bundles.
* `bin/` (optional)
* `lib/` (optional)
* `drivers/` (optional)
* `examples/` (optional)
* `fidl/` (optional)
* In some cases, an area might have internal FIDL interfaces that are not
exposed to other areas or to end-developers. Rather than put those
interfaces in the SDK, an area can put those interfaces in this directory.
* `third_party/` (optional)
* Most third_party dependencies should be in separate repositories
* Include third_party dependencies in an area only if all of the following:
* The code is required to be in a third_party directory by policy
* You intend to fork upstream (i.e., make major changes and not plan to
integrate future changes from upstream)
* You make a new name for the code that (a) does not match upstream and
(b) does not appear in any other third_party directory anywhere in the
Fuchsia Source Tree
* `[subareas]` (optional)
* Subareas should follow the generic area template
* Do not create deeply nested area structures (e.g., three should be enough)
Areas may use additional directories for internal organization in addition to
enumerated directories. A directory that contains an `OWNERS` file is considered
a subarea and must adhere to the contract for areas and subareas. A directory
lacking an `OWNERS` file is considered part of the same area.
### Dependency Structure
In addition to depending on itself, an area can depend only on the top-level
`build`, `buildtools`, `sdk`, and `third_party` directories, as well as the
`lib` directories of its ancestors:
* `//build`
* `//buildtools`
* `//sdk`
* `//third_party`
* `(../)+lib/`
### Canonical targets
Each area and subarea must define the following canonical targets in their top-level BUILD.gn file:
* `tests`
* All of the tests within this area
## Repository layout
This section depicts the directory layout for the Fuchsia Source Tree. Non-bold
entries are directories or files in the fuchsia.git repository. Bold entries are
separate repositories that are mapped into the directory structure using `jiri`
(except for the prebuilt directory, which is populated from CIPD).
* `.clang-format`
* `.dir-locals.el`
* `.gitattributes`
* `.gitignore`
* `AUTHORS`
* `CODE_OF_CONDUCT.md`
* `CONTRIBUTING.md`
* `LICENSE`
* `OWNERS`
* `PATENTS`
* `README.md`
* `rustfmt.toml`
* `sdk/banjo/ddk.protocol.gpio/`
* `sdk/banjo/...`
* `sdk/fidl/fuchsia.media/`
* `sdk/fidl/fuchsia.mediacodec/`
* `sdk/fidl/...`
* `sdk/lib/ddk/`
* `sdk/lib/fit/`
* `sdk/lib/fidl/`
* `sdk/lib/zircon/`
* `sdk/lib/...`
* `.gn`
* `BUILD.gn`
* `build/`
* `bundles/`
* `configs/`
* `integration/`
* `products/`
* `scripts/`
* `docs/`
* `examples/`
* `third_party/`
* **`boringssl/`**
* **`icu/`**
* **`rust_crates/`**
* **`...`**
* `prebuilt/`
* **`chromium/`**
* **`dart/`**
* **`flutter/`**
* **`llvm/`**
* `tools/`
* `banjo/`
* `fidl/bin/backend/{c,cpp,dart,go,llcpp,rust}`
* `fidl/bin/frontend/`
* `fidl/docs/`
* `fidl/examples/`
* `fidl/tests/`
* `src/`
* `lib/`
* `cobalt/`
* `component/`
* `connectivity/`
* `developer/`
* **`experiences/`**
* `graphics/`
* `identity/`
* `ledger/`
* `media/`
* `modular/`
* `storage/`
* `updater/`
* `virtualization/`
* `zircon/docs/`
* `zircon/kernel/`
* `zircon/drivers/`
* `zircon/userspace/`
* `vendor/`
* **`[closed-source code from various vendors]`**
## Evolution
As the system stabilizes, we can promote areas out of fuchsia.git into separate
repositories. Generally, we should promote an area to a separate repository when
the interface between the area and the rest of the system is sufficiently stable
(requires approval by top-level OWNERS).
New code can be:
* Added to an existing directory in fuchsia.git
* Added to a new top-level area or subarea of an existing area
* Added to an existing repository
* Added to a new repository (requires approval by top-level OWNERS)