【问题标题】:What is the scope of CMake policies?CMake 策略的范围是什么?
【发布时间】:2015-03-18 13:31:03
【问题描述】:

我有一个包含多个子目录的 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 吗?

【问题讨论】:

  • 不要将政策设置为 OLD。改为修复您的代码。存在策略,以便您可以明确地获得新的行为。 OLD 行为将在未来版本中完全删除。
  • 对不起,我不能。我的 CMake 代码生成一些头文件和一些 .c 源
  • 这毫无意义。生成文件不会阻止将 CMP0046 设置为 NEW。
  • 同意,这没有意义。我的目标是抑制有关丢失文件的警告,我用'OLD''CMP0046'实现了它。如果您能建议另一种方法,我将不胜感激。
  • 我建议您创建一个 sscce.org 来显示您的问题并发布一个 SO 帖子。将 CMP0046 设置为 OLD 是不正确的,我希望没有人跟随你。

标签: cmake


【解决方案1】:

没有。这个问题最好直接回答from the documentation...

策略设置的范围使用堆栈。堆栈的新级别是 进入项目的新子目录时推送(使用 add_subdirectory) 并在离开时弹出。因此设置一个 项目的一个目录中的策略不会影响父级或兄弟级 目录,但会影响子目录。

要对特定级别进行临时更改,不包括子目录,您可以使用

cmake_policy(PUSH)
cmake_policy(POP)

如果您希望在 subdir21 和 subdir22 中应用该策略,您需要在此处显式添加它或考虑将其添加到公共父级。

【讨论】:

    【解决方案2】:

    根据对此答案的评论https://unix.stackexchange.com/a/512695/48776

    可以使用set(CMAKE_POLICY_DEFAULT_CMP0046 OLD) 全局设置策略

    我尝试过不同的 3.x 版本,都可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2014-09-23
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多