CMakeDependentOption

此模块提供了一个命令,用于定义布尔选项,其可用性和默认值取决于指定的条件或其他选项。这有助于维护一个干净的配置界面,仅显示与当前设置相关的选项。

使用 CMake 加载此模块

include(CMakeDependentOption)

命令

此模块提供以下命令

cmake_dependent_option

提供一个取决于一组条件的布尔选项

cmake_dependent_option(<variable> <help> <value> <condition> <else-value>)

此命令会创建一个布尔值<variable>,并在满足一组条件求值为布尔真时,将其提供给用户在 GUI 中(例如 cmake-gui(1)ccmake(1))。

参数为

<variable>

存储选项值的变量的名称。

<help>

选项的简短描述。此字符串通常是简短的文本行,并在 GUI 中显示。

<value>

<condition> 求值为布尔真时,<variable> 的布尔值。

<condition>

指定决定 <variable> 是否已设置并在 GUI 中可见的条件。

  • 如果 <condition> 求值为布尔假,则选项将从 GUI 中的用户隐藏,并且一个名为 <variable> 的局部变量将被设置为 <else-value>

  • 如果 <condition> 求值为布尔真,则会创建一个名为 <variable> 的布尔缓存变量,其默认值为 <value>,并且该选项将在 GUI 中显示,允许用户启用或禁用它。

  • 如果在连续的配置运行中 <condition> 最终求值为布尔假,则选项将从 GUI 中的用户隐藏,并且 <variable> 的类型将更改为内部缓存变量。在这种情况下,同名的局部变量将设置为 <else-value>

  • 如果在连续配置运行中 <condition> 再次变为真,则会保留用户之前设置的值。

<condition> 参数可以是

  • 单个条件(例如变量名)。

  • 多个条件的 分号分隔列表

  • 版本 3.22 中添加: 一个完整的 条件语法,如 if(<condition>) 子句中使用。请参阅策略 CMP0127。这支持使用完整的条件语法(例如用括号组合条件等)。

<else-value>

<condition> 求值为布尔假时,分配给名为 <variable> 的局部变量的值。

在 CMake 项目模式下,如上所述创建布尔缓存变量。在 CMake 脚本模式下,而是设置布尔变量。

示例

示例:基本用法

在项目中使用此模块以有条件地设置选项

CMakeLists.txt
include(CMakeDependentOption)

cmake_dependent_option(USE_SSL_GNUTLS "Use GnuTLS for SSL" ON USE_SSL OFF)

示例:启用/禁用依赖选项

在前一个示例的基础上扩展,这演示了该模块如何在配置阶段根据条件允许用户可配置的选项。

CMakeLists.txt
include(CMakeDependentOption)

option(USE_SSL "Enable SSL in the project" OFF)

cmake_dependent_option(USE_SSL_GNUTLS "Use GnuTLS for SSL" ON USE_SSL OFF)

message(STATUS "USE_SSL: ${USE_SSL}")
message(STATUS "USE_SSL_GNUTLS: ${USE_SSL_GNUTLS}")

在第一次配置运行时,布尔缓存变量 USE_SSL 设置为 OFF,局部变量 USE_SSL_GNUTLS 设置为 OFF。

$ cmake -B build-dir

-- USE_SSL: OFF
-- USE_SSL_GNUTLS: OFF

使用 USE_SSL=ON 运行 CMake 会将 USE_SSLUSE_SSL_GNUTLS 这两个布尔缓存变量都设置为 ON。

$ cmake -B build-dir -D USE_SSL=ON

-- USE_SSL: ON
-- USE_SSL_GNUTLS: ON

在后续使用 USE_SSL=OFF 进行配置运行时,USE_SSL_GNUTLS 也会跟随。但是,它的值会保留在内部缓存中,同时在本地被覆盖。

$ cmake -B build-dir -D USE_SSL=OFF

-- USE_SSL: OFF
-- USE_SSL_GNUTLS: OFF

示例:分号分隔的条件列表

<condition> 参数也可以是分号分隔的条件列表。在下面的示例中,如果变量 USE_BAR 为 ON 且变量 USE_ZOT 为 OFF,则选项 USE_FOO 可用且默认为 ON。否则,USE_FOO 将设置为 OFF 并对用户隐藏。

如果在将来的配置运行中 USE_BARUSE_ZOT 的值发生变化,USE_FOO 的先前值将被保留,以便当它再次可用时,它会保留其最后设置的值。

CMakeLists.txt
include(CMakeDependentOption)

cmake_dependent_option(USE_FOO "Use Foo" ON "USE_BAR;NOT USE_ZOT" OFF)

示例:完整的条件语法

从 CMake 3.22 开始,cmake_dependent_option() 支持完整的条件语法。

在下面的示例中,如果条件求值为真,则选项 USE_FOO 可用并设置为 ON。否则,它被设置为 OFF 并在 GUI 中隐藏。与前面的示例类似,USE_FOO 的值会在配置运行之间保留。

CMakeLists.txt
include(CMakeDependentOption)

cmake_dependent_option(USE_FOO "Use Foo" ON "USE_A AND (USE_B OR USE_C)" OFF)

另一个示例演示了如何根据目标系统有条件地提供选项。

CMakeLists.txt
include(CMakeDependentOption)

cmake_dependent_option(
  ENABLE_FOO
  "Enable feature Foo (this option is available when building for Windows)"
  ON
  [[CMAKE_SYSTEM_NAME STREQUAL "Windows"]]
  OFF
)

另请参阅

  • 提供一个布尔选项的 option() 命令,用户可以选择性地选择该选项。