【发布时间】:2020-06-03 00:26:39
【问题描述】:
我正在处理一个在 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 /p>
问题是反方向的:
禁用 OPTION_A 时,OPTION_B 和 OPTION_C 缓存变量仍会显示在 ccmake 中。
我想出了三个解决方案:
- 取消设置我知道不会从外部文件中使用的每个选项。
对于“深度”项目,此解决方案很快就会失效,因为 ELSE(OPTION_A) 现在需要取消设置(... CACHE) OPTION_B、OPTION_C 以及它们各自子目录的所有其他缓存变量。 - 清理 CMakeCache 并从头开始配置。
此解决方案适用于“宽”项目,因为要清理一个选项字段,我不得不清除他的共同目录缓存变量。 - 将 cmake 修改为具有“不透明”缓存,用于在生成阶段保存但未访问的变量。
修改 ccmake 以灰显/隐藏“不透明”缓存,仅显示访问过的缓存变量。
不应该干扰自动 cmake 的使用,而且由于 ccmake 是一个 GUI,我认为这也不是对它的重大更改。
对于“宽”和“深”的 cmake 层次结构是否有一个不需要修改 cmake 的一体化解决方案?这是一个值得付出努力的常见问题吗?
【问题讨论】:
-
有CMakeDependentOption 模块,它的
CMAKE_DEPENDENT_OPTION宏定义了一个选项,呈现给用户取决于其他选项的值。然而,这个宏应该无条件地使用(不是在if子句下),否则禁用该选项将不起作用。如果cmakerun 不执行add_subdirectory()到特定目录,CMake 没有机会知道该目录中发生了什么以及该目录中声明的哪些选项应该未声明。
标签: c++ cmake configuration config cmake-gui