| # 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> |