构建系统

Fuchsia build 使用 Generate Ninja (GN), 一个元构建系统,可生成 Ninja:用于执行实际构建。 构建系统提供用于针对特定项目配置构建的工具 用于为 Fuchsia 目标构建代码。

编译目标

您可以使用 BUILD.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.gn 文件中定义 整个源代码树中GN 步骤的输出是一组 适用于 Ninja 的说明。

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

fx set minimal.x64
<ph type="x-smartling-placeholder">

如果要调整产品,您可以随时运行 GN 配置步骤 配置或构建可用的软件包也会调用 GN 在构建期间的任何 BUILD.gn 文件当前 配置发生更改。

面板和产品

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

开发板定义了 build 目标的架构,这可能会影响 驱动程序已包含在内,并且会影响设备专用的内核参数。

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

<ph type="x-smartling-placeholder">

产品用于定义 build 生成的软件配置。这个 配置可能包括可用服务以及面向用户的 体验。

此 Codelab 针对的是 minimal_eng 产品。

<ph type="x-smartling-placeholder">

构建

GN build 配置完成后,Ninja 即可使用生成的 build 并运行相应的编译、链接和打包命令 Fuchsia 图片。

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

fx build
<ph type="x-smartling-placeholder">

练习:构建极简

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

配置 build

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

fx set minimal.x64

此命令在产品的 build 中定义的一组目标上运行 GN 配置以生成构建说明。实际上,它并不 执行构建,而是定义了

<ph type="x-smartling-placeholder">

检查 build 配置

配置 build 后,使用 fx list-packages 输出 build 识别的软件包:

fx list-packages

此工具对于确定您所需的软件包是否已正确添加非常有用 创建 Deployment

构建极简紫红

使用 fx build 构建最小目标:

<ph type="x-smartling-placeholder">
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 版本!

练习:运行仓库服务器并提供软件包

在本练习中,您将运行一个仓库服务器来提供可用的软件包 将 universe 设置为模拟器上正在运行的 Fuchsia 目标。

如需详细了解仓库和不同的软件包集,请参阅 到 RFC-0212 Package Sets

例如,运行 ffx debug connect 将会失败,因为目标需要 一个公开 fuchsia.debugger.Launcher 功能的组件。这是 debug_agent 软件包中位于 minimal.x64universe 集内。

列出宇宙集中的软件包

运行 fx list-packages 以列出 universe 集中的软件包。对于 minimal.x64,只有一个软件包:

fx list-packages --universe

输出结果仅显示 debug_agent 软件包。debug_agent包含 组件。fuchsia.debugger.Launcher我们将 通过在后续步骤中启动调试程序来运行此功能。

启动仓库服务器并将其注册到 Fuchsia 目标

fx serve 命令会启动代码库服务器,并将其注册到 目标。

$ fx serve

如果该命令成功运行,您将看到以下输出:

2024-05-20 12:51:03 [serve] Discovery...
2024-05-20 12:51:07 [serve] Device up
2024-05-20 12:51:07 [serve] Registering devhost as update source
Serving repository '/usr/local/google/home/amituttam/fuchsia/out/minimal.x64/amber-files' to target 'fuchsia-emulator' over address '[::]:8083'.

让此命令在前台运行。要在详细模式下运行,请将 将 --verbose-v 标志设置为 fx serve

练习:运行调试程序并列出正在运行的进程

在存储库服务器运行,并且将 Fuchsia 目标配置为解析 来自该代码库的软件包,则可以运行命令来解析软件包 以及在其中运行组件

首先,我们运行一下日志,看看发生了什么:

ffx log --filter debug_agent

在单独的终端中运行上述命令,输出将为空。退出 运行命令。在这里,我们对 debug_agent 进行过滤,因为系统会 需要解析该软件包才能运行调试程序。

在另一个终端中,将调试程序连接到正在运行的系统:

ffx debug connect

该命令应启动 zxdb 并将您置于交互式 shell 中。如果您 切换到运行 ffx log 的另一个终端,您将看到 以下行输出:

[01949.544917][pkg-resolver] INFO: attempting to resolve fuchsia-pkg://fuchsia.com/debug_agent as fuchsia-pkg://devhost/debug_agent with TUF
[01949.624075][pkg-resolver] INFO: updated local TUF metadata for "fuchsia-pkg://devhost" to version RepoVersions { root: 9, timestamp: Some(1715399460), snapshot: Some(1715399460), targets: Some(1715399460) } while getting merkle for TargetPath("debug_agent/0")
[01949.835760][pkg-resolver] INFO: resolved fuchsia-pkg://fuchsia.com/debug_agent as fuchsia-pkg://devhost/debug_agent to 3f9783abed30d70b72d5f0730bd6e6033481073126aac0b74cbbf2d14909497e with TUF
[01949.882891][debugger] INFO: [main_launcher.cc(182)] Start listening on FIDL fuchsia::debugger::Launcher.

在这里,系统会尝试解析 debug_agent 软件包,并且能够 因此,在已配置的 devhost 代码库中。解析该软件包后 组件,用于监听调试程序启动器协议。

返回 zxdb,您现在可以运行 ps 来查看 系统。

[zxdb] ps
 j: 1033 root
   p: 1102 bin/component_manager
   j: 1649
     j: 1780 bootstrap/console fuchsia-boot:///console#meta/console.cm
       p: 1822 console.cm
     j: 1989 bootstrap/archivist fuchsia-boot:///archivist#meta/archivist.cm
       p: 2051 archivist.cm
     j: 2064 bootstrap/console-launcher fuchsia-boot:///console-launcher#meta/console-launcher.cm
...