cmake(14):利用set_property命令设置全局属性
目录
说明
简单示例
main.c
property.c
根目录下的 CMakeLists.txt
子目录下的 CMakeLists.txt
set_property() 命令
get_property() 命令
参考资料
说明
在开发过程碰到需要在上级目录中构建,而源代码又分别写在下级目录的情况,同时又要根据不同的情况选择性地添加不同的源代码进行编译,所以考虑将需要编译的源代码放到一个 cmake 列表中。但是 set() 对应生成的变量都是局部变量(即不同的目录下不共用),于是使用 set_property() 命令。
简单示例
为了简化,我这里假设在 main() 函数下调用一个 show_system() 函数用于显示当前系统的名称。程序整体结构如下:
$ tree
├── CMakeLists.txt
├── linux
│ ├── CMakeLists.txt
│ ├── property.c
│ └── property.h
├── main.c
└── win├── CMakeLists.txt├── property.c└── property.h
main.c
程序很简单,就调用子目录下定义的函数。
#include <stdio.h>#include <property.h>int main()
{show_system();return 0;
}
property.c
在 linux 和 win 的实现都一样。
#include <stdio.h>#include "property.h"void show_system()
{printf("This is linux\n"); // in linuxprintf("This is windows\n"); // in win
}
根目录下的 CMakeLists.txt
cmake_minimum_required (VERSION 3.13.0)project (property_test VERSION 0.0.4)# 设置全局属性 SOURCE_LIST
set_property( GLOBAL APPEND PROPERTY SOURCE_LIST)# 如果是 Linux 系统,选择编译 linux 目录
IF (CMAKE_SYSTEM_NAME MATCHES "Linux")include_directories (linux)add_subdirectory (linux)# Window 系统下选择编译 win 目录
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")include_directories (win)add_subdirectory (win)
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")# 将 SOURCE_LIST 的内容保存到 SRC_LIST 中
get_property(SRC_LIST GLOBAL PROPERTY SOURCE_LIST )message("src list:" ${SRC_LIST})# build exec
SET(exename "property")
add_executable (${exename} ${SRC_LIST} main.c)
子目录下的 CMakeLists.txt
两个子目录下的 CMakeLists.txt 的内容完全一样
file(GLOB_RECURSE SRC_LIST "*.cpp" "*.c") # 查找当前目录下所有 .cpp 和 .c 文件
set_property( GLOBAL APPEND PROPERTY SOURCE_LIST ${SRC_LIST}) # 将这些文件路径附加到 SOURCE_LIST 后面
因为 aux_source_directory 命令生成的是源文件的相对路径,传递到上一层之后无法正常使用,所以这里选择 file() 命令来查找源文件,它会生成文件的绝对路径。注意 file() 是递归查找的,也就是说子目录下的源代码也会被找到。
这里 SRC_LIST 是局部变量,只在本目录生效,所以每个 CMakeLists.txt 都可以正常使用,而 SOURCE_LIST 则是全局变量。
set_property() 命令
在给定范围内设置一个对象的属性。
命令格式:
set_property(<GLOBAL |DIRECTORY [<dir>] |TARGET [<target1> ...] |SOURCE [<src1> ...][DIRECTORY <dirs> ...][TARGET_DIRECTORY <targets> ...] |INSTALL [<file1> ...] |TEST [<test1> ...] |CACHE [<entry1> ...] >[APPEND] [APPEND_STRING]PROPERTY <name> [<value1> ...])# 其基本格式为:set_property(<Scope> [APPEND] [APPEND_STRING] PROPERTY <name> [value...])
第一个参数必须是属性的范围(Scope),后面 [APPEND | APPEND_STRING] 可选,表示属性是可扩展的列表。PROPERTY 是标识,后面接属性名称<name>,其值可选。
Scope 有多种选择可以是:
Scope |
Description |
相似命令 |
GLOBAL |
属性在全局范围内有效,属性名称需唯一 |
|
DIRECTORY |
在指定目录内有效,可以是相对路径也可以是绝对路径 |
set_directory_properties |
TARGET |
设置指定 TARGET 的属性 |
set_target_properties |
SOURCE |
属性对应零个或多个源文件。默认情况下,源文件属性仅对添加在同一目录 (CMakeLists.txt) 中的目标可见。 |
set_source_files_properties |
INSTALL |
属性对应零个或多个已安装的文件路径。这些可供 CPack 使用以影响部署。 |
|
TEST |
属性对应零个或多个现有测试。 |
set_tests_properties |
CACHE |
属性对应零个或多个缓存现有条目。 |
在3.18 版本之后,SOURCE 可以通过设置选项 DIRECTORY/TARGET_DIRECTORY 来时属性在其他目录中可见。
- DIRECTORY :源文件属性将在每个 <dirs> 目录的范围内有效,CMake 必须已经知道这些目录中的每一个,或者通过调用 add_subdirectory() 添加它们,或者它是顶级源目录。相对路径被视为相对于当前源目录。3.19 版本之后可以引用二进制目录。
- TARGET_DIRECTORY :源文件属性将在创建任何指定 <targets> 的每个目录范围中有效, <targets> 必须已经存在。
PROPERTY 是必需的参数,后面接属性的名称,其余的参数对应的是属性的值,以分号分隔。
APPEND 和 APPEND_STRING 是可选参数,如果设置了,那么后面的 <value1>... 将以列表的形式附加到指定属性的后面。APPEND_STRING 表示后面的 <value1> 将以字符串的形式添加到属性的后面。
get_property() 命令
获取属性的值。
get_property(<variable><GLOBAL |DIRECTORY [<dir>] |TARGET <target> |SOURCE <source>[DIRECTORY <dir> | TARGET_DIRECTORY <target>] |INSTALL <file> |TEST <test> |CACHE <entry> |VARIABLE >PROPERTY <name>[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
<variable> : 保存属性值的变量
GLOBAL/DIRECTORY ... /VARIABLE : 表示属性对应的范围,与 set_property() 相同,额外的 VARIABLE 表示范围是唯一的,不接受名称。
PROPERTY <name> : 属性名,同 set_property()
SET | DEFINED | BRIEF_DOCS | FULL_DOCS : 可选参数
- SET : 将变量设置为布尔值,指示是否已设置属性;
- DEFINED : 将变量设置为布尔值,指示属性是否已被定义
- BRIEF_DOCS | FULL_DOCS : 如果给定了 Brief_DOCS 或 FULL_DOCS,则将变量设置为包含所请求属性的文档的字符串。
参考资料
set_property — CMake 3.24.0-rc5 Documentation
get_property — CMake 3.24.0-rc5 Documentation
cmake(14):利用set_property命令设置全局属性相关推荐
- 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·005【设置全局属性globalStyle】
注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [012]设置全局样式globestyle [012 ...
- 【NI Multisim 14.0原理图环境设置——电路图属性设置】
目录 序言 一.电路图属性设置
- Cmake构建_设置全局编译选项
cmake下使用add_compile_options可以设置全局的编译选项,无论是c还是c++编译器,在编译时都会自动加上这个编译选项 如工程需要c++11 add_compile_options( ...
- html5指南--1.html5全局属性(html5 global attributes)
今天开始一个全新的关于html5系列课程,是我读<The Definitive Guide to HTML5 >的学习笔记.我会把自己觉得里面不错的章节,或者有意义的内容进行整理,以供大家 ...
- 如何利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率),如何理解网络稀疏度
如何利用gretna软件计算脑网络全局属性,局部属性指标 介绍 安装gretna软件 利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率) 在 ...
- java判断对象无数据_java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值...
1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap(); validateMap.put("serial", ...
- chmod命令文件权限属性设置(linux/cygwin)
chmod命令 文件权限属性设置 转载自:http://man.linuxde.net/chmod chmod命令用来变更文件或目录的权限.在UNIX系统家族里,文件或目录权限的控制分别以读取.写入. ...
- cmake(13):构建时设置预处理宏定义以及add_compile_definitions命令详解
目录 1. 说明 1.1 无参宏 1.2 有参宏 2. 使用示例 3. 命令解析 add_compile_definitions 命令 add_definitions 命令 参考链接 1. 说明 宏定 ...
- c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...
最新文章
- javascript入门 - 1
- 102 二叉树层序遍历
- 15-DBUtils
- 数据结构 | 如何一文搞定链表问题?(附20本书获奖名单)
- jQuery ajax 使用
- 相机获取的照片向左自动旋转90度解决方法
- 嵌入式linux交叉开发环境,构建嵌入式Linux交叉开发环境
- 淘宝评论爬虫python
- 基于Socket编程的网络聊天室
- 家居收纳风行,东芝冰箱足以装下你想要的品质生活
- php七牛云,php七牛云
- 18.8.17 考试总结
- 山东省第八届 ACM 省赛 Parity check (规律、水)
- 斯坦福「AI百年研究」首份报告:2030年的人工智能与生活
- 基于layui后台html模板免费下载
- python批量删缩进_鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频?...
- windows7台式计算机网线连接,WIN7网线怎么连接电脑 宽带连接常见错误代码解决方案...
- H-ui.admin v3.1多图片预览上传的问题解决
- Today今天便利店的梦想:准独角兽的雄心与挑战
- springboot 集成redis key乱码\xac\xed\x00\x05t\x00\x0eHAOKE_HOT_WORD
热门文章
- 稠密的无人机激光雷达点云数据处理与分析方法与工具科普系列(六)
- 红米 android 4.4.4,红米Note4G双卡版搭载基于Android4.4.4开发的MIUIV6系统
- COSCon'22第七届中国开源年会火热筹备中,第一波赞助伙伴已集结,一起上车共赴开源盛宴吧~...
- 【力扣周赛】第341场周赛
- python爬虫获取天猫店经营者资质证书(更新到2020.06.13
- 博士申请 | 香港理工大学林婉瑜老师招收人工智能全奖博士/博后/RA
- Jmeter-并发压测和持续性压测
- 混合模式之二:变暗组
- SVD分解正确分解流程
- C语言中字符串拼接之#,##的妙用