概览
Fuchsia 构建系统旨在构建启动映像和可更新的 适用于各种设备的软件包为此,它使用的是 GN,这是一种元 build。 该系统可生成 Ninja 使用的 build 文件, 在实际构建过程中
请注意,Zircon 使用其他构建系统,尽管仍使用 GN 和 忍者。
使用入门
如果您不熟悉 Fuchsia 的构建系统和 GN,请参阅使用 GN build,概述了 GN 构建系统的基本原则。
面板和产品
生成的图片的内容由 和产品的最小初始配置是紫红色的 build。板级和产品定义用于定义软件包的依赖项集 映像、更新和软件包代码库中包含的所有资源 开发板和产品文档介绍了 这些 build 配置的使用。
套装
软件包是指源代码树中某一部分的一组相关软件包,
例如所有工具或所有测试有关软件包的概述,请参见
软件包。我们在
//bundles
。
编译目标
构建目标在分散在源代码中的 BUILD.gn
文件中定义
树。这些文件使用类似 Python 的语法来声明可构建的对象:
import("//build/some/template.gni")
my_template("foo") {
name = "foo"
extra_options = "//my/foo/options"
deps = [
"//some/random/framework",
"//some/other/random/framework",
]
}
可用命令(使用 gn cli 工具调用)和结构(内置目标)
声明类型)在 GN 参考中定义。还有
.gni
文件中也有一些自定义模板
//build
项目。
Fuchsia 定义了许多自定义模板 来支持定义和构建 Fuchsia 特定的工件。
执行构建
为此,最简单的方法是使用 fx
工具,如
fx 工作流。继续阅读
fx
在后台执行的操作。
本文档的其余部分假定 gn
和 ninja
命令
可在PATH
中找到。您可以在以下位置找到这些命令:
prebuilt/third_party/gn/<platform>
和
prebuilt/third_party/ninja/<platform>
。或者,如果
如果您希望避免修改 PATH
,可以为所有调用添加前缀
与 fx
相关联,即 fx gn
或 fx ninja
。
生成步骤
首先,通过选择开发板和产品来配置主要构建工件 构建:
fx gn gen $(fx get-build-dir) --args='import("//boards/x64.gni") import("//products/core.gni")'
这将创建一个包含 Ninja 的 build 目录(通常为 out/default
)
文件。
等效的 fx set
命令如下:
fx set core.x64
如需所有 GN 构建参数的列表,请运行以下命令:
fx gn args $(fx get-build-dir) --list
如需查看有关 select_variant
参数的文档,请参阅变体。
构建步骤
下一步是使用 Ninja 运行实际 build:
fx ninja -C $(fx get-build-dir)
这是 fx build
在后台运行的。
重建
如需在修改一些源代码后重新构建树,只需重新运行
构建步骤。即使您在 GN 添加时修改 BUILD.gn
文件,也是如此
如果 build 文件发生更改,Ninja 目标会更新 Ninja 目标!相同
适用于配置 build 的其他文件。更改来源
需要手动重新调用生成步骤的操作是构建 bug,
。
提示和技巧
检查 GN 目标的内容
fx gn desc $(fx get-build-dir) //path/to/my:target
查找对 GN 目标的引用
fx gn refs $(fx get-build-dir) //path/to/my:target
引用构建主机的目标
各种宿主工具(有些在 build 本身中使用)需要与 最终图片。
如需从模块文件引用主机工具链的构建目标,请执行以下操作:
//path/to/target(//build/toolchain:host_x64)
从 BUILD.gn
中引用主机工具链的构建目标
文件:
//path/to/target($host_toolchain)
仅构建特定目标
如果目标在 GN build 文件中定义为 //foo/bar/blah:dash
,则该目标
(及其依赖项)可通过以下方式进行构建:
fx ninja -C $(fx get-build-dir) -j64 foo/bar/blah:dash
请注意,这仅适用于默认工具链中的目标。
探索忍者目标
GN 广泛记录了 Ninja 针对其生成的目标。相关文档 可通过以下方式访问:
fx gn help ninja_rules
您还可以浏览输出中当前定义的各组 Ninja 目标 目录,其中包含:
fx ninja -C $(fx get-build-dir) -t browse
请注意,存在忍者目标并不意味着将会构建该目标, 需要依赖于“默认”目标
了解 Ninja 的用途
将 -d explain
添加到 Ninja 命令,让它解释其
执行。
调试构建时间问题
运行构建时,Ninja 会保留日志, 构建流程的直观图示:
- 删除输出目录 - 这是为了确保日志仅代表 构建即将运行的迭代;
- 像往常一样运行构建:
- 获取 https://github.com/nico/ninjatracing;
- 运行
ninjatracing <output directory>/.ninja_log > trace.json
; - 在 Chrome 中的
about:tracing
中加载生成的 json 文件。
问题排查
我的 GN 目标未构建!
请确保它汇总到模块文件中定义的标签,否则 build 系统会忽略它。
GN 抱怨缺少 sysroot
。
您可能忘了运行 Build step 中的两个命令。
TODO(pylaligand):显示默认目标路径的命令
内部 GN 设置
TODO(pylaligand):.gn、默认目标、GN 标签插入