Fuchsia 构建系统

概览

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 在后台执行的操作。

本文档的其余部分假定 gnninja 命令 可在PATH中找到。您可以在以下位置找到这些命令: prebuilt/third_party/gn/<platform>prebuilt/third_party/ninja/<platform>。或者,如果 如果您希望避免修改 PATH,可以为所有调用添加前缀 与 fx 相关联,即 fx gnfx 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 会保留日志, 构建流程的直观图示:

  1. 删除输出目录 - 这是为了确保日志仅代表 构建即将运行的迭代;
  2. 像往常一样运行构建:
  3. 获取 https://github.com/nico/ninjatracing
  4. 运行 ninjatracing <output directory>/.ninja_log > trace.json
  5. 在 Chrome 中的 about:tracing 中加载生成的 json 文件。

问题排查

我的 GN 目标未构建!

请确保它汇总到模块文件中定义的标签,否则 build 系统会忽略它。

GN 抱怨缺少 sysroot

您可能忘了运行 Build step 中的两个命令。

TODO(pylaligand):显示默认目标路径的命令

内部 GN 设置

TODO(pylaligand):.gn、默认目标、GN 标签插入