废弃了 zx*

目标和动力

过去,Fuchsia 的构建系统包含一个内部构建系统,用于构建我们称之为 Zircon 的部分代码。这包括 Zircon 内核和相关库,以及在某个时间点在组织或技术上与内核或内核工作者关联的代码。

所有 build 定义现已迁移到单个系统,但一些 build 定义仍沿用先前系统的旧版系统。特别是,还有两个适用于 build 模板的旧版封装容器:

  • zx_library()
  • zx_host_tool()

这些模板会使用一些额外的逻辑封装其他常见的 build 模板,以便在 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] Add library_headers() template

完成任务

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

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

示例

赞助商

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

  • number@google.com