使用 GN 标签构建

fx build 现在可以直接构建 GN 目标。为此,您只需使用一个或多个 GN 目标标签,并在命令行中添加 // 前缀,如下所示:

# Build the `cstr` and `uuid` libraries for Fuchsia.
fx build //src/lib/cstr //src/lib/uuid

# Equivalent to the previous command.
fx build //src/lib/cstr:cstr //src/lib/uuid:uuid

如果标签不属于已配置的 GN 图表的一部分,则会输出错误。即使已在相应的 BUILD.gn 文件中定义,它仍需要是来自 //:defaultargs.gn 中定义的其他依赖项列表(例如 universe_package_labels 等)的传递依赖项:

# Build the corresponding tests for Fuchsia too.
$ fx build //src/lib/cstr:tests
ERROR: Unknown GN label (not in the configured graph): //src/lib/cstr:tests

如需详细了解发生这种情况的原因,请参阅 gn-root-targets

GN 工具链后缀

支持 GN 工具链后缀(但圆括号需要以 shell 引号引起来),如下所示:

# Build the host tests for the `cstr` library.
fx build '//src/lib/cstr:tests(//build/toolchain:host_x64)'

甚至:

# Same as above
fx build //src/lib/cstr:tests\(//build/toolchain:host_x64\)

GN 工具链别名

为方便起见,您可以使用特定选项为命令行上显示的 next 标签附加 GN 工具链后缀,如下所示:

# Build the `cstr` and `fidl` tests for the host, and the `trace` library for Fuchsia.
fx build --host //src/lib/cstr:tests //src/lib/fidl:tests --fuchsia //src/lib/trace

支持使用固定数量较少的别名工具链定义:

  • --host 与构建机器的主机工具链标签(例如 //build/toolchain:host_x64//build/toolchain:host_arm64)匹配。

  • --default 与当前 build 配置(例如 //build/toolchain/fuchsia:riscv64)的默认工具链匹配。

  • --fuchsia--default 的另一个名称,因为 Fuchsia 二进制文件(目前)在默认的 GN 工具链中构建。

  • --fidl//build/fidl:fidling(用于处理 FIDL 文件的 GN 工具链)匹配。

为方便起见,我们可能会逐渐添加其他别名。

GN 工具链选项

--toolchain=LABEL 选项可用于指定 GN 工具链标签:

# Build the `cstr` tests for Linux/arm64 through cross-compiling
fx build --toolchain=//build/toolchain:linux_arm64 //src/lib/cstr:tests

它也接受工具链别名,如下所示:

# Same as using `--host` directly as well.
fx build --toolchain=host //src/lib/cstr:tests

GN 标签与 Ninja 目标路径

fx build 命令将始终输出其要构建的 Ninja 目标列表,如下所示:

$ fx build //src/lib/cstr
Building Ninja target(s): obj/src/lib/cstr/cstr.stamp
...

请注意,此列表包含相应 build 命令的所有输出,包括由 GN 隐式生成的输出。无论如何,构建其中的任何一个输出都会触发相应的命令,该命令会立即生成所有输出。

$ fx build //src/lib/json_parser
Building Ninja target(s): obj/src/lib/json_parser/json_parser.inputdeps.stamp obj/src/lib/json_parser/json_parser.json_parser.cc.o obj/src/lib/json_parser/json_parser.rapidjson_validation.cc.o obj/src/lib/json_parser/json_parser.stamp
...

Ninja 定位至 GN 标签

系统仍支持传递 Ninja 目标路径,但系统会输出一条警告,并为你提供最适合的 build 参数,例如:

$ fx build host_x64/zbi host_x64/ffx
WARNING: Use '--host //zircon/tools/zbi' instead of Ninja path 'host_x64/zbi'
WARNING: Use '--host //src/developer/ffx/frontends/ffx:ffx_bin' instead of Ninja path 'host_x64/ffx'
Building Ninja target(s): host_x64/exe.unstripped/zbi host_x64/ffx host_x64/obj/src/developer/ffx/frontends/ffx/ffx_bin.stamp host_x64/obj/zircon/tools/zbi/zbi.zbi.cc.o host_x64/zbi host_x64/zbi.build-id.stamp
...

如果您不希望看到此标签,请在 -- 选项分隔符之后传递 Ninja 路径,因为它后面的所有内容都会直接传递给 Ninja:

fx build -- host_x64/zbi host_x64/ffx

不过,随着 Bazel 迁移的进行,这对将来由 Bazel 生成的输出而言都将不起作用。