CMake Do‘s and Don‘ts (行为准则)

CMake Do's and Don'ts {行为准则}

  • 1. General
  • 2. Modules
  • 3. Projects
  • References

Effective Modern CMake
https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1

Do’s and Don’ts
https://cliutils.gitlab.io/modern-cmake/chapters/intro/dodonot.html

do's and don'ts = dos and don'ts

1. General

  • Use at least CMake version 3.0.0

Modern CMake is only available starting with version 3.0.0.

  • Treat CMake code like production code

CMake is code. Therefore, it should be clean. Use the same principles for CMakeLists.txt and modules as for the rest of the codebase.
把 CMake 程序视作代码。它应该和其他的代码一样,是整洁并且可读的。

  • Use lowercase function names (使用小写的函数名)

CMake functions and macros can be called lower or upper case. Always use lower case. Upper case is for variables.
CMake 的函数和宏的名字可以定义为大写或小写,但是一般都使用小写,变量名用大写。

  • Forget the commands add_compile_options, include_directories, link_directories, link_libraries

Those commands operate on the directory level. All targets defined on that level inherit those properties. This increases the chance of hidden dependencies. Better operate on the targets directly.
这些命令在目录级别上操作。在该级别上定义的所有目标都会继承这些属性。这增加了隐藏依赖项的可能性。最好直接在目标上操作。

2. Modules

  • Use modern find modules that declare exported targets

Starting with CMake 3.4, more and more find modules export targets that can be used via target_link_libraries.

3. Projects

  • Avoid custom variables in the arguments of project commands

Keep things simple. Don’t introduce unnecessary custom variables. Instead of add_library(a ${MY_HEADERS} ${MY_SOURCES}), do add_library(a b.h b.cpp).

  • Don’t use file(GLOB) in projects

CMake is a build system generator, not a build system. It evaluates the GLOB expression to a list of files when generating the build system. The build system then operates on this list of files. Therefore, the build system cannot detect that something changed in the file system.
CMake 是一个构建系统生成器,而不是构建系统。它在生成构建系统时将 GLOB 表达式求值为文件列表。然后构建系统会对此文件列表进行操作。因此,构建系统无法检测到文件系统中发生了某些变化。

CMake cannot just forward the GLOB expression to the build system, so that the expression is evaluated when building. CMake wants to be the common denominator of the supported build systems. Not all build systems support this, so CMake cannot support it neither.
CMake 不能直接将 GLOB 表达式转发给构建系统,以便在构建时评估该表达式。CMake 希望成为受支持的构建系统的 common denominator。并非所有构建系统都支持这一点,因此 CMake 也不能支持它。

References

