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 架构上运行。
产品用于定义 build 生成的软件配置。这个 配置可能包括可用服务以及面向用户的 体验。
此 Codelab 针对的是 minimal_eng
产品。
构建
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
构建最小目标:
fx build
重启模拟器
运行以下命令以关闭您当前拥有的所有模拟器实例 打开:
ffx emu stop --all
启动新的模拟器实例:
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.x64
的 universe
集内。
列出宇宙集中的软件包
运行 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
...