通过 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 中。
我想出了三个解决方案:
- 取消设置我知道不会从外部文件中使用的每个选项。
由于 ELSE(OPTION_A) 现在需要 unset(... CACHE) OPTION_B、OPTION_C 和它们的所有其他缓存变量,因此该解决方案对于 "deep" 项目很快失效各自的子目录。
- 清理 CMakeCache 并从头开始配置。
此解决方案对 "wide" 个项目无效,因为要清除一个选项字段,我不得不清除他的共同目录缓存变量。
- 修改 cmake 使其具有 "opaque" 缓存,用于在生成阶段保存但未访问的变量。
将 ccmake 修改为 grey-out/hide "opaque" 缓存,仅显示访问的缓存变量。
不应干扰自动 cmake 的使用,并且由于 ccmake 是一个 GUI,我认为这也不是对其的重大更改。
是否有不需要修改 cmake 的 "wide" 和 "deep" cmake 层次结构的一劳永逸的解决方案?这是一个值得付出努力的常见问题吗?
Tsyvarev 在评论中提到的内容,您可以使用 CMakeDependentOption
.
创建依赖于其他选项的选项
只有当OPTION_A
为ON
时,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)
我正在处理一个在 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 中。
我想出了三个解决方案:
- 取消设置我知道不会从外部文件中使用的每个选项。
由于 ELSE(OPTION_A) 现在需要 unset(... CACHE) OPTION_B、OPTION_C 和它们的所有其他缓存变量,因此该解决方案对于 "deep" 项目很快失效各自的子目录。 - 清理 CMakeCache 并从头开始配置。
此解决方案对 "wide" 个项目无效,因为要清除一个选项字段,我不得不清除他的共同目录缓存变量。 - 修改 cmake 使其具有 "opaque" 缓存,用于在生成阶段保存但未访问的变量。
将 ccmake 修改为 grey-out/hide "opaque" 缓存,仅显示访问的缓存变量。
不应干扰自动 cmake 的使用,并且由于 ccmake 是一个 GUI,我认为这也不是对其的重大更改。
是否有不需要修改 cmake 的 "wide" 和 "deep" cmake 层次结构的一劳永逸的解决方案?这是一个值得付出努力的常见问题吗?
Tsyvarev 在评论中提到的内容,您可以使用 CMakeDependentOption
.
只有当OPTION_A
为ON
时,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)