CMake策略的范围是什么?

14

我有一个包含多个子目录的CMake项目,就像这样:

dir1
    subdir11
    subdir12
dir2
    subdir21
    subdir22

根CMakeLists.txt文件:

add_subdirectory(dir1)
add_subdirectory(dir2)

dir1和dir2中的CMakeLists文件相似:

add_subdirectory(subdir11)
add_subdirectory(subdir12)

add_subdirectory(subdir21)
add_subdirectory(subdir22)

子目录中的CMakeLists才是真正的工作执行者。

文件dir1/subdir12/CMakeLists.txtCMP0046策略设置为OLD

cmake_policy(SET CMP0046 OLD) #silently ignore missing dependencies

我的问题是,这个CMP0046设置会传播到subdir21subdir22吗?


1
不要将策略设为OLD。应该修复你的代码。政策存在的目的是为了明确地获得NEW行为。OLD行为将在未来的版本中完全删除。 - steveire
抱歉,我不能这样做。我的CMake代码会生成一些头文件和一些.c源文件。 - wl2776
这毫无意义。生成文件并不会阻止将CMP0046设置为NEW。 - steveire
同意,这没有意义。我的目标是抑制有关缺少文件的警告,我已经通过“OLD”“CMP0046”实现了这一目标。如果您能提出另一种方法,我将不胜感激。 - wl2776
我建议您创建一个 http://sscce.org/ 来展示您的问题,并在 Stack Overflow 上发布。将 CMP0046 设置为 OLD 是不正确的,我希望没有人跟随您的步伐。 - steveire
2个回答

9
不行。这个问题最好从文档中直接回答:文档中解释了策略设置如何使用堆栈进行作用域限定。当进入项目的新子目录(使用add_subdirectory)时,堆栈会推入一个新级别,并在离开该子目录时弹出。因此,在项目的一个目录中设置策略不会影响父目录或同级目录,但会影响子目录。如果要对特定级别进行临时更改而不包括子目录,则可以使用。
cmake_policy(PUSH)
cmake_policy(POP)

如果你想要将此策略应用于subdir21和subdir22,你需要在这里明确地添加它或考虑将其添加到公共父级目录。

8

该变量不应该由CMake代码中的项目设置为设置其自己的策略的一种方式。详情请访问https://cmake.org/cmake/help/latest/variable/CMAKE_POLICY_DEFAULT_CMPNNNN.html。 - Dmytro
@Dmytro 有更好的解决方案吗? - CAMOBAP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接