CMP0154

版本 3.28 新增。

默认情况下,使用文件集的目标中生成的文件的可见性是私有的。

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

CMake 3.23 引入的文件集提供了一种表达生成头文件可见性的方式。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 版本中被移除。