CMake 属性之目录属性

news2024/11/28 1:45:10

 【写在前面】

        CMake 的目录属性是指在特定目录(及其子目录)范围内有效的设置。

        这些属性不同于全局变量或目标(Target)属性,它们提供了一种机制,允许开发者为项目中的不同部分定义不同的构建行为。

        通过目录属性,你可以指定编译器选项、包含路径、预处理定义等,而无需在每个目标或文件中重复这些设置。


【正文开始】

        CMake 目录范围的属性有( CMake 3.30 ):

  • ADDITIONAL_CLEAN_FILES
  • BINARY_DIR
  • BUILDSYSTEM_TARGETS
  • CACHE_VARIABLES
  • CLEAN_NO_CUSTOM
  • CMAKE_CONFIGURE_DEPENDS
  • COMPILE_DEFINITIONS
  • COMPILE_OPTIONS
  • DEFINITIONS
  • EXCLUDE_FROM_ALL
  • IMPLICIT_DEPENDS_INCLUDE_TRANSFORM
  • IMPORTED_TARGETS
  • INCLUDE_DIRECTORIES
  • INCLUDE_REGULAR_EXPRESSION
  • LABELS
  • LINK_DIRECTORIES
  • LINK_OPTIONS
  • LISTFILE_STACK
  • MACROS
  • PARENT_DIRECTORY
  • RULE_LAUNCH_COMPILE
  • RULE_LAUNCH_CUSTOM
  • RULE_LAUNCH_LINK
  • SOURCE_DIR
  • SUBDIRECTORIES
  • SYSTEM
  • TESTS
  • TEST_INCLUDE_FILES
  • VARIABLES
  • VS_GLOBAL_SECTION_POST_<section>
  • VS_GLOBAL_SECTION_PRE_<section>
  • VS_STARTUP_PROJECT
        定义目录属性:
define_property( <DIRECTORY>
                 PROPERTY <name> [INHERITED]
                 [BRIEF_DOCS <brief-doc> [docs...]]
                 [FULL_DOCS <full-doc> [docs...]]
                 [INITIALIZE_FROM_VARIABLE <variable>])

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

        示例: 

# 定义一个名为 CURRENT_DIRECTORY 的目录属性
define_property(DIRECTORY 
    # 目录属性的名称
    PROPERTY CURRENT_DIRECTORY
    # 简短的文档说明
    BRIEF_DOCS "The current directory"
    # 详细的文档说明
    FULL_DOCS "The current directory"
)
         设置目录属性:    
set_property(<[DIRECTORY <dirs> ...] [TARGET_DIRECTORY <targets> ...]>
             [APPEND] [APPEND_STRING]
             PROPERTY <name> [<value1> ...])

在范围的零个或多个对象上设置一个属性。

DIRECTORY 范围默认为当前目录,但其他目录(已由 CMake 处理)可以按完整路径或相对路径命名。相对路径被视为相对于当前源目录。另请参阅 set_directory_properties() 命令。

在 3.19 版本加入: <dir> 可以引用一个二进制目录。

如果给出 APPEND 选项,列表将附加到任何现有的属性值(除了忽略和不附加空值)。如果给出 APPEND_STRING 选项,字符串将作为字符串附加到任何现有属性值,即它会产生更长的字符串而不是字符串列表。当使用 APPEND APPEND_STRING 以及定义为支持 INHERITED 行为的属性时(请参阅 :command:define_property),在找到要附加到的初始值时不会发生继承。如果该属性尚未在指定范围内直接设置,则该命令的行为就好像没有给出 APPEND APPEND_STRING 一样。

        示例:

# 设置当前目录属性为当前源代码目录
set_property(DIRECTORY PROPERTY CURRENT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

        其中,有一个专用于设置目录属性的命令:

set_directory_properties(PROPERTIES prop1 value1 [prop2 value2] ...)

在键值对中设置当前目录及其子目录的属性。

另请参阅 set_property(DIRECTORY) 命令。

         获取目录属性:
get_property(<[DIRECTORY <dir> | TARGET_DIRECTORY <target>]>
             PROPERTY <name>
             [SET | DEFINED | BRIEF_DOCS | FULL_DOCS])

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

DIRECTORY 作用域默认为当前目录,但另一个目录(已由 CMake 处理)可能由完整或相对路径命名为“<dir>”。相对路径被视为相对于当前源目录。另请参阅 get_directory_property() 命令。

在 3.19 版本加入: <dir> 可以引用一个二进制目录。

如果给出了 SET 选项,变量将被设置为一个布尔值,指示该属性是否已被设置。如果给出了 DEFINED 选项,变量将被设置为一个布尔值,指示该属性是否已被定义,例如使用 define_property 命令。 如果给出了``BRIEF_DOCS`` 或``FULL_DOCS``,那么该变量将被设置为一个字符串,其中包含所请求属性的文档。如果为尚未定义的属性请求文档,则返回“NOTFOUND”。

        示例:

# 获取当前目录属性
get_property(CURRENT_DIR DIRECTORY PROPERTY CURRENT_DIRECTORY)

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

get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)