[1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/
[2] Quick start guide, https://www.jetbrains.com/help/clion/clion-quick-start-guide.html
[3] 轻松上手, https://www.jetbrains.com/zh-cn/clion/features/start-your-project.html

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

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

相关文章

验证的分类及相关工具

目录 1.验证方法的分类1.1动态验证1.2.静态验证 2.动态验证及相关工具2.1.电路级仿真工具2.2.逻辑仿真工具 3.静态验证及相关工具3.1 形式验证工具3.2 静态时序分析工具 SOC设计中验证包含以下几个方面: 验证原始描述的正确性验证设计的逻辑功能是否符合设计规范的要…

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS(Domain Name System)是互联网使用的命名系统,用来把便于人们使用的机器…

【Python】pandas库---数据分析

大学毕业那年,你成了社会底层群众里,受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析,没看过的同学可以去看看:【Pyt…

【人工智能学习之HDGCN18关键点修改】

【人工智能学习之HDGCN18关键点修改】 训练部分修改部分 训练部分 请参考文章:【人工智能学习之HDGCN训练自己的数据集】 修改部分 参考源码中25关键点的区域划分,我们将18关键点划分为: 头部: 鼻子左眼和左耳右眼和右耳 上肢…

ARCGIS国土超级工具集1.2更新说明

ARCGIS国土超级工具集V1.2版本,功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG,新增了"矢量分割工具"菜单,同时增加及更新了了若干功能,新工具使用说明如下: 一、勘测定界工具栏更新界址点成果…

华为OD --- 流浪地球

华为OD --- 流浪地球 题目独立实现基本思路代码实现 其他答案实现思路代码实现 题目 独立实现 基本思路 1、首先把题目给出的启动机器初始化成数组, 2、用for循环模拟每隔1s更新这个初始化数组的前后两个机器. (源码中的updateTimeCount函数) 3、for循环每次循环后会检查当前…

DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services

引言 在数字化转型的浪潮中,数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合,旨在提高数据管道的质量和效率,从而加速数据从源头到消费的过程。白鲸开源科技,作为DataOps领域的领先开源原生公司&#xf…

【硬件IIC】stm32单片机利用硬件IIC驱动OLED屏幕

之前操作OLED屏幕都是用GPIO模拟IIC去驱动,最近打算用硬件IIC去驱动,于是写下这个demo,在这个过程中遇到一点小坑,记录一下,本文章非小白教程,所以只突出踩到的坑点,文章中涉及到的OLED也是网上资料写烂的&…

python如何自动加空格

首先,需要进行打开的一个pycharm的软件,可进行双击的打开该软件。 可以看到的是在当前的打开的文件中,格式相对较乱一下。格式不对会格式错误。 然后点击菜单栏中的“code”。 在弹出的下拉菜单中选择“reformat code”选项。 可以看到的是在…

【开源免费】基于SpringBoot+Vue.JS网上订餐系统(JAVA毕业设计)

本文项目编号 T 018 ,文末自助获取源码 \color{red}{T018,文末自助获取源码} T018,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

串口通信和SPI通信详解

0、背景 在现代嵌入式系统中,通信是不同模块之间交换数据的核心。串口通信和 SPI(串行外设接口)是两种常见的通信方式,它们各自有独特的优势和适用场景。 1、串口通信 1.1、串口通信概念 串口通信是一种常见的异步串行通信协议…

javase-17、API.数学相关

一、Math类 Math类提供了大量的静态方法来便于我们实现数学计算,如求绝对值、取最大或最小值等。 https://doc.qzxdp.cn/jdk/17/zh/api/java.base/java/lang/Math.html 所在模块:java.base所在包: java.lang static double abs(double a)…

答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统,支持多种试题类型、多种试题难度、练题、考试、补考模式,提供全部前后台无加密源代码,支持私有化部署 二.测试环境 系统环境:CentOS、 运行环境&#x…

浅谈仓颉语言的优劣

仓颉语言,作为华为自研的新一代编程语言,以其高效、安全、现代化的特点,引起了广泛的关注。 仓颉语言的优势 高效并发 仓颉语言的一大亮点是其轻松并发的能力。它实现了轻量化用户态线程和并发对象库,使得高效并发变得轻松。仓颉…

Sass系统数据隔离的三种方式

1.完全独立的数据库 为每一个租户单独部署一个数据库 优点:达到了真正的按租户进行隔离,不同租户之间相互没有影响,可以针对一些特殊租户例如大客户做一些定制化的开发,计费相对简单,按照资源使用进行计费。 缺点&…

FFmpeg 主要结构体剖析

FFmpeg 探索之旅 FFmpeg 主要结构体剖析 FFmpeg 探索之旅前言1、AVFormatContext2、AVCodecContext3、AVCodec4、AVStream5、AVPacket6、AVFrame7、AVCodecParameters7、SwsContext8、AVIOContext9、AVRational 总结 前言 嘿,各位小伙伴!在如今这个多媒…

经典电荷泵/Charge pump——1998.JSSC

电路结构 工作原理 M3 and M4 are the series switches, and M5, M6 switch to the highest voltage. If M5 and M6 are missing, having a large capacitor is of absolute necessity, because must always stay between 2 Vin and 2Vin - Uj to avoid switching on the vert…

Swin transformer 论文阅读记录 代码分析

该篇文章,是我解析 Swin transformer 论文原理(结合pytorch版本代码)所记,图片来源于源paper或其他相应博客。 代码也非原始代码,而是从代码里摘出来的片段,配上简单数据,以便理解。 当然&…

GPT-Omni 与 Mini-Omni2:创新与性能的结合

近年来,随着人工智能技术的飞速发展,各种模型和平台应运而生,以满足从个人用户到企业级应用的多样化需求。在这一领域,GPT-Omni 和 Mini-Omni2 是两款备受瞩目的技术产品,它们凭借独特的设计和强大的功能,在…

龙迅#LT7911E适用于EDP/DP/TPYE-C转MIPIDSI应用,支持图像处理功能,内置I2C,主应用副屏显示,投屏领域!

1. 描述 LT7911E 是一款高性能 eDP 转 MIPI D-PHY 转换器,旨在将 eDP 源连接到 MIPI 显示面板。 LT7911E 集成了一个符合 eDP1.4 标准的接收器,支持 1.62Gbps 至 5.67Gbps 的输入数据,以 270Mbps 的递增步长,以及一个 2 端口 D…