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 生成器会在目标 second 的 Makefile 中复制两个自定义命令,即使它对目标 first 的依赖确保第一个自定义命令在第二个之前运行。运行 make second 会导致第一个自定义命令在 first 目标中运行一次,然后在 second 目标中再次运行。

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

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

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

注意

OLD 行为的策略是 按定义弃用,并且可能会在未来的 CMake 版本中被移除。