blob: 88a7c9325e90c4125471d987aa9c57492be83cc9 [file] [log] [blame] [view]
# Fuchsia Samples
A collection of samples demonstrating how to build, run, and test Fuchsia
components outside the Fuchsia source code tree.
> **Caution:** These samples might be changed in backward-incompatible ways and
> are not recommended for production use. This repository is not subject to any
> SLA or deprecation policy.
## Setup
1. Install required dependencies for building:
```shell
sudo apt-get install curl unzip clang python3 build-essential
```
1. Clone this repo and submodules:
```shell
git clone https://fuchsia.googlesource.com/samples --recursive --depth 1
```
If you have already cloned this repo without the `--recursive` flag you can
run `git submodule init && git submodule update --recursive` to download the
submodules.
The git history is quite large, and you can download only the newest commit
with `--depth 1`. Remove this flag if you want the entire history.
1. Change directory to the root of the repo and setup and run the tests:
```shell
cd samples
./scripts/setup-and-test.sh
```
This script downloads all required dependencies (this may take 5-30min),
builds the samples, and runs the tests. If the script completes without
errors all tests have passed.
## C++ Samples (GN)
### Supported host platforms and build systems
The C++ samples in this repo only support Linux hosts and the
[GN build system](https://gn.googlesource.com/gn/).
### Getting started
To get started see the [SDK documentation](https://fuchsia.dev/fuchsia-src/development/sdk).
### Samples
#### bouncing_ball
Example application using Scenic to render animated graphics.
To get started, see the [README](src/bouncing_ball/README.md).
#### calculator
FIDL protocol server and client implementing a calculator interface.
To get started, see the [README](src/calculator/README.md).
#### hello_world
Basic component that prints a Hello World greeting.
To get started, see the [README](src/hello_world/README.md).
#### rot13
FIDL protocol server and client implementing a simple ROT13 encoding interface.
To get started, see the [README](src/rot13/README.md).
#### realm_builder
Integration test component using the Realm Builder library.
To get started, see the [README](src/realm_builder/README.md).
### Repository structure
#### build
The `build` directory contains the build configuration for the sample including
the toolchain, targets and tests.
#### buildtools
The `buildtools` directory contains scripts to help with the build process like
downloading needed tools (e.g. gn, ninja).
#### src
The `src` directory contains the source code for the C++ samples.
#### third_party
GN samples has two third_party dependencies: the Fuchsia GN SDK and googletest
(googletest is only required for testing):
* **Fuchsia SDK**: The Fuchsia SDK is a set of tools and libraries required to
build Fuchsia components outside Fuchsia source code tree.
It contains libraries and tools for:
* Installing/running Fuchsia and Fuchsia components/packages on a device
* Fuchsia's interprocess communication (IPC) system (FIDL)
* Other tasks needed to build, run, and test Fuchsia componenets
* **googletest**: googletest is a C++ testing framework. googletest is used to
write tests for the rot13 and hello world samples.
googletest is only required for testing.
## Emulating x64 on x64 hosts
Fuchsia x64 system images can be started with the included emulator scripts and
run on x64 hosts. Native Vulkan support on the host is required for graphics support.
1. Install dependencies for Vulkan support:
```shell
sudo apt-get install libvulkan1 mesa-vulkan-drivers
```
1. Download tool dependencies:
```shell
./scripts/download-build-tools.sh
```
1. Generate Ninja files x64 targets:
```shell
./buildtools/linux64/gn gen out/x64 --args='target_os="fuchsia" target_cpu="x64"'
```
1. List the available product bundles, and download the **workstation_eng.qemu-x64** bundle:
```shell
./third_party/fuchsia-sdk/tools/x64/ffx product-bundle list
```
```shell
./third_party/fuchsia-sdk/tools/x64/ffx product-bundle get workstation_eng.qemu-x64
```
1. Start the emulator:
```shell
./third_party/fuchsia-sdk/tools/x64/ffx emu start workstation_eng.qemu-x64
```
1. Start the package server:
```shell
./third_party/fuchsia-sdk/tools/x64/fserve --image qemu-x64
```
1. SSH to the emulator:
```shell
./third_party/fuchsia-sdk/tools/x64/fssh
```
## Emulating arm64 on x64 hosts
Fuchsia arm64 system images can be emulated on x64 hosts with the included
emulator scripts, although the performance is much slower since each instruction
needs to be emulated. Graphics output is also not supported at this time,
access is only via serial console or SSH.
1. Download tool dependencies:
```shell
./scripts/download-build-tools.sh
```
1. Generate Ninja files for arm64 targets:
```shell
./buildtools/linux64/gn gen out/arm64 --args='target_os="fuchsia" target_cpu="arm64"'
```
1. List the available product bundles, and download the **terminal.qemu-arm64** bundle:
```shell
./third_party/fuchsia-sdk/tools/x64/ffx product-bundle list
```
```shell
./third_party/fuchsia-sdk/tools/x64/ffx product-bundle get terminal.qemu-arm64
```
1. Start the emulator headless. Use the QEMU engine and smaller terminal.qemu-arm64 for *much* better performance. Use a longer timeout since arm64 on x64 emulation is slower:
```shell
./third_party/fuchsia-sdk/tools/x64/ffx emu start --engine qemu --headless --startup-timeout 360 terminal.qemu-arm64
```
1. Start the package server:
```shell
./third_party/fuchsia-sdk/tools/x64/fserve --image qemu-arm64
```
1. SSH to the emulator:
```shell
./third_party/fuchsia-sdk/tools/x64/fssh
```