blob: 08922aca5ea6868e482a21fb8480373e3b3ab250 [file] [log] [blame] [view]
# Run an example component
This guide shows you how to build Fuchsia to include an example package
from Fuchsia's source [`//examples`](/examples/)
directory and run that component on your Fuchsia device.
Note: This guide is specific to [components v1](/docs/glossary.md#components-v1) and uses
[component manifests](/docs/concepts/components/v1/component_manifests.md).
## Exploring the example Fuchsia package {#exploring-the-example-fuchsia-package}
Open the [`examples/hello_world/BUILD.gn`](/examples/hello_world/BUILD.gn) file.
This example, written in both C++ and Rust, prints `Hello, world!`. Each
language-dependent directory has the following:
* A [`BUILD.gn`](#build-gn) file that defines its [Fuchsia package](#fuchsia-package).
* A `meta` subdirectory with [component manifests](#component-manifest) (`.cmx`) files.
### BUILD.gn {#build-gn}
Generate Ninja (GN) is a meta build system. Output files from GN serve as inputs to
[Ninja](https://ninja-build.org/){:.external}, the actual build system.
If you aren't familiar with GN, see
[Introduction to GN](/docs/concepts/build_system/intro.md).
In the [`examples/hello_world/BUILD.gn`](/examples/hello_world/BUILD.gn) file,
the `hello_world` target is a group containing other dependencies,
notably `cpp` and `rust`. Therefore, this target builds both of them:
```none
group("hello_world") {
testonly = true
deps = [
":tests",
"cpp",
"rust",
]
}
```
To learn more about how GN defines Fuchsia packages,
see the [`build/package.gni`](/build/package.gni) file.
### Component manifest {#component-manifest}
A `.cmx` file, known as a
[component manifest](/docs/glossary.md#component-manifest), describes how to run
an application on Fuchsia as a [component](/docs/glossary.md#component). In
other words, a component manifest creates a [Fuchsia package](/docs/glossary.md#fuchsia-package).
### Fuchsia package {#fuchsia-package}
To include a package in your Fuchsia image, you have the following options:
* Base: Packages that are produced by build and included in paving images.
These packages are included in over-the-air updates and are always updated as a
single unit.
* Cache: Packages that are included in paving images, but are not included in
over-the-air system updates. These packages can be updated at any time
when updates are available.
* Universe: Packages that are not included in paving image. These
optional packages are fetched and run on-demand.
## Include the example package in your Fuchsia image {#include-the-example-package-in-your-fuchsia-image}
Note: If you already built Fuchsia and you're not changing your product or board, these commands
take less than a few minutes to run. If you are changing your product or board, these changes can
take up to 90 minutes to run.
To include the example package in Universe so that it can be fetched on-demand,
use the `--with` flag when setting your product and board environment and building Fuchsia:
<pre class="prettyprint">
<code class="devsite-terminal">fx set <var>product</var>.<var>board</var> --with //examples/hello_world</code>
</pre>
For a Fuchsia emulator with the minimum build configuration, the command is:
```posix-terminal
fx set core.qemu-x64 --with //examples/hello_world
```
In this example, `core` is a product with a minimal feature set, which includes
common network capabilities, and `x64` refers to the x64 architecture.
For a Fuchsia device with the minimum build configuration, the command is:
```posix-terminal
fx set core.x64 --with //examples/hello_world
```
See [Configure a build](/docs/development/build/fx.md#configure-a-build) for
more options.
Once you have set your build configuration, build Fuchsia with the following
command:
```posix-terminal
fx build
```
You now have a build that includes the example package in Universe.
## Run the example component {#run-the-example-component}
To run a Fuchsia component, use its
[Fuchsia package URL](/docs/glossary.md#fuchsia-pkg-url) as an argument
to the `fx shell run` command:
1. Open a terminal and run `fx serve`:
```posix-terminal
fx serve
```
1. Open another terminal and run the example component:
```posix-terminal
fx shell run fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx
```
This command prints the following output:
```none
Hello, World!
```
If `fx serve` is not running, the command prints an error message from
the device or emulator.
If `fx serve` is running, but the package is not found,
then [try going through these steps again](#include-the-example-package-in-your-fuchsia-image),
rebuilding your Fuchsia image
to include this package and repaving it to the device.
### Run the example component using a simple string {#run-the-example-component-using-a-simple-string}
The `fx shell run` command can match a string to a package URL
if the string is only mapped to one component
in your product configuration. For example:
```posix-terminal
$ fx shell run hello_world_cpp.cmx
```
If multiple matches exist, the command prints the list of matches:
```none
$ fx shell run hello_world
fuchsia-pkg://fuchsia.com/hello_world_cpp_tests#meta/hello_world_cpp_unittests.cmx
fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx
Error: "hello_world" matched multiple components.
```
### Explore the components in your product configuration {#explore-components-in-product-configuration}
You can explore what components are in your product configuration using the
`locate` command.
* Find your favorite component:
```posix-terminal
fx shell locate hello_world_cpp.cmx
```
* Find all runnable components:
```posix-terminal
fx shell locate --list cmx
```
* Find multiple test components:
```posix-terminal
fx shell locate --list test
```