将目录范围的属性存储在命名的``<variable>``中。

DIRECTORY 参数指定从中检索属性值的另一个目录,而不是当前目录。相对路径被视为相对于当前源目录。 CMake 必须已经知道该目录,或者通过调用 add_subdirectory 添加它或者是顶级目录。

在 3.19 版本加入: <dir> 可以引用一个二进制目录。

如果没有为指定的目录范围定义该属性,则返回一个空字符串。对于 INHERITED 属性,如果在指定的目录范围内找不到该属性,则搜索将链接到父范围,如 define_property() 命令所述。

get_directory_property(<variable> [DIRECTORY <dir>]
                       DEFINITION <var-name>)

从目录中获取变量定义。这种形式对于从另一个目录获取变量定义很有用。

         示例:

# 添加预处理定义,定义宏TEST_DEFINED的值为1
add_compile_definitions(TEST_DEFINED=1)

# 获取当前目录的属性COMPILE_DEFINITIONS,即定义的宏
get_directory_property(DEFS COMPILE_DEFINITIONS) 

# 打印获取到的定义信息
message("DEFS: ${DEFS}")

        最后完整测试一遍:

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

# 定义一个名为 CURRENT_DIRECTORY 的目录属性
define_property(DIRECTORY 
    # 目录属性的名称
    PROPERTY CURRENT_DIRECTORY
    # 简短的文档说明
    BRIEF_DOCS "The current directory"
    # 详细的文档说明
    FULL_DOCS "The current directory"
)

