CMake--Set用法
CMake中的set用于给一般变量,缓存变量,环境变量赋值。
set(<variable> <value>
[[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
Set赋值给一般变量(normal variables)
什么是一般变量,一般变量和代码中变量相似,仅在自身所在作用域起作用,除非后面使用PARENT_SCOPE。
每一个新的目录或者函数都会创建新的作用域,当在新的作用域创建一般变量且后面加上PARENT_SCOPE,该变量可以在父目录或者调用新函数的函数上起作用。
有些乱,举个栗子:
set(FOO “x”)。 //FOO作用域为当前作用域。 set(FOO "x" PARENT_SCOPE) //FOO作用域跳上一级(懂点编程的都懂哈)。
Set赋值给缓存变量(cache variables)
什么是缓存变量,缓存变量可以理解为当第一次运行cmake时,这些变量缓存到一份文件中(即编译目录下的CMakeCache.txt)。当再次运行cmake时,这些变量会直接使用缓存值,可以利用ccmake或者cmake-gui等工具来重新赋值。缓存变量在整个cmake运行过程中都可以起作用。
当使用CACHE时,且缓存(cache)中没有该变量时,变量被创建并存入缓存(cache)中,如果原缓存(cache)中有该变量,也不会改变原缓存中该变量的值,除非后面使用FORCE。
有点乱,举个栗子:
set(FOO, "x" CACHE <type>)
//原缓存中没有FOO则将FOO赋值为x且存入cache中。
//原缓存中有FOO则不做任何改变,即便原cache中FOO存的不是x。
set(FOO, "x" CACHE <type><docstring> FORCE)
//即便原cache中存在FOO也会创建另一个FOO,官方文档原话(If FORCE is specified, the value of the cache variable
//is set, even if the variable is already in the cache.This should normally be avoided, as it will
//remove any changes to the cache variable’s value by the user.),小弟笨拙没有搞懂。
使用CACHE的同时,要设定<type>和<docstring>,<type>可以理解为所存入变量类型,<docstring>为变量的描述。
<type>分为以下几种类型:
FILEPATH = File chooser dialog.
PATH = Directory chooser dialog.
STRING = Arbitrary string.
BOOL = Boolean ON/OFF checkbox.
INTERNAL = No GUI entry (used for persistent variables).
其中INTERNAL将变量为内部变量,即cmake-gui不会向用户显示这类变量,而其它类型的缓存变量用户都可以通cmake-gui按照特定的类型改变。
注意:
1.CACHE与PARENT_SCOPE不能一起使用。
2.同一名称(例FOO)的一般变量和缓存变量可以同时存在,但在调用该变量时(${FOO})会在先取一般变量的值,一般变量中没有再取缓存变量的值。
一些栗子:
set(FOO “x”) //设置一般变量FOO,不会触及cache,但是会隐藏cache中的FOO。 set(FOO “x” CACHE ...) //忽视相同名称的一般变量,在cache中检查FOO是否存在,
//如果不存在则存入cache中,存在也不会对cache中FOO重新赋值。
3.当改变cache中的变量时,同名的一般变量会被删除。一般不建议使用相同名称的一般变量和缓存变量。
然而在有些工程中可以很好的借助这一交互例如:
一个工程利用ADD_SUBDIRECTOTY()添加子工程,子工程有它自己的CMakeList.txt。如果在父工程和子工程中都对同一缓存变量赋值,cmake时父工程率先将变量存入cache中,子工程直接在cache中调用该值,保证了父子工程的一致性。当父工程需要改变该变量,而子程序需要利用原值时,可以直接在父工程中设置同名称的一般变量即可。
CMake--Set用法的更多相关文章
- CMAKE的用法
一. 基本使用 安装:下载二进制包后可直接解压使用 从源码安装则执行命令:./bootstrap; make; make install——尝试执行bootstrap失败 使用:cmake ...
- CMake 基本用法--写CMakeList.txt
http://techbase.kde.org/Development/Tutorials/CMake_(zh_CN) http://www.cmake.org/Wiki/CMake 这一章将从软件开 ...
- cmake简单用法
CMake是一个跨平台的编译工具,类似于automake 安装 # cd cmake-2.8.10.2 # ./bootstrap # make # make install project proj ...
- Say bye to CMake and Makefile
用了几年的CMake,最近想试着琢磨如何将C++应用的动态链接全部改成静态链接,发现还需要研究CMake的用法,进入CMake的文档, http://www.cmake.org/cmake/help/ ...
- cmake简明使用指南
cmake简明使用指南 Last update 2018/8/8 先执行cmake生成makefile,然后看看里面的内容,(至少在ubuntu16.04上的cmake3.5.1上),有如下内容提供: ...
- linux 下 VSCODE 使用CMake编译STM32程序
项目在做什么 项目地址 本项目是为了研究MCU在linux下开发而做的 --build 存放cmake编译生成的文件 --cmake 存放cmake编译时会用到的文件,比如工具链检查.编译选项等 -- ...
- Fedora和Ubuntu下安装OpenGL开发环境配置
Fedora下OpenGl开发环境配置 开发OpenGL工程需要3个库文件和对应的头文件: libglut.so,libGLU.so,libGL.so, gl.h ,glu.h, glut.h 这些库 ...
- OpenCV 学习笔记 06 SIFT使用中出现版权问题error: (-213:The function/feature is not implemented)
1 错误原因 1.1 报错全部信息: cv2.error: OpenCV(4.0.1) D:\Build\OpenCV\opencv_contrib-4.0.1\modules\xfeatures2d ...
- Vulkan在Android使用Compute shader
oeip 相关功能只能运行在window平台,想移植到android平台,暂时选择vulkan做为图像处理,主要一是里面有单独的计算管线且支持好,二是熟悉下最新的渲染技术思路. 这个 demo(git ...
- windows程序员开发linux程序的头一个月
开发环境选择 vim,vscode,qt,visual studio都可以做linux c++开发,但是作为windows程序员,最熟悉的还是visual stuio,加上visual studio ...
随机推荐
- 导入其他python文件或者python文件的函数
from abc import xxx 从abc的py文件导入一个具体的函数或者类 import abc 直接导入文件 a.b写在同一个文件目录下,a要使用b,直接import就可以了
- PAT A1133 Splitting A Linked List (25 分)——链表
Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...
- centos7搭建kibana
上一节elasticsearch搭建地址 https://www.cnblogs.com/mutong1228/p/10181544.html 学习了上一篇的搭建,理解了命令的含义之后,本节就非常方便 ...
- 【Codeforces 464D】World of Darkraft - 2
Codeforces 464 D 首先我们知道这K个装备是互不干扰的,就是说如果一个装备升级了或者卖掉了,不会对其它装备的挣到的钱产生任何影响.所以我们就考虑单独处理某一个装备挣到的钱. 那么就设\( ...
- Swift开发iOS项目实战视频教程(二)---图片与动画
本课主要介绍UIImageview.NSTimer的使用.并介绍了一种动画实现方式. 本教程摒弃枯燥的语法和知识解说.全是有趣有料的项目实战! 视频优酷链接:v.youku.com/v_show/id ...
- mysql 自增长
auto_increment_increment=10; #自增量每次增加的值改为10, auto_increment_offset=2; #第一次加载数值时的偏移值 ...
- Luogu P2827 蚯蚓
看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很naive的 注意在用堆做的时候也是要明智一点的,对于蚯蚓长度的相加肯定不能直接遍历并加上,还是可以差分一下的 其实说白了就是把集体加->单 ...
- ML.NET 示例:多类分类之问题分类
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- .NET持续集成与自动化部署之路第三篇——测试环境到生产环境的一键部署策略(Windows)
Jenkins测试环境到生产环境的一键部署策略(Windows) 一.前言 前面我们已经初步实现了开发集成环境.测试环境的持续集成(自动化构建.自动化测试.自动化部署).但生产环境自动化部署迟 ...
- JVM规范系列第3章:为Java虚拟机编译
Oracle 的 JDK 包括两部分内容:一部分是将 Java 源代码编译成 Java 虚拟机的指令集的编译器,另一部分是用于Java 虚拟机的运行时环境. 第一部分应该说的是 Javac 这个前置编 ...