构建系统

Fuchsia build 使用 Generate Ninja (GN),这是一个元构建系统,可生成供执行实际 build 的 Ninja 使用的 build 文件。构建系统提供用于为特定产品配置 build 的工具,以及用于为 Fuchsia 目标构建代码的模板。

编译目标

您可以使用位于项目源代码中的 BUILD.gn 文件为 GN 定义各个构建目标。Fuchsia 构建系统以 GN 导入项 (.gni) 的形式提供模板,供您声明 Fuchsia 工件,例如:

  • fuchsia_component():定义包含清单、程序二进制文件和资源的可执行组件
  • fuchsia_package():定义一个软件包,其中包含要在软件包代码库中分发的一个或多个组件。
  • fuchsia_test_package():定义包含测试组件的软件包。

下面是一个包含测试的简单组件软件包的 BUILD.gn 文件示例:

import("//build/components.gni")

executable("bin") {
  sources = [ "main.cc" ]
}

fuchsia_component("hello-world-component") {
  deps = [ ":bin" ]
  manifest = "meta/hello-world.cml"
}

fuchsia_package("hello-world") {
  deps = [
    ":hello-world-component",
  ]
}

fuchsia_component("hello-world-test-component") {
  testonly = true
  deps = [ ":bin_test" ]
  manifest = "meta/hello-world-bin-test.cml"
}

fuchsia_test_package("hello-world-tests") {
  test_components = [ ":hello-world-test-component" ]
}

由目标的名称及其 BUILD.gn 文件的路径组成的唯一标签用于标识可以参与构建的所有内容。在上面的示例中,hello-world 目标可能具有如下所示的标签://src/examples/basic:hello-world

build 配置

GN 前端会根据所选的 Fuchsia 产品配置配置 build,以收集 build 所需的所有必要软件包和组件。这些目标在整个源代码树中的各种 BUILD.gn 文件中定义。GN 步骤的输出是 build 目录中针对 Ninja 的一组优化指令。

当您运行 fx set 命令来配置 build 时,构建系统会调用 GN。

fx set minimal.x64

如果您想调整产品配置或可供 build 使用的软件包,就应该随时运行 GN 配置步骤。每当当前配置中的任一 BUILD.gn 文件发生更改时,系统也会在构建期间自动调用 GN。

面板和产品

Fuchsia 构建系统将 Fuchsia build 的基准配置定义为产品和主板的组合。这些元素共同构成您向 fx set 提供的 build 配置。

开发板定义构建目标的架构,这可能会影响包含的驱动程序并影响特定于设备的内核参数。

此 Codelab 以 x64 开发板为目标,该开发板支持在 x64 架构上运行的 Fuchsia 模拟器 (FEMU)。

产品定义了 build 生成的软件配置。此配置可能包括哪些服务以及面向用户的体验。

此 Codelab 以 minimal_eng 产品为目标。

Build

完成 GN build 配置后,Ninja 会使用生成的 build 文件,并运行相应的编译、链接和打包命令以生成 Fuchsia 映像。

当您运行 fx build 命令来执行当前的 build 配置时,构建系统会调用 Ninja。

fx build

练习:构建极简

在本练习中,您将从源代码构建 minimal_eng 产品配置,以便在 x64 模拟器板上运行。

配置 build

minimal 产品和 x64 开发板设置构建环境:

fx set minimal.x64

此命令会对产品的 build 配置中定义的目标集运行 GN 以生成构建指令。它实际上并不执行构建,而是定义了被视为可构建对象的参数。

检查 build 配置

配置 build 后,使用 fx list-packages 输出 build 发现的一组软件包:

fx list-packages

该工具对于确定您所需的软件包是否已正确包含在 build 配置中非常有用。

构建 Fuchsia Minimal

使用 fx build 构建最小目标:

fx build

重启模拟器

  1. 运行以下命令以关闭当前已打开的所有模拟器实例:

    ffx emu stop --all
    
  2. 启动一个新的模拟器实例:

    ffx emu start --headless
    

    启动完成后,模拟器会输出以下消息并返回:

    Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log"
    Waiting for Fuchsia to start (up to 60 seconds)........
    Emulator is ready.
    

检查设备

打开另一个终端窗口,然后运行以下命令来输出设备目标的详细信息:

ffx target show

查找目标输出的 build 配置:

Version: "2000-01-01T12:00:00+00:00"
Product: "minimal_eng"
Board: "x64"
Commit: "2000-01-01T12:00:00+00:00"

请注意,该配置指向您刚刚在计算机上完成的构建。

您现在运行的是自己的 Fuchsia 版本!