CMP0154

在 3.28 版本中添加。

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

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

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

此外,如果自定义命令的输出是 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 Generators 生成保守的构建图。 此策略的 NEW 行为是假设生成的文件在使用文件集的目标中是私有的,并且对于 Ninja Generators 生成更高效的构建图。

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

注意

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