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

Dependent options caching in cmake via ccmake

我正在处理一个在 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)

subdir/CMakeLists.txt:

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

子目录/子目录subdir/CMakeLists.txt:

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

这很好,因为例如在使用 ccmake 时,我不会被 OPTION_B/C 打扰,除非 OPTION_A/B 被配置为 ON,从而在 [=30] 中生成 OPTION_B/C =]CMakeCache.txt

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

我想出了三个解决方案:

  1. 取消设置我知道不会从外部文件中使用的每个选项。
    由于 ELSE(OPTION_A) 现在需要 unset(... CACHE) OPTION_B、OPTION_C 和它们的所有其他缓存变量,因此该解决方案对于 "deep" 项目很快失效各自的子目录。
  2. 清理 CMakeCache 并从头开始配置。
    此解决方案对 "wide" 个项目无效,因为要清除一个选项字段,我不得不清除他的共同目录缓存变量。
  3. 修改 cmake 使其具有 "opaque" 缓存,用于在生成阶段保存但未访问的变量。
    将 ccmake 修改为 grey-out/hide "opaque" 缓存,仅显示访问的缓存变量。
    不应干扰自动 cmake 的使用,并且由于 ccmake 是一个 GUI,我认为这也不是对其的重大更改。

是否有不需要修改 cmake 的 "wide" 和 "deep" cmake 层次结构的一劳永逸的解决方案?这是一个值得付出努力的常见问题吗?

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

创建依赖于其他选项的选项

只有当OPTION_AON时,OPTION_B才可用,默认为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)