| # Getting started with Zircon |
| |
| ## Checking out the Zircon source code |
| |
| Note: The Fuchsia source includes Zircon. See Fuchsia's |
| [Getting Started](/docs/getting_started.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` is used to specify the "bringup" product and the board architecture. The "bringup" |
| product identifies the Zircon components and excludes all other Fuchsia components from the build. |
| For example, to build Zircon for arm64: |
| |
| ```sh |
| fx set bringup.arm64 |
| ``` |
| |
| Fuchsia uses the concept of [products](/docs/development/build/boards_and_products.md#products) to |
| create a collection of build targets. The "bringup" product is the smallest product, |
| other product configurations can be listed by running: |
| |
| ```sh |
| fx list-products |
| ``` |
| |
| The defined board architectures are listed by running: |
| |
| ```sh |
| fx list-boards |
| ``` |
| |
| To execute the build: |
| |
| ```sh |
| fx build |
| ``` |
| |
| The build results are saved in $FUCHSIA_DIR/out/default.zircon. |
| |
| ## Explictly 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 [bringup-cq](/tools/devshell/lib/multi-specs/bringup-cq) |
| 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/emulator/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 which specifies on a file-by-file basis which files to include. |
| |
| ``` |
| $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 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](/zircon/bootloader) 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). |
| |
| ``` |
| $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: |
| |
| ``` |
| $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) |