CMP0154

版本 3.28 新增。

在使用文件集的目标中,生成的文件默认是私有的。

CMake 3.27 及更早版本假定作为 add_custom_command()add_custom_target() 的输出或副产品而生成的任何文件都可能是公共头文件,旨在供依赖项的源文件包含。这要求Ninja 生成器添加保守的仅排序依赖项,以防止目标的源文件在目标的依赖项中的自定义命令完成之前进行编译,即使这些自定义命令仅生成其自身目标的私有源。

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

此外,如果自定义命令的输出是类型为 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 中移除。