CMP0116¶
在 3.20 版本中添加。
Ninja 生成器会转换 add_custom_command() 的 DEPFILE。
在 CMake 3.19 及更早版本中,传递给 add_custom_command() 的 DEPFILE 参数会直接传递给 Ninja 的 depfile 变量,没有任何路径解析。这意味着,如果 add_custom_command() 是从子目录(由 add_subdirectory() 创建)调用的,那么 DEPFILE 参数必须是绝对路径,或者是相对于 CMAKE_BINARY_DIR 的路径,而不是相对于 CMAKE_CURRENT_BINARY_DIR 的路径。此外,DEPFILE 参数中列出的文件不会进行任何转换,这意味着 DEPFILE 内的路径也存在相同的限制。
从 CMake 3.20 开始,DEPFILE 参数是相对于 CMAKE_CURRENT_BINARY_DIR 的(除非它是绝对路径),并且 DEPFILE 中的路径也是相对于 CMAKE_CURRENT_BINARY_DIR 的。自定义命令运行后,CMake 会自动转换 DEPFILE 中的路径(除非它们是绝对路径)。DEPFILE 中列出的文件不会以任何方式修改。相反,CMake 会将其转换写入自己的内部文件,并将此内部文件传递给 Ninja 的 depfile 变量。无论 DEPFILE 是否为相对路径,也无论 add_custom_command() 是否是从子目录调用的,都会发生此转换。
OLD 行为是将 DEPFILE 未经修改地传递给 Ninja。此策略的 NEW 行为是在运行自定义命令后转换 DEPFILE。CMP0116 的状态在创建自定义命令时记录,您可以通过在每个自定义命令之前设置策略,使同一目录中的自定义命令具有不同的 CMP0116 值。
此策略在 CMake 版本 3.20 中引入。可以通过 cmake_policy() 或 cmake_minimum_required() 进行设置。如果未设置,CMake 默认不会发出警告(除非在子目录中使用 DEPFILE),并使用 OLD 行为。
有关控制警告的信息,请参阅 CMAKE_POLICY_WARNING_CMP0116 变量的文档。
注意
策略的 OLD 行为 根据定义已被弃用,并可能在未来的 CMake 版本中被移除。