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 版本中删除。