文章目录
- 第二章 CMake基础语法
- 2.18 CMake定义属性define_property()与设置属性
- 2.18.1 定义属性 define_property
- 2.18.2 设置属性 set_property()
- 2.18.3 获取属性get_property
- 2.18.4 代码测试
- 2.19 set_target_properties()命令设置目标属性
- 2.19.1 CMAKE设置获取TARGET的属性
- 2.19.2 DIRECTORY属性
- 2.19.3 SOURCE 属性
本文介绍define_property()和set_target_properties()。
第二章 CMake基础语法
2.18 CMake定义属性define_property()与设置属性
CMake属性(PROPERTY)是影响构建过程的关键概念,它们定义了如何编译源文件、二进制文件的安装位置以及安装程序的打包目录等。
CMake属性可以附加到不同的对象上,例如目标(TARGET)、目录(DIRECTORY)、源文件(SOURCE)、缓存变量(CACHE)、安装(INSTALL)、测试(TEST)等。
2.18.1 定义属性 define_property
使用define_property 命令来自定义属性,语法如下:
define_property(<范围类型>PROPERTY 属性名[INCLUDE][BRIEF_DOCS][FULL_DOCS][INITIALIZE_FROM_VARIABLE])范围类型
GLOBAL:关联一个全局范围; DIRECTORY:关联一个目录; TARGET:关联一个目标; SOURCE:关联一个源文件; TEST:关联一个测试; VARIABLE:关联一个变量; CACHED_VARIABLE:关联一个缓存变量;2.18.2 设置属性 set_property()
使用set_property() 命令来设置属性值。
set_property(范围[APPEND][APPEND_STRING]PROPERTY 属性名 属性值)范围值:
GLOBAL:关联一个全局范围; DIRECTORY:关联一个目录; TARGET:关联一个目标; SOURCE:关联一个源文件; TEST:关联一个测试; VARIABLE:关联一个变量; CACHED VARIABLE:关联一个缓存变量;属性值:
GLOBAL:范围是全局的并且不可接受名称。 DIRECTORY:范围默认是当前目录,或指定完整或相对路径命名。 TARGET:范围可以指定零个或多个现有目标; SOUCRE:范围可以命名零个或多个源文件。 INSTALL 范围可以命名零个或多个已安装的文件路径。 TEST:范围仅限于调用命令的目录。它可能会命名零个或多个现有测试, CHCHE 范围必须命名零个或多个现有缓存变量。2.18.3 获取属性get_property
使用get_property命令来获取属性值,语法如下
get_property(变量名<范围>PROPERTY 属性名[选项])范围设置:
GLOBAL 范围是全局的并且不接受名称。选项:
SET 变量将被设置布尔值,指示该属性是否被设置;DEFINED 变量将被设置布尔值,指示该属性是否被define_property()定义 BRIEF_DOCS 变量将被设置为define_property()包含所请求属性的简短文档的字符串。 FULL DOCS 变量将被设置为define property0)包含所请求属性的详细文档的字符串。2.18.4 代码测试
测试目录:
cmake_minimum_required(VERSION3.30)# 项目project(sourceCmake VERSION1.2LANGUAGES CXX)if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Debug CACHE STRING"选择编译类型"FORCE)endif()message("CMAKE_BUILD_TYPE =${CMAKE_BUILD_TYPE}")# CMAKE_BUILD_TYPE = Debugadd_executable(A a.cpp)add_executable(B b.cpp)# 定义一个属性ProjectA,并设置简短文档描述为 "project1 brief docs",详细文档描述为 "project1 full docs"define_property(TARGET PROPERTY projectA BRIEF_DOCS"这是简单描述"FULL_DOCS"这是详细描述")#为目标a 设置 属性 project1,属性值为"a is project1"set_property(TARGET A PROPERTY projectA"A is project")# 获取目标a的project1属性值,并存放在v1中get_property(v1 TARGET A PROPERTY projectA)message("获取属性值 v1=${v1}")# 获取属性值 v1=A is project2.19 set_target_properties()命令设置目标属性
CMAKE 在set_property() get_property() 基础上,提供了更多方便命令设置于获取属性。
范围:
获取和设置TARGET的属性:
set_target_properties get_target_property获取和设置DIRECTORY的属性:
set_directory_properties 和 get_directory_property获取和设置SOURCE
set_source_files_properties 和 get_source_file_properties设置TEST 属性:
set_tests_properties 和 get_test_properties2.19.1 CMAKE设置获取TARGET的属性
使用set_target_properties命令来设置TARGET范围属性,语法:
set_target_properties(<目标1><目标2>… PROPERTIES<属性名1><属性值1><属性名2><属性值2>…)使用get_target_property命令获取TARGET范围属性,语法:
get_target_property(<变量><目标><属性名>)测试内容:测试目录结构如下:
a.c
#include <stdio.h>//入口函数 intmain(){printf("AAA!\n");return0;}b.c
#include <stdio.h>//入口函数 intmain(){printf("BBB!\n");return0;}sub目录下的CMakeLists.txt
cmake_minimum_required(VERSION3.29)# 项目信息project(subhhh)# 获取当前目录的属性值get_directory_property(d1 Pro1)get_directory_property(d2 Pro2)get_directory_property(d3 Pro3)message("获取当前目录的属性值 d1=${d1}d2=${d2}d3=${d3}")# 获取当前目录的属性值 d1=语文 d2= d3=测试 TARGET
# 最低版本要求cmake_minimum_required(VERSION3.29)# 项目信息project(hhh)# 生成可执行文件add_executable(a a.c)add_executable(b b.c)message("--------------------测试TARGET属性----------------------")# 设置目标a和b,定义三个属性,属性值为 音乐,美术,数学set_target_properties(a b PROPERTIES Pro1 音乐 Pro2 美术 Pro3 数学)# 获取a的Pro1属性值get_target_property(v1 a Pro1)# 获取b的Pro2属性值get_property(v2 TARGET a PROPERTY Pro2)# 获取目标b的Pro3属性值get_target_property(v3 b Pro3)message("属性值为 v1=${v1}v2=${v2}v3=${v3}")# 属性值为 v1=音乐 v2=美术 v3=数学2.19.2 DIRECTORY属性
使用set_directory_properties命令设置当前目录和子目录的属性,语法:
set_directory_properties(PROPERTIES<属性名1><属性值1><属性名2><属性值2>…)使用get_directory_properties命令获取DIRECTORY范围属性,语法:
get_directory_property(变量<dir><属性名>)测试:
message("------------------------测试DIRECTORY属性----------------------")# 为当前目录定义一个Pro1属性, 可继承,在子目录中可以访问define_property(DIRECTORY PROPERTY Pro1 INHERITED)# 设置当前目录和子目录的多个属性值set_directory_properties(PROPERTIES Pro1 语文 Pro2 英语 Pro3 物理)# 添加子目录add_subdirectory(sub)# 获取当前目录的Pro1属性值,放入d1中get_directory_property(d1 Pro1)# 获取当前目录(DIRECTORY .)的Pro2属性值,放入d2中get_property(d2 DIRECTORY.PROPERTY Pro2)# 获取当前目录Pro3 放入d3中get_directory_property(d3 DIRECTORY.Pro3)message("获取属性值 d1=${d1}d2=${d2}d3=${d3}")# 获取属性值 d1=语文 d2=英语 d3=物理2.19.3 SOURCE 属性
使用set_source_files_properties 命令设置SOURCE范围的属性,语法如下:
set_source_files_properties(<files>[directort<dir>]PROPERTIES<属性名1><属性值1><属性名2><属性值2>)使用get_source_property 命令获取SOURCE范围属性,语法如下:
get_source_files_property()测试:
message("-------------------------测试SOURCE属性----------------------")# 为a.c 和 b.c 设置三个属性值set_source_files_properties(a.c b.c PROPERTIES Pro1 语文 Pro2 英语 Pro3 物理)# 获取文件属性值get_source_file_property(v1 a.c Pro1)get_property(v2 SOURCE a.c PROPERTY Pro2)get_source_file_property(v3 b.c Pro3)message("获取属性值 v1=${v1}v2=${v2}v3=${v3}")# 获取属性值 v1=语文 v2=英语 v3=物理