blob: 0b478d2295a4058e10730f690ea8f9221a75143a [file] [log] [blame] [view]
# Fuchsia source tree
In this section, you will learn about the organization of the Fuchsia source
code and the tools used to manage the open source project.
## Source code management
Fuchsia uses the [jiri](https://fuchsia.googlesource.com/jiri) tool to manage
git repositories in the Fuchsia project. It synchronizes a local checkout of the
source code with the
[Global Integration manifest](https://fuchsia.googlesource.com/integration) and
provides the necessary facilities to contribute changes back to Fuchsia. Global
Integration is the central ledger that defines the current state of the various
projects in the Fuchsia tree.
<aside class="key-point">
The bootstrap script performs the step described in this section for you when
you <a href="/docs/get-started/get_fuchsia_source.md">download the source</a>.
</aside>
You initialize a local jiri checkout using the `import` command with an XML
manifest that declares all the repositories and how they are organized. The
import for the default Global Integration manifest is as follows:
```posix-terminal
jiri import -name=integration flower https://fuchsia.googlesource.com/integration
```
This command adds the manifest to a local `.jiri_manifest` file at the root of
your local checkout.
```xml {:.devsite-disable-click-to-copy}
<manifest>
<imports>
<import manifest="flower" name="integration"
remote="https://fuchsia.googlesource.com/integration" />
</imports>
</manifest>
```
<aside class="key-point">
<b>Fuchsia is a flower</b>
<p>Notice that the default integration manifest is named
<a href="https://fuchsia.googlesource.com/integration/+/refs/heads/main/flower">flower</a>.
This metaphor is often applied to the Fuchsia source code, where the core
Fuchsia platform is considered the
<a href="https://fuchsia.googlesource.com/integration/+/refs/heads/main/stem">stem</a>
with additional external dependencies and related projects are the
<strong>petals</strong>.</p>
<p>The flower manifest is a single aggregation point for the stem and various
petal projects.</p>
</aside>
Once a local checkout is initialized on your development machine, jiri can pull
the latest changes from Global Integration at any time with one command:
```posix-terminal
jiri update
```
## Source code layout
Fuchsia is a large open source project. As with any large software project, it
can be easy to get lost without a roadmap to guide you. This section contains
an overview of a local Fuchsia checkout, with a summary of the various elements
you can expect to find along the way:
<table>
<tr>
<th>path</th>
<th>description</th>
</tr>
<tr>
<td><code>boards</code></td>
<td>
Contains all the default <a
href="/docs/development/build/build_system/boards_and_products.md">board
configurations</a> supported and maintained by the Fuchsia team.
</td>
</tr>
<tr>
<td><code>build</code></td>
<td>
Shared configurations and default templates for the <a
href="/docs/development/build/build_system/index.md">Fuchsia
build system</a>.
</td>
</tr>
<tr>
<td><code>bundles</code></td>
<td>
Top-level groupings of build target labels typically included together in
a build configuration. See <a
href="/docs/development/build/build_system/bundles.md">Bundles</a>
for more details.
</td>
</tr>
<tr>
<td><code>docs</code></td>
<td>
The Fuchsia documentation, including the source material for the <a
href="https://fuchsia.dev/">Fuchsia.dev</a> developer site.
</td>
</tr>
<tr>
<td><code>examples</code></td>
<td>
Sample software components showcasing various aspects of the Fuchsia
platform.
</td>
</tr>
<tr>
<td><code>products</code></td>
<td>
Contains all the default <a
href="/docs/development/build/build_system/boards_and_products.md">product
configurations</a> supported and maintained by the Fuchsia team.
</td>
</tr>
<tr>
<td><code>scripts</code></td>
<td>
Various developer tools to simplify working with the Fuchsia source tree,
including the subcommands used in <a
href="/docs/development/build/fx.md">fx workflows</a>.
</td>
</tr>
<tr>
<td><code>sdk</code></td>
<td>
Contains the source of the Fuchsia platform APIs including the <a
href="https://fuchsia.dev/reference/fidl/">FIDL protocol definitions</a>
and the build targets use to create the Fuchsia SDK distribution archives.
</td>
</tr>
<tr>
<td><code>src</code></td>
<td>
Source code of Fuchsia, including components, services, and tools running
on the target device. <b>This is the stem of the flower</b>.
</td>
</tr>
<tr>
<td><code>tools</code></td>
<td>
<a href="https://fuchsia.dev/reference/tools/">Fuchsia
developer tools</a> running on the host machine.
</td>
</tr>
<tr>
<td><code>vendor</code></td>
<td>
Reserved location for vendor-specific binaries and customizations for
product builds. The build system supports discovery of configuration files
under <code>vendor/products</code> and <code>vendor/boards</code> to build
Fuchsia for vendor-specific device targets.
</td>
</tr>
<tr>
<td><code>zircon</code></td>
<td>
Source code for Fuchsia's <a href="/docs/concepts/kernel/README.md">Zircon
core</a>, including the kernel.
</td>
</tr>
</table>
The source code of the Fuchsia platform breaks down further into the various
components and services running on the device. Below is not a complete list,
but may provide some interesting places to begin exploring:
<table>
<tr>
<th>path</th>
<th>description</th>
</tr>
<tr>
<td><code>src/bringup</code></td>
<td>
Core system binaries used to bring up the system's user space environment.
</td>
</tr>
<tr>
<td><code>src/camera</code></td>
<td>Support services for camera device drivers.</td>
</tr>
<tr>
<td><code>src/cobalt</code></td>
<td>Fuchsia service used to log, collect and analyze metrics.</td>
</tr>
<tr>
<td><code>src/connectivity</code></td>
<td>Networking protocol support and device drivers.</td>
</tr>
<tr>
<td><code>src/developer</code></td>
<td>
Developer tools running on the target, including <a
href="/docs/development/tools/ffx/overview.md">ffx</a>.
</td>
</tr>
<tr>
<td><code>src/devices</code></td>
<td>Device driver support libraries for common hardware subsystems.</td>
</tr>
<tr>
<td><code>src/diagnostics</code></td>
<td>
Diagnostic support services such as logging, crash reporting, snapshots,
and statistics.
</td>
</tr>
<tr>
<td><code>src/factory</code></td>
<td>Components implementing access to factory config data storage.</td>
</tr>
<tr>
<td><code>src/fonts</code></td>
<td>Provider for built-in system fonts.</td>
</tr>
<tr>
<td><code>src/graphics</code></td>
<td>Support services for display device drivers.</td>
</tr>
<tr>
<td><code>src/identity</code></td>
<td>User account handling and identity token management.</td>
</tr>
<tr>
<td><code>src/media</code></td>
<td>Media codecs and playback services.</td>
</tr>
<tr>
<td><code>src/power</code></td>
<td>Power management services.</td>
</tr>
<tr>
<td><code>src/starnix</code></td>
<td>POSIX compatibility libraries.</td>
</tr>
<tr>
<td><code>src/recovery</code></td>
<td>Recovery system and factory reset services.</td>
</tr>
<tr>
<td><code>src/security</code></td>
<td>Security policies and analysis tools.</td>
</tr>
<tr>
<td><code>src/session</code></td>
<td>Infrastructure and tools for managing session components.</td>
</tr>
<tr>
<td><code>src/storage</code></td>
<td>
Support for <a
href="/docs/concepts/filesystems/filesystems.md">filesystems</a> and
volume management.
</td>
</tr>
<tr>
<td><code>src/sys</code></td>
<td>
<a href="/docs/concepts/components/v2/README.md">Component framework</a>
and services for <a href="/docs/concepts/packages/package.md">package
management</a>.
</td>
</tr>
<tr>
<td><code>src/tests</code></td>
<td>Platform end to end (E2E) integration tests. </td>
</tr>
<tr>
<td><code>src/ui</code></td>
<td>
Services to support graphical user interface (GUI), including <a
href="/docs/development/graphics/scenic/README.md">Scenic</a>.
</td>
</tr>
<tr>
<td><code>src/virtualization</code></td>
<td>Hypervisor support for VM guests.</td>
</tr>
<tr>
<td><code>src/zircon</code></td>
<td>Libraries for interacting with the Zircon kernel.</td>
</tr>
</table>
Note: For more details on how projects are structured in the Fuchsia tree, see
[Source code layout](/docs/development/source_code/layout.md).
## Exercise: Navigate the source tree
In this exercise, you'll explore your local checkout of the Fuchsia source tree
using the command line tools available in the environment. Becoming familiar
with these tools will make you more productive as you begin to contribute to the
codebase.
<aside class="key-point">
If you prefer a more graphical interface, you can use
<a href="https://cs.opensource.google/fuchsia">Google Code Search</a> to explore
the Fuchsia tree as well.
</aside>
### Search the tree
If you're not sure where to start, you can use the `fd` utility to perform fuzzy
searches for directories, then navigate to the location of a search result.
Run the following command to run an `fd` search for `session_manager`:
```posix-terminal
fd session_manager
```
<aside class="key-point">
This tool is configured in your environment using <code>fx-env.sh</code>. If you
are unable to access the <code>fd</code> command, ensure you have
<a href="/docs/get-started/get_fuchsia_source.md#set-up-environment-variables">
set up your environment</a>.
</aside>
The utility prints a few possible options for you to choose from. Select option
2 to navigate to `src/session/bin/session_manager`:
```none {:.devsite-disable-click-to-copy}
[1] src/session/bin/session_manager
[2] src/session/tests/session_manager
```
This enables you to easily find and navigate the piece of code where you want to
work. If the search is specific enough to return a single result, `fd` will
navigate you there automatically.
Run the following command to perform a search for `archivist` Fuchsia's
diagnostics service for collecting log data, snapshots, and lifecycle events:
```posix-terminal
fd archivist
```
Notice that the command didn't actually print any results, but your working
directory was automatically set to `src/diagnostics/archivist`!
<aside class="key-point">
<b>Tip:</b> You can run <code>fd</code> without any arguments to jump back to
the source root from anywhere.
</aside>
This is helpful to get you started, but there are several things you may want to
search for in the Fuchsia tree that require **searching inside files**.
### Search within source files
To search the tree for patterns within specific source files, use the
`fx grep` command.
Run a search in the tree looking for references to the `hello-world` example
using `fx grep`:
```posix-terminal
fx grep hello-world
```
This returns a long list of references from across the tree, because this
example is referenced in documentation, build files, and other sources.
You can refine the search using filters to help narrow in on the protocol
definition. Perform the same search again, but this time only in GN build files
using a filter:
Note: For a complete list of available filters, see the
[`fx grep` reference](https://fuchsia.dev/reference/tools/fx/cmd/grep).
```posix-terminal
fx grep hello-world -- build
```
The results indicate that the protocol definition is located at
`examples/hello_world`. You can combine this information with `fd` to
navigate there:
```posix-terminal
fd hello_world
```
<aside class="key-point">
<b>Extra credit</b>
<p>Use <code>fx grep</code> to find components that implement the
<code>fuchsia.component.runner</code> FIDL protocol? How many are there?</p>
</aside>