通过 ccmake 在 cmake 中缓存依赖选项

罗伊纳德勒

我正在处理一个在 cmake 层次结构中具有多个 OPTION 命令的项目。
如果启用了一个选项 (OPTION_A=ON),则其他选项 (OPTION_B) 将通过新包含的子目录添加到 cmake 缓存中:

CMakeLists.txt:

OPTION(OPTION_A "Do such and such" OFF)
IF(OPTION_A)
    add_subdirectory(subdir)
ENDIF(OPTION_A)

子目录/CMakeLists.txt:

OPTION(OPTION_B "Do this and that" OFF)
IF(OPTION_B)
    add_subdirectory(subsubdir)
ENDIF(OPTION_B)

subdir/subsubdir/CMakeLists.txt:

OPTION(OPTION_C "Do foo then bar" OFF)
IF(OPTION_C)
    <...>
ENDIF(OPTION_C)

这很好,因为例如使用 ccmake 时,除非将 OPTION_A/B 配置为 ON,否则我不会对 OPTION_B/C 感到不安,从而在CMakeCache.txt 中生成 OPTION_B/C

问题是相反的:
当禁用 OPTION_A、OPTION_B 和 OPTION_C 缓存变量时,ccmake 中仍然显示。

我想出了三个解决方案:

  1. 取消设置我知道不会从外部文件中使用的每个选项。
    对于“深”项目,此解决方案很快就会中断,因为 ELSE(OPTION_A) 现在需要取消设置 (... CACHE) OPTION_B、OPTION_C 以及它们各自子目录的所有其他缓存变量。
  2. 清理 CMakeCache 并从头开始配置。
    对于“宽”项目,此解决方案会中断,因为要清理一个选项字段,我不得不清除他的共同目录缓存变量。
  3. 修改 cmake 以具有“不透明”缓存,用于在生成阶段保存但未访问的变量。
    修改 ccmake 以灰色/隐藏“不透明”缓存,仅显示访问的缓存变量。
    不应该干扰自动 cmake 的使用,而且由于 ccmake 是一个 GUI,我认为这也不是对它的重大更改。

对于不需要修改 cmake 的“宽”和“深”cmake 层次结构,是否有一个通用的解决方案?这是一个值得付出努力的常见问题吗?

泰德·林格莫

Tsyvarev 在评论中提到的内容,您可以使用CMakeDependentOption.

此处OPTION_B变为可用且默认为ON仅当OPTION_A为 时ON,否则将设置为OFF您也可以将其默认设置为,OFF但我在ON这里设置它是为了明确哪个是:

OPTION(OPTION_A "Do such and such" OFF)

CMAKE_DEPENDENT_OPTION(OPTION_B "Do this and that" ON
                       "OPTION_A" OFF)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章