首页 > 其他分享 >CMake 属性之目标属性

CMake 属性之目标属性

时间:2024-10-08 20:11:59浏览次数:8  
标签:CMake TARGET 目标 test TEST property 属性

【写在前面】

CMake 可以通过属性来存储信息。它就像是一个变量,但它被附加到一些其他的实体上,像是一个目录或者是一个目标。例如一个全局的属性可以是一个有用的非缓存的全局变量。

在 CMake 的众多属性中,目标属性 ( Target Properties ) 扮演着尤为重要的角色,它们直接关联到最终生成的可执行文件、库文件等构建产物。

更直观一点,如果把目标类比为 类 ( Class ),那么目标属性则类似 类成员 ( Class  Member )

class Target {
    string target_property;
};

【正文开始】

生成目标的方式有三种:

#生成可执行文件目标test
add_executable(test test.cpp)
#生成共享库目标test_lib
add_library(test_lib SHARED test.cpp)
#生成静态库目标test_lib
add_library(test_lib STATIC test.cpp)

定义目标属性:

给目标定义属性的命令为:

define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
                 TEST | VARIABLE | CACHED_VARIABLE>
                 PROPERTY <name> [INHERITED]
                 [BRIEF_DOCS <brief-doc> [docs...]]
                 [FULL_DOCS <full-doc> [docs...]]
                 [INITIALIZE_FROM_VARIABLE <variable>])

在范围内定义一个属性,用于 set_property() 和 get_property() 命令。它主要用于定义属性的初始化或继承方式。从历史上看,该命令还将文档与属性相关联,但这不再被视为主要用例。

示例:

# 定义一个目标属性 TEST_TARGET,带有简短和详细描述 
define_property(TARGET PROPERTY TEST_TARGET 
    BRIEF_DOCS "A test property"
    FULL_DOCS "A long description of this test 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_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)

设置目标的属性。该命令的语法是列出您要更改的所有目标,然后提供您接下来要设置的值。您可以使用任何您想要的 prop 值对,稍后使用 get_property() 或 get_target_property() 命令提取它。

示例:

# 设置目标 TEST_TARGET 的属性 P_1 和 P_2 的值
set_target_properties(TEST_TARGET PROPERTIES
    P_1 "这是属性P_1的值"
    P_2 "这是属性P_2的值" 
)

获取目标属性:

获取目标的属性的命令为:

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])

从范围内的一个对象获取一个属性。

其中,有一个专用于获取目标属性命令:

get_target_property(<VAR> target property)

从目标获取属性。属性的值存储在变量“”中。如果未找到目标属性,则行为取决于它是否已被定义为 INHERITED 属性(请参阅:command:define_property)。非继承属性会将<VAR>设置为<VAR>-NOTFOUND,而继承属性将搜索相关的父范围,如 define_property() 命令所述,如果仍然找不到属性 <VAR> 将被设置为空字符串。

使用 set_target_properties() 设置目标属性值。属性通常用于控制目标的构建方式,但有些属性会查询目标。此命令可以获得迄今为止创建的任何目标的属性。目标不需要位于当前的 CMakeLists.txt 文件中。

示例:

# 获取目标 TEST_TARGET 的属性 P_1 的值,并将其存储在变量 TEST_TARGET_P1 中
get_target_property(TEST_TARGET_P1 TEST_TARGET P_1) 

最后完整测试一遍:

# 要求 CMake 最低版本为 3.16
cmake_minimum_required(VERSION 3.16)

# 定义项目名称为 PROPERTY_TEST,版本号为 1.0,使用 C++ 语言
project(PROPERTY_TEST VERSION 1.0 LANGUAGES CXX)

# 添加一个名为 TEST_TARGET 的可执行文件,其源文件为 test.cpp
add_executable(TEST_TARGET test.cpp)

# 定义一个目标属性 TEST_TARGET,带有简短和详细描述 
define_property(TARGET PROPERTY TEST_TARGET 
    BRIEF_DOCS "A test property"
    FULL_DOCS "A long description of this test property"
)

# 设置目标 TEST_TARGET 的属性 P_1 和 P_2 的值
set_target_properties(TEST_TARGET PROPERTIES
    P_1 "这是属性P_1的值"
    P_2 "这是属性P_2的值" 
)

# 获取目标 TEST_TARGET 的属性 P_1 的值,并将其存储在变量 TEST_TARGET_P1 中
get_target_property(TEST_TARGET_P1 TEST_TARGET P_1) 

# 打印变量 TEST_TARGET_P1 的值
message("TEST_TARGET_P1: ${TEST_TARGET_P1}") 

