CMP0154

版本 3.28 新增。

在使用 文件集 (File Sets) 的目标中,生成的源文件默认是私有的。

CMake 3.27 及以下版本假定由 add_custom_command()add_custom_target() 生成的任何输出文件或副产品,都可能是旨在供依赖方源文件包含的公有头文件。这要求 Ninja 生成器 添加保守的“仅顺序依赖”(order-only dependencies),以防止目标源文件在目标依赖项的自定义命令完成之前进行编译,即使这些自定义命令仅产生对其自身目标私有的源文件也是如此。

由 CMake 3.23 引入的 文件集 (File Sets) 提供了一种表达生成的头文件可见性的方法。CMake 3.28 及以上版本倾向于假定在使用文件集的目标中,生成的源文件默认对其自身目标是私有的。生成的公有头文件必须指定为 PUBLIC(或 INTERFACEFILE_SET 的成员,通常类型为 HEADERS。有了这些信息,Ninja 生成器 可以省略上述保守的依赖关系,从而生成更高效的构建图。当使用 OPTIMIZE_DEPENDENCIES 目标属性时,对此类目标的依赖方也可以剪裁掉这些依赖项。

此外,如果自定义命令的输出是 CXX_MODULES 类型文件集的成员,则它也不需要在编译同一目标中的其他源文件之前存在。由于这些文件不应在编译时直接包含,因此它们可能不需要被隐式要求存在于其他编译规则中。

此策略为那些在目标中使用已生成的头文件但尚未更新的项目提供了兼容性。此类项目应进行更新,以在文件集中显式表达生成的公有头文件。例如:

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h
  ...
)
target_sources(foo
  PUBLIC FILE_SET HEADERS
    BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
    FILES     ${CMAKE_CURRENT_BINARY_DIR}/foo.h
)

此策略的 OLD 行为是假定生成的源文件是公有的(即使在使用了文件集的目标中也是如此),并要求 Ninja 生成器 生成保守的构建图。此策略的 NEW 行为是假定在使用文件集的目标中,生成的源文件是私有的,并允许 Ninja 生成器 生成更高效的构建图。

此策略于 CMake 3.28 版本引入。它可以通过 cmake_policy()cmake_minimum_required() 进行设置。如果未设置,CMake 不会发出警告,并使用 OLD 行为。

注意

策略的 OLD 行为根据定义已被弃用,并可能在未来版本的 CMake 中被移除。