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> 的局部变量的值。

示例

示例:基本用法

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

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

运行 CMake 并设置 USE_SSL=ON 会将 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() 命令提供了一个用户可以选择的布尔选项。