set

将普通变量、缓存变量或环境变量设置为给定值。请参阅 cmake-language(7) 变量 文档,了解普通变量和缓存条目的作用域和交互。

此命令的签名,如果指定了 <value>... 占位符,则表示期望零个或多个参数。多个参数将连接成一个分号分隔的列表,以形成要设置的实际变量值。

设置普通变量

set(<variable> <value>... [PARENT_SCOPE])

在当前函数或目录作用域中设置或取消设置 <variable>

  • 如果至少提供了一个 <value>... 参数,则将该变量设置为该值。

  • 如果未提供值,则取消设置该变量。这等同于 unset(<variable>)

如果提供了 PARENT_SCOPE 选项,则该变量将在当前作用域的上级作用域中设置。每个新目录或 function() 命令都会创建一个新作用域。也可以使用 block() 命令创建作用域。 set(PARENT_SCOPE) 会将变量的值设置到父目录、调用函数或包含作用域(取决于具体情况)。变量在当前作用域中的先前状态保持不变(例如,如果它以前未定义,它仍然未定义;如果它有值,它仍然是那个值)。

block(PROPAGATE)return(PROPAGATE) 命令可以作为 set(PARENT_SCOPE)unset(PARENT_SCOPE) 命令的替代方法来更新父作用域。

注意

在评估 变量引用 ${VAR} 时,CMake 首先搜索同名的普通变量。如果不存在这样的普通变量,CMake 会接着搜索同名的缓存条目。因此,**取消设置一个普通变量可能会暴露一个之前被隐藏的缓存变量**。要强制变量引用 ${VAR} 返回空字符串,请使用 set(<variable> ""),这会清除普通变量但仍然将其定义。

设置缓存条目

set(CACHE{<variable>} [TYPE <type>] [HELP <helpstring>...] [FORCE] VALUE [<value>...])

版本 4.2 中添加。

设置给定的缓存 <variable>(缓存条目)。选项包括:

TYPE <type>

指定缓存条目的类型。 <type> 必须是以下之一:

BOOL

布尔 ON/OFF 值。 cmake-gui(1) 提供一个复选框。

FILEPATH

磁盘上文件的路径。 cmake-gui(1) 提供一个文件对话框。

PATH

磁盘上目录的路径。 cmake-gui(1) 提供一个文件对话框。

STRING

一行文本。 cmake-gui(1) 提供一个文本字段,如果设置了 STRINGS 缓存条目属性,则提供一个下拉选择。

INTERNAL

一行文本。 cmake-gui(1) 不显示内部条目。它们可用于跨运行持久存储变量。使用此类型意味着 FORCE

如果未指定 TYPE,则如果缓存变量已存在且其类型不是 UNINITIALIZED,则将保留先前指定的类型,否则将使用 STRING

HELP <helpstring>...

<helpstring> 必须指定为一行文本,为 cmake-gui(1) 用户提供选项的快速摘要。如果给出了多个字符串,它们将连接成一个字符串,中间没有分隔符。

如果未指定 HELP,则将使用空字符串。

FORCE

由于缓存条目旨在提供用户可设置的值,因此默认情况下它们不会覆盖现有缓存条目。使用 FORCE 选项来覆盖现有条目。

VALUE <value>...

要设置为缓存 <variable> 的值列表。此参数必须始终是最后一个。

如果缓存条目在调用之前不存在,或者给定了 FORCE 选项,则缓存条目将被设置为给定值。

注意

如果存在同名的普通变量,则缓存变量的内容将无法直接访问(参见 变量求值规则)。如果策略 CMP0126 设置为 OLD,则当前作用域中的任何普通变量绑定都将被移除。

缓存条目可能在调用之前存在,但没有设置类型,如果它是在 cmake(1) 命令行通过用户使用 -D<var>=<value> 选项(未指定类型)创建的。在这种情况下,set 命令将添加类型。此外,如果 <type>PATHFILEPATH 并且命令行上提供的 <value> 是相对路径,则 set 命令会将该路径视为相对于当前工作目录并将其转换为绝对路径。

set(<variable> <value>... CACHE <type> <docstring> [FORCE])

此签名出于兼容性目的而支持。最好使用其他签名。

设置环境变量

set(ENV{<variable>} [<value>])

环境变量 设置为给定值。后续对 $ENV{<variable>} 的调用将返回此新值。

此命令仅影响当前 CMake 进程,而不影响调用 CMake 的进程、系统的整体环境,也不影响后续构建或测试进程的环境。

如果 ENV{<variable>} 之后未给出参数,或者 <value> 是空字符串,则此命令将清除该环境变量的任何现有值。

<value> 之后的参数将被忽略。如果发现额外的参数,将发出作者警告。

另请参阅