首页 CMake 设置变量
文章
取消

CMake 设置变量

1. CMake 变量分类

1.1 普通变量

变量是 CMake 语言中的基本存储单元。它们的值始终是字符串类型,尽管某些命令可能会将字符串解释为其他类型的值。 set()unset()命令显式设置或取消设置变量,但其他命令也具有修改变量的能力。 变量名称区分大小写,几乎可以包含任何文本,但我们建议使用字母 数字 _(下划线)来命名变量。

变量具有动态范围,使用setunset在当前范围内创建一个变量:

  • 块作用域 (v3.25):

    使用block()endblock()命令来创建一个新的变量作用域,需要CMake 3.25 以上版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      cmake_minimum_required(VERSION 3.25)
      project(cmake_test)
      set(hello "Hello World")
      message(STATUS  "消息  ${hello}")
      block()
        set(hello "Hello Mrhan")
        message(STATUS  "消息      ${hello}")
      endblock()
      message(STATUS  "消息  ${hello}")
    

    img.png

  • 函数范围

    函数作用域和block 作用域类似。当在函数内通过setunset将变量与当前函数进行作用域进行绑定

    1
    2
    3
    4
    5
    6
    7
    8
    
      set(hello "Hello")
      set(name "Word")
      function(foo)
      set(name "Mrhan")
      message(STATUS "${hello} ${name}")
      endfunction()
      foo()
      message(STATUS "${hello} ${name}")
    

    img.png

  • 目录范围

    CMake 会为定义在每个目录下的CMakeLists.txt中设置的变量绑定到当前目录。 在处理CMakeLists.txt 之前,会将父目录的变量初始化到当前目录作用域中。 子目录的CMakeLists.txt会将父目录的所有变量拷贝到当前CMakeLists.txt中,当前CMakeLists.txt中的变量的作用域仅在当前子目录有效。

    目录作用域有两个特点:向下有效 值拷贝

    • 目录结构

      img.png

    • 父目录CMakeLists.txt
      1
      2
      3
      4
      5
      
        cmake_minimum_required(VERSION 3.25)
        project(cmake_test)
        set(ROOT_VAR "父级目录")
        add_subdirectory(sub1)
        message(STATUS ${PARENT_SUB_DIR})
      
    • 子目录CMakeLists.txt

      1
      2
      3
      4
      
        set(SUB_DIR "   SUB1 目录")
        set(PARENT_SUB_DIR "   SUB1 设置的变量在父级别" PARENT_SCOPE)
        message(STATUS ${SUB_DIR})
        message(STATUS ${ROOT_VAR})
      
    • 执行结果

      img.png

  • 永久缓存

CMake 定义普通变量方式

1
2
3
4
5
6
7
8
9
10
11
  # 普通变量
  
  set(<variable> <value>... [PARENT_SCOPE])
  # 缓存变量 
  set(<variable> <value>... CACHE <type> <docstring> [FORCE])
  #- variable:变量名称
  #- value:变量值列表
  #- CACHE:cache变量的标志
  #- type:变量类型,取决于变量的值。类型分为:BOOL、FILEPATH、PATH、STRING、INTERNAL
  #- docstring:必须是字符串,作为变量概要说明
  #- FORCE:强制选项,强制修改变量值

参考

本文由作者按照 CC BY 4.0 进行授权