| # Getting started with Zircon |
| |
| ## Checking out the Zircon source code |
| |
| Note: The Fuchsia source includes Zircon. See Fuchsia's |
| [Getting Started](/docs/get-started/README.md) documentation. |
| |
| This guide assumes that the Fuchsia project is checked out into `$FUCHSIA_DIR`, |
| and `fx` has been configured. |
| |
| ## Build Zircon with the default toolchain |
| |
| The `fx` command wraps the various tools used to configure, build and interact |
| with Fuchsia. The `fx set` command is used to specify the product and the board |
| architecture. For example, to set your build target to be Zircon for `arm64`, |
| run the following command: |
| |
| ```sh |
| fx set bringup.arm64 |
| ``` |
| |
| Fuchsia uses the concept of |
| [products](/docs/development/build/build_system/boards_and_products.md#products) to |
| create a collection of build targets. The |
| [bringup product](/docs/development/build/build_system/boards_and_products.md#bringup-product) |
| is the smallest product with a minimal feature set. |
| |
| The following command prints a list of other product configurations: |
| |
| ```sh |
| fx list-products |
| ``` |
| |
| The following command prints a list of the defined board architectures: |
| |
| ```sh |
| fx list-boards |
| ``` |
| |
| To execute the build, run the following command: |
| |
| ```sh |
| fx build |
| ``` |
| |
| The build results are saved in `$FUCHSIA_DIR/out/default`. |
| |
| ## Explicitly set the target toolchain |
| |
| By default Fuchsia uses the `clang` toolchain. This can be set to `gcc` by using |
| the `variants` argument with `fx set`: |
| |
| ```sh |
| fx set bringup.x64 --variant gcc |
| ``` |
| |
| You can also enable asan by using the variant flag. |
| |
| ## Building Zircon for all targets |
| |
| You can build for all targets with `fx multi` and using a file that contains all |
| the specifications to build. The output for each target is found in |
| `$FUCHSIA_DIR/out/<product>.<board>.variant`. An example of a multi build spec |
| is <code>[bringup-cq](/tools/devshell/lib/multi-specs/bringup-cq)</code>, which |
| approximates what is built for a CQ test. |
| |
| Please build for all targets before submitting to ensure builds work on all |
| architectures. |
| |
| ## QEMU |
| |
| You can skip this if you're only testing on actual hardware, but the emulator is |
| handy for quick local tests and generally worth having around. |
| |
| See [QEMU](/docs/development/debugging/qemu.md) for information on building and |
| using QEMU with zircon. |
| |
| ## Build Toolchains (Optional) |
| |
| If the prebuilt toolchain binaries do not work for you, you can build your own |
| from vanilla upstream sources. |
| |
| * The Clang toolchain is used to build Zircon by default or if you build with |
| `variants = [ "clang" ]` or `variants = [ "asan" ]`. |
| * The Clang toolchain is also used by default to build host-side code, but any |
| C++14-capable toolchain for your build host should work fine. |
| * The GCC toolchain is also available. |
| |
| Build one or the other or both, as needed for how you want build Zircon. |
| |
| ### GCC Toolchain |
| |
| We use GNU `binutils` 2.30[^1] and GCC 8.2, configured with |
| `--enable-initfini-array --enable-gold`, and with `--target=x86_64-elf |
| --enable-targets=x86_64-pep` for x86-64 or `--target=aarch64-elf` for ARM64. |
| |
| For `binutils`, we recommend `--enable-deterministic-archives` but that switch |
| is not necessary to get a working build. |
| |
| For GCC, it's necessary to pass `MAKEOVERRIDES=USE_GCC_STDINT=provide` on the |
| `make` command line. This should ensure that the `stdint.h` GCC installs is one |
| that works standalone (`stdint-gcc.h` in the source) rather than one that uses |
| `#include_next` and expects another `stdint.h` file installed elsewhere. |
| |
| Only the C and C++ language support is required and no target libraries other |
| than `libgcc` are required, so you can use various `configure` switches to |
| disable other things and make your build of GCC itself go more quickly and use |
| less storage, e.g. `--enable-languages=c,c++ --disable-libstdcxx |
| --disable-libssp --disable-libquadmath`. See the GCC installation documentation |
| for more details. |
| |
| You may need various other `configure` switches or other prerequisites to build |
| on your particular host system. See the GNU documentation. |
| |
| [^1]: The `binutils` 2.30 release has some harmless `make check` failures in the |
| `aarch64-elf` and `x86_64-elf` configurations. These are fixed on the |
| upstream `binutils-2_30-branch` git branch, which is what we actually |
| build. But the 2.30 release version works fine for building Zircon; it |
| just has some spurious failures in its own test suite. |
| |
| ### Clang/LLVM Toolchain |
| |
| We use a trunk snapshot of Clang and update to new snapshots frequently. Any |
| build of recent-enough Clang with support for `x86_64` and `aarch64` compiled in |
| should work. You'll need a toolchain that also includes the runtime libraries. |
| We normally also use the same build of Clang for the host as well as for the |
| `*-fuchsia` targets. See [here](/docs/development/build/toolchain.md) for |
| details on how we build Clang. |
| |
| ### Set up build arguments for toolchains |
| |
| If you're using the prebuilt toolchains, you can skip this step, since the build |
| will find them automatically. |
| |
| Set the build argument that points to where you installed the toolchains: |
| |
| ```sh |
| fx set bringup.x64 --variant clang --args clang_tool_dir = "<absolute path to>/clang-install/bin/" |
| ``` |
| |
| or for GCC: |
| |
| ```sh |
| fx set bringup.x64 --variant gcc --args gcc_tool_dir = "<absolute path to>/gcc-install/bin/" |
| ``` |
| |
| Note that `*_tool_dir` should have a trailing slash. If the `clang` or `gcc` in |
| your `PATH` works for Zircon, you can just use empty prefixes. |
| |
| ## Copying files to and from Zircon |
| |
| With local link IPv6 configured you can use `fx cp` to copy files to and from |
| the device. |
| |
| ## Including Additional Userspace Files |
| |
| The Zircon build creates a bootfs image containing necessary userspace |
| components for the system to boot (the device manager, some device drivers, |
| etc). The kernel is capable of including a second bootfs image, which is provided |
| by QEMU or the bootloader as a ramdisk image. |
| |
| To create such a bootfs image, use the zbi tool that's generated as part of the |
| build. It can assemble a bootfs image for either source directories (in which |
| case every file in the specified directory and its subdirectories are included) |
| or via a manifest file that specifies, on a file-by-file basis, which files to |
| include. |
| |
| ```none |
| $BUILDDIR/tools/zbi -o extra.bootfs @/path/to/directory |
| |
| echo "issue.txt=/etc/issue" > manifest |
| echo "etc/hosts=/etc/hosts" >> manifest |
| $BUILDDIR/tools/zbi -o extra.bootfs manifest |
| ``` |
| |
| On the booted Zircon system, the files in the bootfs will appear under /boot, so |
| in the above manifest example, the "hosts" file would appear at /boot/etc/hosts. |
| |
| ## Network Booting {#network-booting} |
| |
| Network booting is supported via two mechanisms: Gigaboot and Zirconboot. |
| Gigaboot is an EFI based bootloader whereas zirconboot is a mechanism that |
| allows a minimal zircon system to serve as a bootloader for zircon. |
| |
| On systems that boot via EFI (such as Acer and NUC), either option is viable. On |
| other systems, zirconboot may be the only option for network booting. |
| |
| ### Via Gigaboot |
| |
| The [GigaBoot20x6](/src/firmware/gigaboot) bootloader speaks a simple network |
| boot protocol (over IPV6 UDP), which does not require any special host |
| configuration or privileged access to use. |
| |
| It does this by taking advantage of IPV6 Link Local Addressing and Multicast, |
| allowing the device being booted to advertise its bootability and the host to |
| find it and send a system image to it. |
| |
| If you have a device (for example a Broadwell or Skylake Intel NUC) running |
| GigaBoot20x6, first |
| [create a USB drive](/docs/development/hardware/usb_setup.md). |
| |
| ```none |
| $BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin |
| |
| # if you have an extra bootfs image (see above): |
| $BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin /path/to/extra.bootfs |
| ``` |
| |
| By default bootserver will continue to run and every time it observes a netboot |
| beacon it will send the kernel (and bootfs if provided) to that device. If you |
| pass the -1 option, bootserver will exit after a successful boot instead. |
| |
| ### Via Zirconboot |
| |
| Zirconboot is a mechanism that allows a zircon system to serve as the bootloader |
| for zircon itself. Zirconboot speaks the same boot protocol as Gigaboot |
| described above. |
| |
| To use zirconboot, pass the `netsvc.netboot=true` argument to zircon via the |
| kernel command line. When zirconboot starts, it will attempt to fetch and boot |
| into a zircon system from a bootserver running on the attached host. |
| |
| ## Network Log Viewing |
| |
| The default build of Zircon includes a network log service that multicasts the |
| system log over the link local IPv6 UDP. Please note that this is a quick hack |
| and the protocol will certainly change at some point. |
| |
| For now, if you're running Zircon on QEMU with the -N flag or running on |
| hardware with a supported ethernet interface (ASIX USB Dongle or Intel Ethernet |
| on NUC), the loglistener tool will observe logs broadcast over the local link: |
| |
| ```none |
| $BUILDDIR/tools/loglistener |
| ``` |
| |
| ## Debugging |
| |
| For random tips on debugging in the zircon environment see |
| [debugging](/docs/development/debugging/tips.md). |
| |
| ## Contribute changes |
| |
| * See [CONTRIBUTING.md](/CONTRIBUTING.md#contributing-patches-to-zircon) |