From f1a8516c805a46de1d66f5abf17375529aa1e952 Mon Sep 17 00:00:00 2001 From: Nick Cook <nickcook@google.com> Date: Mon, 13 May 2019 23:19:16 +0000 Subject: [PATCH] [docs] Document how to run the examples in //examples. Add information about running the examples using fx commands. PiperOrigin-RevId: 246914905 Change-Id: I6489354d5941671f6f04682e548d32d0bee28fef --- docs/run-examples.md | 222 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 docs/run-examples.md diff --git a/docs/run-examples.md b/docs/run-examples.md new file mode 100644 index 00000000000..8853c7459a8 --- /dev/null +++ b/docs/run-examples.md @@ -0,0 +1,222 @@ + +# 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 these examples and then +run them on the device. + +## Explore the GN file + +Go ahead and open the `BUILD.gn` file in the `examples` directory. + +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) +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, you can see that the examples are designated as a named group. +This group names three targets as dependencies: + +```gn +group("examples") { + testonly = true + deps = [ + "cowsay", + "fortune", + "hello_world", + ] +} +``` + +You can find a directory for each of these dependencies. Each directory has its +own `BUILD.gn` file that defines a package for the specific example. + +Note: You can look at the `build/package.gni` file to learn more about how +Fuchsia packages are defined by GN. + +Let's take a look at each example. + +### Cowsay + +This sample takes a word and repeats it back from an ASCII-art cow. + +To access a shell on the device, use the `fx shell` command: + +``` +fx shell +``` + +Now run the binary directly: + +``` +cowsay hi +``` + +```uglyprint + _____ +| hi | + ----- + \ ^__^ + \ (oo)\_____ + (__)\ )\/\ + ||----w | + || || +``` + +You may notice that you can run this program without any changes to the build +you already served to the device. Why? This example is pulled in as part of the +command line utilities in `garnet/packages/prod/BUILD.gn`. But this isn't +typically how you run a Fuchsia package; you will see that soon. + +### Fortune + +This sample prints a pithy observation. Let's try to run it using the extended +format for `fx shell` that accepts command arguments: + +``` +fx shell fortune # won't work, no package in build +``` + +This won't work since this package wasn't pulled into the last build. You can +confirm it isn't in the build by listing the contents of the `bin` directory: + +``` +fx shell ls bin +``` + +`cowsay` is there, but not `fortune`. Don't worry, you will add it soon. + +### Hello world + +This sample outputs `Hello, world!` and is written in both C++ and Rust. You may +notice something different about this sample: each language-dependent directory +also contains a `meta` subdirectory with `.cmx` files. + +This type of file is known as a +[component manifest](glossary.md#component-manifest) and describes how to run +the application on Fuchsia as a [component](glossary.md#component). This is +the proper way to create a Fuchsia package. + +You run a Fuchsia component by referencing its +[Fuchsia package URI](glossary.md#fuchsia_pkg-uri). + +## 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](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: + +``` +fx set ... --with //examples +fx build +``` + +You now have a build that includes the examples. Now you need to serve this new +build to the device. You probably already have `fx serve` running, but if not, +go ahead and start it: + +``` +fx serve +``` + +## Try the examples + +Open a shell on the device to try the examples: + +``` +fx shell +``` + +### Cowsay + +This should work the same as before. It is still pulled into the base image. + +### Fortune + +Try to run the fortune example again: + +``` +fortune +``` + +It should now return a pithy quote. + +### Hello world + +You can't run this sample as the other two (try to run `hello_world_cpp` or +`hello_world_rust`). To run a Fuchsia component, you need to run it's Fuchsia +package URI. Lucily, there are some built-in conveniences to help you find this. +You can use the `run` command: + +``` +run fuchsia-pkg://fuchsia.com/hello_world_cpp#meta/hello_world_cpp.cmx +``` + +And it should output the following: + +```uglyprint +Hello, World! +``` + +Important: You must have `fx serve` running in order to serve components from +your repository to the device. If it is not running, you may 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: + +``` +run hello_world_cpp +``` + +If there are multiple matches, the command will list them for you to choose +from: + +``` +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. + + ``` + locate hello_world_cpp + ``` + +* Find all runnable components in your universe. + + ``` + locate --list cmx + ``` + +* Find multiple test components. + + ``` + locate --list test + ``` -- GitLab