签出 Zircon 源代码
本指南假定将 Fuchsia 项目签出到 $FUCHSIA_DIR
中,
和 fx
已配置完毕。
使用默认工具链构建 Zircon
fx
命令封装了用于配置、构建和交互的各种工具
Fuchsia 为您介绍。fx set
命令用于指定产品和板
架构。例如,如需针对 arm64
将 build 目标设置为 Zircon,
运行以下命令:
fx set bringup.arm64
Fuchsia 运用 products 至 创建一系列构建目标。通过 预发布产品 是具有最少特征集的最小商品。
以下命令会输出其他产品配置的列表:
fx list-products
以下命令会输出定义的板级架构的列表:
fx list-boards
如需执行构建,请运行以下命令:
fx build
构建结果保存在 $FUCHSIA_DIR/out/default
中。
明确设置目标工具链
默认情况下,Fuchsia 使用 clang
工具链。可以使用gcc
将 variants
参数与 fx set
搭配使用:
fx set bringup.x64 --variant gcc
您还可以使用变体标志启用 asan。
为所有目标构建 Zircon
您可以使用 fx multi
和包含所有目标的文件进行构建,
要构建的规范您可以在以下位置找到每个目标的输出:
$FUCHSIA_DIR/out/<product>.<board>.variant
。多 build 规范示例
为 bringup-cq
,因此
用于估算为 CQ 测试而构建的内容。
请先针对所有目标进行构建,然后再提交,以确保构建适用于所有目标 架构。
QEMU
如果您仅在实际硬件上进行测试,但模拟器是 便于快速进行本地测试,通常值得一试。
请参阅 QEMU,了解有关构建和 使用带有 Zircon 的 QEMU
构建工具链(可选)
如果预构建工具链二进制文件不适合您,您可以构建自己的 原始上游来源。
- Clang 工具链默认用于构建 Zircon,如果您使用
variants = [ "clang" ]
或variants = [ "asan" ]
。 - Clang 工具链默认也用于构建主机端代码, 构建主机支持 C++14 的工具链应该可以正常运行。
- 您也可以使用 GCC 工具链。
根据需要构建 Zircon 中的一种或两种,或者两种。
GCC 工具链
我们使用 GNU binutils
2.301 和 GCC 8.2,
--enable-initfini-array --enable-gold
;对于 x86-64,使用 --target=x86_64-elf
--enable-targets=x86_64-pep
;对于 ARM64,则使用 --target=aarch64-elf
。
对于binutils
,我们建议使用 --enable-deterministic-archives
,但此开关
无需进行此操作。
对于 GCC,需要传递 MAKEOVERRIDES=USE_GCC_STDINT=provide
make
命令行。这应确保 stdint.h
GCC 安装的是
可以独立工作(源代码中的 stdint-gcc.h
),而不是使用
#include_next
,需要另外安装另一个 stdint.h
文件。
仅需要 C 和 C++ 语言支持,无需其他目标库
而不是 libgcc
,因此您可以使用各种 configure
开关
停用其他功能,并加快 GCC 构建速度,并使用
存储空间更少,例如--enable-languages=c,c++ --disable-libstdcxx
--disable-libssp --disable-libquadmath
。请参阅 GCC 安装文档
了解详情。
您可能需要其他各种 configure
开关或其他前提条件才能进行构建
特定主机系统上。请参阅 GNU 文档。
Clang/LLVM 工具链
我们使用 Clang 的主干快照,并经常更新至新的快照。不限
支持 x86_64
和 aarch64
且足够新近的 Clang
。您将需要一个包含运行时库的工具链。
我们通常也会为主机和
*-fuchsia
项目标。如需了解更多详情,请点击此处
我们将为您详细介绍如何构建 Clang
为工具链设置构建参数
如果您使用的是预构建的工具链,则可以跳过此步骤,因为构建 系统会自动找到它们
设置指向您安装工具链的位置的构建参数:
fx set bringup.x64 --variant clang --args clang_tool_dir = "<absolute path to>/clang-install/bin/"
或对于 GCC:
fx set bringup.x64 --variant gcc --args gcc_tool_dir = "<absolute path to>/gcc-install/bin/"
请注意,*_tool_dir
的尾部应该带有斜杠。如果 clang
或 gcc
:
您的PATH
适用于 Zircon,您只需使用空前缀即可。
正在与 Zircon 之间复制文件
配置本地链路 IPv6 后,您可以使用 fx cp
将文件复制到和复制出文件
。
包括其他用户空间文件
Zircon build 会创建一个包含必要用户空间的 bootfs 映像 (设备管理器、某些设备驱动程序、 等)。内核能够添加第二个 bootfs 映像,该映像由 作为 ramdisk 映像运行。
要创建这样的 bootfs 映像,请使用 zbi 工具,该工具是 build。它可以为源目录(其中每个目录所在的目录) 包含指定目录及其子目录中的每个文件的情况) 或通过清单文件逐个文件指定 包括。
$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
在启动的 Zircon 系统中,bootfs 中的文件将出现在 /boot 下, 在上述清单示例中,“hosts”文件将位于 /boot/etc/hosts。
网络启动
可通过两种机制支持网络启动:Gigaboot 和 Zirconboot。 Gigaboot 是基于 EFI 的引导加载程序,而 zirconboot 是一种 允许最小的 Zircon 系统充当 Zircon 的引导加载程序。
在通过 EFI 启动的系统(例如 Acer 和 NUC)上,这两种模式都可行。已开启 zirconboot 可能是唯一的网络启动选项。
Gigaboot 路
GigaBoot20x6 引导加载程序支持简单的网络 启动协议(通过 IPV6 UDP),无需任何特殊主机 配置或特权访问权限。
它利用 IPV6 链路本地寻址和多播实现 允许正在启动的设备通告其可启动性,并且允许主机 并向其发送系统映像。
$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
默认情况下,bootserver 将继续运行,并且每次检测到 netboot 时 信标会将内核(和 bootfs,如果提供)发送到该设备。如果您 传递 -1 选项,则 bootserver 将在成功启动后退出。
通过 Zirconboot
Zirconboot 是一种机制,允许 Zircon 系统充当引导加载程序 Zirconboot 采用与 Gigaboot 相同的启动协议 。
如需使用 zirconboot,请通过netsvc.netboot=true
内核命令行。当 zirconboot 启动时,它将尝试提取并启动
从在连接的主机上运行的 bootserver 进入 Zircon 系统。
网络日志查看
Zircon 的默认版本包含网络日志服务,可将 通过链路本地 IPv6 UDP 运行的系统日志。请注意,这是一个小技巧 协议在某个时间点肯定会发生变化
目前,如果您在使用 -N 标志的 QEMU 上运行 Zircon,或 具有受支持的以太网接口(ASIX USB 加密狗或 Intel 以太网)的硬件 ),则日志监听器工具将观察通过本地链接广播的日志:
$BUILDDIR/tools/loglistener
调试
有关在 zircon 环境中进行调试的随机提示,请参阅 调试。
贡献更改
- 请参阅 CONTRIBUTING.md
-
binutils
2.30 版本在make check
aarch64-elf
和x86_64-elf
配置。这些问题会在 上游binutils-2_30-branch
git 分支,这是我们实际 build。不过,2.30 版适合构建 Zircon;它 只是其自身的测试套件中有一些虚假失败。↩