# 设置当前目录属性为当前源代码目录
set_property(DIRECTORY PROPERTY CURRENT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

# 获取当前目录属性
get_property(CURRENT_DIR DIRECTORY PROPERTY CURRENT_DIRECTORY)

# 打印当前目录信息
message("CURRENT_DIR: ${CURRENT_DIR}")

# 添加预处理定义,定义宏TEST_DEFINED的值为1
add_compile_definitions(TEST_DEFINED=1)

# 获取当前目录的属性COMPILE_DEFINITIONS,即定义的宏
get_directory_property(DEFS COMPILE_DEFINITIONS) 

# 打印获取到的定义信息
message("DEFS: ${DEFS}")

# 将库目录链接到当前目录下的lib目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)

# 获取链接目录属性
get_property(LINK_DIR DIRECTORY PROPERTY LINK_DIRECTORIES)

# 获取源目录属性
get_property(S_DIR DIRECTORY PROPERTY SOURCE_DIR)

# 打印链接目录和源目录信息
message("LINK_DIR: ${LINK_DIR} S_DIR: ${S_DIR}")

# 设置当前目录及其子目录的编译器标志  
set_directory_properties(PROPERTIES COMPILE_FLAGS "-Wall -Wextra")

# 获取当前目录的编译标志
get_directory_property(COMPILE_FLAGS COMPILE_FLAGS)

# 打印获取到的编译标志信息
message("COMPILE_FLAGS: ${COMPILE_FLAGS}")

         CMake 输出如下:


【结语】

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口&#xff0c;使用频次最高。之前习惯了uniapp下的网络接口风格&#xff0c;使用起来贼简单方便。转战到鸿蒙上后&#xff0c;原始网络接口写着真累啊&#xff01;目标让鸿蒙上网络接口使用&#xff0c;简单程度比肩uniapp&#xff0c;比Axios更轻量级。源码量也不多…

Spring Cloud全解析:链路追踪之springCloudSleuth简介

文章目录 springCloudSleuth简介链路追踪&#xff1f;SpringCloudSleuth术语链路示意图zipkin依赖配置 springCloudSleuth简介 链路追踪&#xff1f; 什么是链路追踪&#xff1f;就是将一次分布式请求还原成调用链路&#xff0c;将一次分布式请求的调用情况集中展示&#xff…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;多数据源配置&#xff09; 前言多数据源配置引入aop依赖1. properties配置多数据源2. 创建数据源枚举类3. 线程参数配置类4. 数据源动态切换类5. 多数据源配置类HikariCP 版本…

【JS】用哈希法得到四数相加元组数

思路 根据题目这里是四个数组abcd的数相加&#xff0c;将数组两两分组&#xff0c;A大组为ab&#xff0c;B大组为cd由abcd0可得AB0&#xff0c;即B0-A遍历数组分别计算出AB大组所有sum值&#xff0c;先将A组sum值存进map里&#xff0c;再从map里面寻找有count个合适的B值&#…

Python in Excel 正式发布!

Excel 中的 Python 现已正式发布&#xff0c;适用于 Microsoft 365 商业版和企业版的 Windows 用户。去年 8 月&#xff0c;微软与 Anaconda 合作&#xff0c;通过集成 Python 为 Excel 引入了一个令人兴奋的新增功能&#xff0c;从而可以将 Python 和 Excel 分析无缝结合到同一…

使用npm i报错node-sass失败问题解决

node 版本&#xff1a;v14.15.4 解决方法&#xff1a; npm config set sass_binary_sitehttps://npmmirror.com/mirrors/node-sass设置完之后&#xff0c;再npm i 就可以下载成功 亲测有效

MySQL--视图(详解)

目录 一、前言二、视图2.1概念2.2语法2.3创建视图2.3.1目的 2.4查看视图2.5修改数据2.5.1通过真实表修改数据&#xff0c;会影响视图2.5.2通过修改视图&#xff0c;会影响基表 2.6注意2.7 删除视图2.8 视图的优点 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&…

历时一个多月,搭建了一款培训考试小程序系统

前不久&#xff0c;一位在机构单位工作的朋友联系到我&#xff0c;说他们需要搭建一款内部培训考试系统&#xff0c;是关于安全知识学习与考试的。 此处省略好多张聊天页...... 为此&#xff0c;针对用户的需求&#xff0c;在搭建前&#xff0c;我做了大量的竞品分析&#xff…

探索 MicroRabbit:Python 中的通信新纪元

文章目录 探索 MicroRabbit&#xff1a;Python 中的通信新纪元背景&#xff1a;为什么选择 MicroRabbit&#xff1f;MicroRabbit 是什么&#xff1f;如何安装 MicroRabbit&#xff1f;简单的库函数使用方法场景应用示例常见 Bug 及解决方案总结 探索 MicroRabbit&#xff1a;Py…

计算机毕业设计 基于Python的智能停车管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

UML/SysML建模工具更新情况(2024年10月)(1)Rhapsody 10.0.1

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本&#xff1a;SinelaboreRT 6.4 更新时间&#xff1a;2024年9月23日 工具简介 状态机图和活动图代码生成工具。先在EA、Visual Paradigm 、Cadifra、UModel、MagicDraw、…

衡石分析平台系统管理手册-智能运维之系统设置

系统设置​ HENGSHI 系统设置中展示了系统运行时的一些参数&#xff0c;包括主程序相关信息&#xff0c;Base URL、HTTP 代理、图表数据缓存周期、数据集缓存大小、租户引擎等相关信息。 主程序​ 系统设置中展示了主程序相关信息&#xff0c;这些信息是系统自动生成的&#…

AOC商用显示器助力智能制造,赋能数智化发展!

摘要&#xff1a;为制造型企业向数字化、智能化转型提供有力助益&#xff01; 当今时代&#xff0c;我国制造业呈现出蓬勃发展之势。其中&#xff0c;显示器作为信息呈现的关键载体&#xff0c;其在制造业智能化进程中愈发发挥着重要作用&#xff0c;有助于实时、准确地展示生…

Mysql数据库安装与C++配置

本文档旨在为需要安装和配置MySQL 8.3、MySQL Workbench以及C Connector的用户提供详细的步骤指导。在安装过程中&#xff0c;可能会遇到一些常见问题&#xff0c;如DLL文件缺失等&#xff0c;本指南也会提供相应的解决办法。 1.安装Mysql8.3 安装Mysql有很多教程&#xff0c…

体感魂斗罗(二)姿势/手势与键位

文章目录 姿势/手势与键位映射 姿势/手势与键位映射 姿势/手势与键位映射暂时定为如下表的映射&#xff0c;搞出来一版&#xff0c;后续再优化 姿势/手势键位手掌上抬键位-上手掌下压键位-下手掌左挥键位-左手掌右挥键位-右挥拳A键抬腿B键OK手势暂停-开始

105. 从前序与中序遍历序列构造二叉树【 力扣(LeetCode) 】

文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路四、参考代码 零、LeetCode 原题 105. 从前序与中序遍历序列构造二叉树 一、题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的…

『网络游戏』客户端使用PESorket发送消息到服务器【14】

上一章服务器已经完成使用PESorket 现在我们将其导出在客户端中使用 生成成功后复制 粘贴到Unity项目中 进入Assets文件夹 粘贴两个.dll 创建脚本:ClientSession.cs 编写脚本: ClientSession.cs 编写脚本:GameStart.cs 将GameStart.cs脚本绑定在摄像机上 运行服务器 运行客户端…

【python实操】python小程序之封装(家具管理)

引言 python小程序之封装&#xff08;家具管理&#xff09; 文章目录 引言一、封装&#xff08;家具管理&#xff09;1.1 题目1.2 代码1.3 代码解释1.3.1 类 HouseItem1.3.2 类 House1.3.3 实例化与调用1.3.4 运行结果 四、思考 一、封装&#xff08;家具管理&#xff09; 1.1…

基于IDEA+SpringBoot+Vue+Uniapp的投票评选小程序系统的详细设计和实现

2. 详细视频演示 文章底部名片&#xff0c;联系我获取更详细的演示视频 3. 论文参考 4. 项目运行截图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框…

令牌桶算法自学笔记

令牌桶算法可以处理大流浪场景。 令牌以恒定的速率向一个令牌通中放入令牌&#xff0c;每一个请求必须要从桶中拿到令牌&#xff0c;才可以完成后续处理请求的操作。如果一个请求没有拿到令牌&#xff0c;那么就解决请求。 可以处理固定桶数量的请求&#xff0c;当请求数量超…