• 最后更新: 2019-06-06

一、简单介绍

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

  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

cmake学习之- set的更多相关文章

  1. CMake学习(1)---简单程序与库

    cmake是linux平台下重要的工具,可以方便的组织makefile.之前一直在windows平台下进行软件开发,在vs2010的IDE里,只要一点run程序就能跑出结果.但是程序的编译并没有那么简 ...

  2. cmake学习笔记(五)

    在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...

  3. cmake 学习笔记(三)

    转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...

  4. cmake 学习笔记(二)

    在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) ...

  5. CMake学习

    CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用. 作者:AlphaGL.版权所有,欢迎保留原文链接进行转载 :) 本文目录如下: 1.CMake介绍 2.CMake安装与使用 2 ...

  6. cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...

  7. CMake学习笔记四:usb_cam的CMakeLists解析

    最近在学习cmake,在完整看了<cmake实践>一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了.所以找了usb_cam软件包的CMakeLists.txt来 ...

  8. cmake学习资料收集

    CMake 学习笔记 : https://www.jianshu.com/p/c417e4ab8b30

  9. cmake 学习笔记(六)

    希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...

  10. cmake 学习笔记(四)

    接前面的一二三,学习一下 CMakeCache.txt 相关的东西. CMakeCache.txt 可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数). ...

随机推荐

  1. 查找String中出现最多字符的次数和个数

    Sting 的charAt方法返回相应位置的字符,使用该方法遍历String,将每个字符存入对象属性,遍历属性得到最多字符个数 <!DOCTYPE html> <html> & ...

  2. CodeChef Counting on a directed graph

    Counting on a directed graph Problem Code: GRAPHCNT All submissions for this problem are available. ...

  3. 51Nod 1028 大数乘法 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 分析: FFT/NTT板子题... 代码: NTT板子: #inc ...

  4. javascript实现可拖动DIV层

    原文发布时间为:2009-05-04 -- 来源于本人的百度文章 [由搬家工具导入] 注意以下红色部分是关键.如果不使用      document.documentElement,而使用docume ...

  5. [LeetCode] Binary Search Tree Iterator 深度搜索

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  6. Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分

    题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...

  7. 理解printk函数【转】

    转自:http://blog.csdn.net/Tommy_wxie/article/details/17026391 理解printk函数 Printk函数是在开发驱动过程中经常用到的一个函数,作用 ...

  8. 什麼是 usb upstream port

    主機USB埠是定義為USB纜線的上行端(Upstream)或「A」接頭,即PC端.而裝置USB埠是定義為USB纜線的下行端(Downstream)或「B」接頭,即行動產品端. Reference ht ...

  9. android 集成友盟分享之后,想自定义分享面板的看过来

    第一种情况 首先上传一张默认的友盟分享的效果图 看起来还不错,但是总是有这样那样的原因,需要我们对默认效果做出一些改变. 第二种情况 如果你想做出下面的效果: 或者这样的效果 : 总之上面的效果总是在 ...

  10. 洛谷——P2040 打开所有的灯

    P2040 打开所有的灯 题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就 ...