废弃了 zx*

目标和动机

历史上,Fuchsia 的构建系统包含一个内部构建系统,用于构建我们粗略地称为 Zircon 的代码子集。这包括 Zircon 内核和相关库,以及在某个时间点与内核或内核开发者在组织上或技术上相关联的代码。

自那时起,所有 build 定义都已迁移到单个系统,但某些 build 定义仍保留了旧系统的旧版内容。特别是,仍有两个旧版 build 模板封装容器:

  • zx_library()
  • zx_host_tool()

这些模板使用一些额外的逻辑封装其他常见的构建模板,这些逻辑旨在强制在 Zircon 中采用 C++ 代码和头文件的通用结构。随着时间的推移,它们演变为包含其他逻辑,例如将工件发布到 SDK,这也可以通过其他模板实现,因此是重复的,可能会造成混淆。最后,一些最常见的用例可以通过标准 GN 目标类型实现,这些目标类型更为熟悉且有详细的文档。

技术背景

建议具备处理 BUILD.gn 文件的一般经验,但这并不是完全必要的。请参阅 GN 参考指南。

如何提供帮助

选择任务

首先,在 build 文件中查找 zx_libraryzx_host_tool 的任何实例。

zx_library("foo") {
  ...
}

或者,您也可以创建一个许可名单,列出仍在使用旧模板的所有现有目录(无论是直接使用,还是通过其他封装容器间接使用)。您可以在 //build/BUILD.gn 中找到许可名单。下的“"deprecated_zx_wrapper_allowlist"”下。

执行任务

使用其他模板重写使用 zx_* 封装容器的目标。

zx_library 替换为以下项之一:

  • source_set
  • sdk_source_set
  • static_library
  • sdk_static_library
  • shared_library
  • sdk_shared_library

尽可能使用内置目标类型

通常,zx_library 可以替换为 source_setstatic_library,尤其是对于不会链接到内核的代码。

通常,zx_host_tool 可以替换为内置的 executable 规则,并将其与主机工具链搭配使用,就像您通常构建主机二进制文件一样。

executable("my-host-tool") {
  sources = [
    "main.cc",
    ...
  ]
  ...
}

# To build as a host tool, append the string "($host_toolchain)" to the
# dependency
group(...) {
  deps = [
    ":my-host-tool($host_toolchain)",
    ...
  ]
}

如果 SDK 中使用该工具,您可能还需要定义 sdk_atom 目标。为此,//build/sdk/sdk_host_tool.gni 提供了一个便捷封装容器。

定义公共标头

zx_library 模板提供了实用且便捷的逻辑,用于定义 C/C++ 头文件,以供其依赖项公开使用。此逻辑还促进了 C/C++ 包含的一致源代码布局。

现在,您可以使用专用模板实现相同的效果。之前,您需要定义以下内容:

import("//build/unification/zx_library.gni")

zx_library("foo_headers") {
  sdk = "source"
  sources = []
  sdk_headers = [ "foo.h" ]
}

source_set("foo_client") {
  sources = [ "foo.cc" ]
  deps = [ ":foo_headers" ]
}

请改为定义:

import("//build/cpp/library_headers.gni")

library_headers("foo_headers") {
  headers = [ "foo.h" ]
}

source_set("foo_client") {
  sources = [ "foo.cc" ]
  public_deps = [ ":foo_headers" ]
}

另请参阅: 474231:[build] 添加了 library_headers() 模板。

完成任务

准备更改时,请务必从列出了您清理掉的目录的 //build/BUILD.gn 中移除所有行。

按照常规流程将更改送审。

示例

赞助商

如有疑问或需要了解最新状态,请与我们联系: