set

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

指定 <value>... 占位符的此命令的签名接收零个或多个参数。多个参数将作为一个 用分号分隔的列表,形成要设置的实际变量值。

设置常规变量

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

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

  • 如果给出了至少一个 <value>...,请将变量设置为该值。

  • 如果没有给出值,取消设置该变量。这等同于 unset(<variable>)

如果给出了 PARENT_SCOPE 选项,将在当前作用域以上的 scope 中设置变量。每个新的目录或 function() 命令创建一个新的 scope。还可以使用 block() 命令创建 scope。 set(PARENT_SCOPE) 将变量值设置为父目录、调用函数或包含 scope(以适用于当前情况的 scope 为准)。变量值的先前状态在当前作用域中保持不变(例如,如果之前未定义,则仍未定义,如果之前有值,则仍然是该值)。

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

注意

在对形式为 ${VAR}变量引用 进行求值时,CMake 会首先搜索具有该名称的普通变量。如果不存在这样的普通变量,CMake 随后将搜索具有该名称的缓存项。正因为如此,取消设置普通变量可能公开先前隐藏的缓存变量。若要强制形式为 ${VAR} 的变量引用返回空字符串,请使用 set(<variable> ""),它会清除普通变量但保持其已定义的状态。

设置缓存项

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

设置给定的缓存 <variable>(缓存项)。由于缓存项旨在提供用户可设置的值,因此默认情况下不会覆盖现有缓存项。使用 FORCE 选项来覆盖现有项。

<type> 必须指定为以下类型之一

BOOL

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

FILEPATH

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

PATH

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

STRING

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

INTERNAL

一行文本。 cmake-gui(1) 不会显示内部项。可以使用它们来跨运行持久存储变量。使用此类型表示 FORCE

必须将 <docstring> 指定为一行文本,为 cmake-gui(1) 用户提供该选项的快速摘要。

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

注意

如果已存在同名的常规变量,则无法直接访问高速缓存变量的内容(参见 变量评估规则)。如果策略 CMP0126 设置为 OLD,则当前范围内任何常规变量的绑定都将被删除。

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

设置环境变量

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

Environment Variable 设置为给定值。此后,$ENV{<variable>} 的后续调用将返回此新值。

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

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

忽略 <value> 之后的参数。如果找到额外参数,则会发出作者警告。

另请参阅