zoukankan      html  css  js  c++  java
  • cmake学习之- set

    • 最后更新: 2019-06-06

    一、简单介绍

    setunset 为一对相反的指令,分别为设置变量以及取消设置变量。

    1. 什么是变量?

      • 变量就是用于保存值的存储单元。
    2. set 有哪几种?

      • set 有三种,分别为: 设置一般变量(Set Normal Variable), 设置缓存变量(Set Cache Entry),设置环境变量(Set Environment Variable)

        
        // 1. 设置一般变量(Set Normal Variable)
        set(<variable> <value>... [PARENT_SCOPE])
        
        // 2. 设置缓存变量(Set Cache Entry)
        set(<variable> <value>... CACHE <type> <docstring> [FORCE])
        
        // 3. 设置环境变量(Set Environment Variable)
        set(ENV{<variable>} [<value>])
        
        
    3. 变量的作用域

      • Function Scope: 在函数内部定义,仅仅在当前函数以及所调用的子函数内有效;
      • Directory Scope: 在当前目录的定义的变量,当调用子目录时候,子目录会复制一份父级目录内的变量到子目录中
      • Persistent Cache: 持久化的缓存,一般由CACHE 存储起来.
    4. 变量的搜索路径

      1. 在当前 Function Scope 调用内查找,找到后使用,未找到进行下一步;
      2. 在当前目录下面查找,找到使用,未找到下一步;
      3. 在 CACHE 中寻找,找到使用,未找到,则为空.

    二、设置一般变量(Normal Variable)

    set(<variable> <value>... [PARENT_SCOPE])
    
    • 将一个或者多个值 <value>... 赋值给变量 <variable>, 多个值之间以分号(;)分隔。

    2.1 参数解析

    1. PARENT_SCOPE
      • 配置该选项后,表示该变量在父级作用域上有效, 在当前作用域上是无效的;

    2.2 Coding

    目录结构如下:

    rs:cmake-set$ tree
    .
    ├── CMakeLists.txt
    ├── main.cpp
    └── subdir
        └── CMakeLists.txt
    

    顶层的 CMakeLists.txt

    cmake_minimum_required(VERSION 3.5)
    
    project(DEMO VERSION 10.2.1.3 LANGUAGES CXX C ASM )
    
    # 设置一般变量
    set(PNAME rsenjoyer)
    set(PGRADE 80 85 90 95)
    
    message("top name = ${PNAME}")  # top name = rsenjoyer
    message("top grade = ${PGRADE}") #top grade = 80;85;90;95
    
    add_subdirectory(subdir)
    
    message("top after name = ${PNAME}")  # top name = rsenjoyer
    
    add_executable(DEMO main.cpp)
    

    子目录的 CMakeLists.txt

    set(PNAME jack)
    message("sub name = ${PNAME}") # sub name = jack
    
    # 仅仅会改变父级的 PNAME, 对当前的变量不会更改
    set(PNAME rose PARENT_SCOPE)
    message("sub name = ${PNAME}") #sub name = jack
    

    三、设置缓存变量(Set Cache Entry)

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

    作用

    • 设置变量并缓存到 CMakeCache.txt
    • 默认不会覆盖已缓存(已存在于 CMakeCache.txt )的变量;

    3.1 参数解析

    1. 类型 type

      类型 type 必须为以下的一种

      • BOOL
        • 布尔值(ON/OFF)
      • FILEPATH
        • 文件路径
      • PATH
        • 目录路径
      • STRING
        • 字符串
      • INTERNAL
        • 单行文字
    2. 描述字符串 <docstring>: 单行文字,用于 CMAKE-GUI 的时提示用户

    3. FORCE 用于是否强制更新缓存里面的值,配置后,每次都会强制更新 CMakeCache.txt 里面的值

    四、设置环境变量(Set Environment Variable)

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

    作用

    • 设置环境变量 <variable>,值为 <value>
    • 如果 <value> 不存在或者为空字符串 表示清除该环境变量

    五、环境变量与一般变量区别

    参考: https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#cmake-language-variables

  • 相关阅读:
    hdu5269 ZYB loves Xor I
    UVA 11181 Probability|Given
    UVA 10277 Boastin' Red Socks
    CodeForces 566B Replicating Processes
    UVA 10714 Ants
    CodeForces 567B Berland National Library hdu-5477 A Sweet Journey
    UVA 10759 Dice Throwing
    UVA 11027
    「CF241E」Flights
    「CF891C」Envy
  • 原文地址:https://www.cnblogs.com/gaox97329498/p/10986476.html
Copyright © 2011-2022 走看看