CMP0113

在版本 3.19 中添加。

Makefile 生成器不重复目标依赖项的自定义命令。

考虑分为两个依赖目标的自定义命令链

add_custom_command(OUTPUT output-not-created
  COMMAND ... DEPENDS ...)
set_property(SOURCE output-not-created PROPERTY SYMBOLIC 1)
add_custom_command(OUTPUT output-created
  COMMAND ... DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/output-not-created)
add_custom_target(first DEPENDS output-not-created)
add_custom_target(second DEPENDS output-created)
add_dependencies(second first)

在 CMake 3.18 及更低版本中,Makefile 生成器将两个自定义命令的副本放入 Makefile 中,用于目标 second,即使它对目标 first 的依赖性确保了第一个自定义命令早于第二个运行。运行 make second 会导致第一个自定义命令在 first 目标中运行一次,然后在 second 目标中再次运行。

CMake 3.19 及更高版本倾向于不重复目标中的自定义命令,而这些命令已经在目标所依赖(直接或间接)的其他目标中生成。本策略为尚未更新以期望新行为的项目提供兼容性。特别是,依赖重复执行或未正确设置 SYMBOLIC 源文件属性的项目可能会受到影响。

本策略的 OLD 行为是在依赖目标中重复自定义命令。本策略的 NEW 行为是不在依赖目标中重复自定义命令。

此策略在 CMake 3.19 版本中引入。可以通过 cmake_policy()cmake_minimum_required() 设置。如果没有设置,CMake 会 警告,并使用 OLD 行为。

注意

策略的 OLD 行为默认情况下 已被 弃用可能会在将来的 CMake 版本中删除。