CMake 输出如下:

image


【结语】

最后,属性在 CMake 中是可继承的。这意味着,如果一个目标继承了另一个目标的属性,那么它将自动获得父目标的属性值。这种继承关系在构建大型项目时非常有用,因为它减少了重复的配置。

CMake 的属性系统是一个强大的工具,它提供了细粒度的控制,允许我们定制构建过程。通过合理使用属性,我们可以创建更加灵活和可维护的构建系统。掌握属性的使用,是每个 CMake 用户进阶的必经之路,希望这篇文章能够帮助你更好地理解和使用 CMake 的属性系统。

项目链接(多多star呀..⭐_⭐):

Github 地址:https://github.com/mengps/LearnCMake

标签:CMake,TARGET,目标,test,TEST,property,属性
From: https://www.cnblogs.com/mengps/p/18452409

相关文章

  • Vue3 计算属性
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、computed是什么?二、示例前言计算属性用于根据其他数据的变化动态计算衍生出来的属性值,而且具有缓存机制,只有相关依赖发生变化时才会重新计算。一、computed是什么?计算属性关键词:......
  • CSS3属性选择器
    属性选择器选择符                       简介E[att]                   选择具有att属性的元素E[att="val"]          选择具有att属性且属性值等于val的E元素E......
  • leetcode 刷题day35动态规划Part04 背包问题(1049. 最后一块石头的重量 II 、494. 目标
    1049.最后一块石头的重量II思路:解题的难度在于如何转化为背包问题。本题的核心思路是让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题,和416.分割等和子集非常像了。首先,背包的容量target为sum/2向下取整,得到dp[target]就是分出来较小的一堆,用su......
  • GUI图形界面 无代码开发 原理 - 属性标识链 | uiotos致敬amis、nodered、appsmith、co
    低代码饱受争议。也有例外:后端NodeRed,前端Amis。整体还是诟病为主:简单业务可以,复杂的是扯淡,不论前后端。这是一贯的认知。在GUI方面,UIOTOS发明的嵌套技术,为复杂前端的无代码开发,开辟了一条新的思路。往期文章:可视化拖拉拽?过时了!组态零代码,不能做复杂前端?嵌套原理一复杂交互......
  • vue3如何将 app 全局变量对象变为响应式并监听到某个属性的改变
    需求:通过 getData()方法获取到数据对象,想要在屏幕方向改变的时候,给获取到的对象设置  orientation,能实时修改方案:使用reactive包裹,template直接使用全局变量下的属性,watch直接监听对应属性代码如下:main.jsconstconfig=reactive(getData())//设置屏幕方......
  • 我的CMake项目结构
    我的CMake项目结构项目类型类库项目项目的主要输出目标为库文件可执行项目项目的主要输出为可执行文件项目结构3rdparty第三方库xxx库名称,如stb、spdloginclude头文件src/lib/...(可选)源文件、库文件等src项目源码CMakeLists.txtdemo(可选)例程,一般类......
  • bash的特有扩展属性
    1.[[]]符合匹配#!/bin/bashname=$1if[["${name}"=~^li*]];then echo"以li开头"else echo"不以li开头"fi#if[["${name}"=="liwl"]]||[["${name}"=="liwanliang"]];then echo&q......
  • Maya中的节点和属性
    节点Maya是基于节点构建的,Maya场景可以理解为节点图的视觉表现,Maya中创建的每个对象都由一个或多个节点表示,对象的节点图决定了其形状、颜色等特征,通过节点可以追溯历史操作,并可对历史操作进行修改。如Sphere“对象”是基于多个节点构建的:创建节点(UtilityHelper)形状节点(Sha......
  • 基于MOA*的多目标路径规划问题之我见
    基于MOA*的多目标路径规划问题之我见最近在对基础单目标Astar算法有所了解后,笔者进一步探索和学习了多目标Astar算法,即MOAstar。在由单目标变成多目标的研究过程中,笔者经历了一些疑问和思考,也收获了很多体会和感悟,于是在这里记录一下笔者的学习过程。基础单目标A*算法学习链接......
  • 帝国CMS增加信息自动把内容图片的alt和title属性替换为信息标题
    要在帝国CMS中自动为图片添加 alt 和 title 属性,可以按照以下步骤操作:步骤1:添加自定义函数 user_imgalt()打开 userfun.php 文件找到 e/class/userfun.php 文件并打开。添加自定义函数 user_imgalt()在文件末尾(?> 之前)添加以下函数:functionuser_im......