blob: 90e4f03f5c29925daa5fdce92435bb1cd1a278e8 [file] [view]
# Run the examples
While exploring the source code, you may have noticed the `examples` directory.
This guide will show you how to build Fuchsia to include some examples and then
run them on the device.
## Explore the hello_world example
Open the [`examples/hello_world/BUILD.gn`](/examples/hello_world/BUILD.gn) file.
If you aren't familiar with GN, take a look at the
[introductory presentation](https://docs.google.com/presentation/d/15Zwb53JcncHfEwHpnG_PoIbbzQ3GQi_cpujYwbpcbZo/view#slide=id.g119d702868_0_12) (slides 5-16 cover the core concepts, and
slides 17-21 describe debugging commands) or [docs](https://gn.googlesource.com/gn/+/master/docs/).
In short, GN is a meta build system. Its output files serve as inputs to
[Ninja](https://ninja-build.org/), the actual build system.
In this file, the `hello_world` target is a group containing other dependencies,
notably `cpp` and `rust`. Using this target will build both of them.
```gn
group("hello_world") {
testonly = true
deps = [
":tests",
"cpp",
"rust",
]
}
```
Note: You can look at the [`build/package.gni`](/build/package.gni) file to learn
more about how Fuchsia packages are defined by GN.
This example outputs `Hello, world!` and is written in both C++ and Rust. Each
language-dependent directory has its own `BUILD.gn` file that defines a package
for the specific example, as well as a `meta` subdirectory with `.cmx` files.
The `.cmx` file is known as a
[component manifest](/docs/glossary.md#component-manifest) and describes how to run
the application on Fuchsia as a [component](/docs/glossary.md#component). This is
the proper way to create a [Fuchsia package](/docs/glossary.md#fuchsia-package).
You run a Fuchsia component by referencing its
[Fuchsia package URI](/docs/glossary.md#fuchsia-pkg-url). To run one of the
examples:
1. Make sure `fx serve` is running in a terminal window. If it's not running, start it:
```sh
fx serve
```
1. In another terminal, run:
```sh
fx shell run fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx
```
This should fail with a message stating the package was not found.
Note: If it succeeds and prints "Hello World!", then your current fx target
includes these examples already. You may need to modify your target and repave
the device, then return to this page to continue.
## Set the build to include examples
You can include the examples in the build, but you need to determine where they
will be included:
* Base: Packages that are included in paving images produced by the build.
They 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 that
updates are available.
* Universe: Packages that are additional optional packages that can be
fetched and run on-demand, but are not pre-baked into any paving images.
(For more information, see [fx workflows](/docs/development/workflows/fx.md).)
To include this package in Universe so it can be fetched on-demand, use the
`--with` flag when setting the product and board:
```sh
fx set ... --with //examples/hello_world
fx build
```
You now have a build that includes the examples.
## Run the examples
1. Make sure `fx serve` is running in a terminal window. If it's not running, start it:
```sh
fx serve
```
1. In another terminal, run:
```sh
fx shell run fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx
```
You should see the following output:
```uglyprint
Hello, World!
```
Important: If `fx serve` is not running, you should get an error from
the device (for example,
`fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx: not
found`).
The `run` command can expand a string to a URI if the string only matches one
component in your product configuration:
```sh
fx shell run hello_world_cpp
```
If there are multiple matches, the command will list them for you to choose
from:
```sh
fx shell run hello
```
```uglyprint
fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx
fuchsia-pkg://fuchsia.com/hello_world_rust#meta/hello_world_rust.cmx
Error: "hello" matched multiple components.
```
You can explore what components are in your product configuration using the
`locate` command.
* Find your favorite component.
```
fx shell locate hello_world_cpp
```
* Find all runnable components.
```
fx shell locate --list cmx
```
* Find multiple test components.
```
fx shell locate --list test
```