目录

说明

简单示例

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命令设置全局属性相关推荐

  1. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·005【设置全局属性globalStyle】

    注:前言.目录见 https://god-excious.blog.csdn.net/article/details/105312456 文章目录 [012]设置全局样式globestyle [012 ...

  2. 【NI Multisim 14.0原理图环境设置——电路图属性设置】

    目录 序言 一.电路图属性设置

  3. Cmake构建_设置全局编译选项

    cmake下使用add_compile_options可以设置全局的编译选项,无论是c还是c++编译器,在编译时都会自动加上这个编译选项 如工程需要c++11 add_compile_options( ...

  4. html5指南--1.html5全局属性(html5 global attributes)

    今天开始一个全新的关于html5系列课程,是我读<The Definitive Guide to HTML5 >的学习笔记.我会把自己觉得里面不错的章节,或者有意义的内容进行整理,以供大家 ...

  5. 如何利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率),如何理解网络稀疏度

    如何利用gretna软件计算脑网络全局属性,局部属性指标 介绍 安装gretna软件 利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率) 在 ...

  6. java判断对象无数据_java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值...

    1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap(); validateMap.put("serial", ...

  7. chmod命令文件权限属性设置(linux/cygwin)

    chmod命令 文件权限属性设置 转载自:http://man.linuxde.net/chmod chmod命令用来变更文件或目录的权限.在UNIX系统家族里,文件或目录权限的控制分别以读取.写入. ...

  8. cmake(13):构建时设置预处理宏定义以及add_compile_definitions命令详解

    目录 1. 说明 1.1 无参宏 1.2 有参宏 2. 使用示例 3. 命令解析 add_compile_definitions 命令 add_definitions 命令 参考链接 1. 说明 宏定 ...

  9. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务

    作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...

最新文章

  1. javascript入门 - 1
  2. 102 二叉树层序遍历
  3. 15-DBUtils
  4. 数据结构 | 如何一文搞定链表问题?(附20本书获奖名单)
  5. jQuery ajax 使用
  6. 相机获取的照片向左自动旋转90度解决方法
  7. 嵌入式linux交叉开发环境,构建嵌入式Linux交叉开发环境
  8. 淘宝评论爬虫python
  9. 基于Socket编程的网络聊天室
  10. 家居收纳风行,东芝冰箱足以装下你想要的品质生活
  11. php七牛云,php七牛云
  12. 18.8.17 考试总结
  13. 山东省第八届 ACM 省赛 Parity check (规律、水)
  14. 斯坦福「AI百年研究」首份报告:2030年的人工智能与生活
  15. 基于layui后台html模板免费下载
  16. python批量删缩进_鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频?...
  17. windows7台式计算机网线连接,WIN7网线怎么连接电脑 宽带连接常见错误代码解决方案...
  18. H-ui.admin v3.1多图片预览上传的问题解决
  19. Today今天便利店的梦想:准独角兽的雄心与挑战
  20. springboot 集成redis key乱码\xac\xed\x00\x05t\x00\x0eHAOKE_HOT_WORD

热门文章

  1. 稠密的无人机激光雷达点云数据处理与分析方法与工具科普系列(六)
  2. 红米 android 4.4.4,红米Note4G双卡版搭载基于Android4.4.4开发的MIUIV6系统
  3. COSCon'22第七届中国开源年会火热筹备中,第一波赞助伙伴已集结,一起上车共赴开源盛宴吧~...
  4. 【力扣周赛】第341场周赛
  5. python爬虫获取天猫店经营者资质证书(更新到2020.06.13
  6. 博士申请 | 香港理工大学林婉瑜老师招收人工智能全奖博士/博后/RA
  7. Jmeter-并发压测和持续性压测
  8. 混合模式之二:变暗组
  9. SVD分解正确分解流程
  10. C语言中字符串拼接之#,##的妙用