不同用户设置的CMake配置选项发生冲突怎么办?

How should I do when different user-set CMake configuration options clash?

假设我有两个缓存的 CMake 字符串供用户设置,但某些值组合发生冲突。

示例:

set(FOO OFF CACHE BOOL "Foo")
set(BAR OFF CACHE BOOL "Bar")

但你不能同时拥有 Foo 和 Bar。

显然,我们可以通过以下方式防止这种情况:

if (FOO AND BAR)
    message(FATAL_ERROR "Can't have both Foo and Bar.")
endif()

但是还有其他机制吗?例如在 ccmake 中,如果 FOO 设置为 true,反之亦然,会使 BAR 的值恢复为 false 的东西?

注意:这是一个简化的示例。在简单的情况下,您可以只选择一个三态选项,但是当您有多个可能的值和一个稍微复杂一些的禁止组合谓词时,这将不起作用。

您可能想要使用 setFORCE 选项来强制设置 CMake 缓存变量值。

if (FOO)
  set(BAR OFF CACHE BOOL "Bar" FORCE)
elseif (BAR)
  set(FOO OFF CACHE BOOL "Foo" FORCE)
endif()

这将在下一次配置通过后反映在 GUI 中。

cmake_dependent_option 可用于此目的,它根据另一组变量为真来设置选项。

例如,

cmake_option(FOO "Use Foo" ON)
cmake_dependent_option(BAR "Use Bar" ON "NOT FOO" OFF)

有关更多信息,请参阅 CMake documentation