我为什么喜欢 CMake?

By eg,2022.06.11 于成都

0. 缘起

对于 C/C++ 程序员来说,能够 coding 只是工作的很小一部分,大部分时间可能都是花在 debug 上。对于 debug,第一道防线我想应该就是编译了,当然有些静态扫描工具可以当成 debug 的第一道防线,但我个人习惯于写完代码后就进行编译,通过编译器给我的提示,进行初步的 debug,当编译器不再抱怨我的代码写得烂的时候,再进行下一步的 debug。

说到编译,这就是一个非常大的话题了,我这里就不对其进行深究了。我只想谈谈和代码编译相关的一些问题。

大概是在一个特殊的工作阶段,我看到有同事在使用 CMake 作为编译构建工具,当时毫不在意,他用他习惯的 CMake,我用我习惯的 MakeFile。世界其实就是这么奇妙,人也是这样,喜欢躺在舒适区,不太愿意接受新的事物。所以那时我自然也就不知道 CMake 的好处了。

直到另一个特殊的工作阶段,当我不得不使用 CMake 的时候,才发现自己对 CMake 一点也不了解。即使看了几天的官方文档,看了无数的 CMake 相关的技术博客,找遍了各大视频教学网站关于 CMake 的教学视频,依然觉得半知半解,遇到 CMake 相关的问题依然无从下手,只能求助身边的同事。那时甚至想用 MakeFile 重写编译构建的脚本,当我提出我的想法的时候,立马就被同事拒绝了。所以我也只能硬着头皮使用上了 CMake,遇到问题就继续问同事。

久而久之,自己也不太好意思每次都问,遂下定决心要好好学习 CMake。皇天不负有心人,经过断断续续两年多的摸索,现在对 CMake 的认知算是有了一点心得,我自己也从此爱上了 CMake。

1. 学习 CMake 时的迷惑

CMake 是一个入门简单,但要吃透就很难的工具。如果只是想会一些简单的使用,我想找个入门的博客或者视频看看基本也就可以了。

对于我,我不是那种只满足了表面的人,我想深究,我想吃透,我想以后再遇到 CMake 相关的问题能够快速解决,而不是满世界的问。

一开始学习的时候,我迷惑于 CMake 为什么变量还要区分普通变量、缓存变量、环境变量,我迷惑于 CMake 的变量作用域为什么那么奇怪,我迷惑于 CMake 函数和宏的行为以及他们的参数解析,我迷惑于给 CMake 命令传参的灵活性,我迷惑于 CMake target 的概念,我迷惑于 CMake 对各种 target 属性的操作,我迷惑于 CMake 的生成器表达式,我迷惑于 CMake 处理第三方依赖的行为,我迷惑于编译完成后还有一个并非一定是安装到真实环境的一个安装过程。还有太多的迷惑,但随着深入的学习,这些迷惑也都渐渐清晰了。

2. CMake 不是编译构建工具

看到这个标题,可能很多人都会比较吃惊,不是一直在说 C/C++ 编译构建工具 CMake 吗?怎么突然又说 CMake 不是编译构建工具。我的回答是肯定的,CMake 确实不是编译构建工具,CMake 是一系列工具的组成,它包括三个命令行工具 cmake、ctest、cpack,以及两个交互界面的工具 cmake-gui、ccmake。

其中的 cmake 负责生成真正的编译构建工具的脚本,比如生成 make 工具需要的 MakeFile,生成 Visual Studio 需要的 .sln 等。ctest 负责运行单元测试,cpack 负责打包,而两个交互界面的工具 cmake-gui 和 ccmake 完成和命令行工具 cmake 同样的任务,只是三者各自有各自的使用场景和好处。

也就是说 CMake 不是编译构建工具,而是一个更高层次的抽象,CMake 是管理其它真正的编译构建工具的工具。

3. CMake 可以做哪些事情

对于大多数人来说,使用 CMake 的直接原因就是 CMake 可以管理编译构建工具,生成编译构建工具所需的项目工程文件,用于编译整个项目。但是 CMake 所能做的事情远不止于此。

  • CMake 可以和单元测试工具集成,用于完成单元测试任务
  • CMake 可以和代码扫描工具直接集成,完成代码扫码
  • CMake 可以和打包工具集成,完成制品的打包,比如生成最终用户希望的 deb、rpm、msi 等安装包
  • CMake 可以作为项目管理工具,用于组织大型项目,管理多个项目之间的依赖
  • CMake 允许用户自定义 target,这也就给了 CMake 无限可能,也就是说 CMake 可以集成其他任意工具
  • 用 CMake 管理的项目非常有利于 CI/CD(持续集成/持续部署)的集成

4. 我为什么喜欢 CMake

通过对 CMake 学习和使用的不断深入,我也从中学到了许多 C/C++ 项目组织,编译构建,单元测试,代码扫描,制品打包相关的知识,也体会到了组织好一个大型项目的重要性。

CMake 给我的开发生涯带来了质的飞跃,使我开发的项目从一个玩具项目真正成为商业项目奠定了坚实的基础。

CMake 给我带来的不止是更好的项目开始,同时也带来了效率上的提升。编译构建不在那么耗时,项目结构的清晰,完整的编译,测试,打包流程等都是很好的正反馈。

我印象最深的就是,以前的项目要给用户打一个 deb 的安装包,我需要自己写 DEBIAN 目录下的文件,这样的弊端是很多的,现在使用 CMake 的 cpack 工具来帮助打包后,一切都变得那么的简单了。

5. 谈谈我接下来的计划

我自己学习 CMake 的过程是痛苦的,在国内几乎找不到系统学习 CMake 的教材或者视频教程,即使找到一些不错的博客,但上面的内容大多是已经过时的实践,并不是都能适用于现在的场景。

CMake 在不断的发展,很多旧的特性被抛弃,新的特性被引入,我们没有理由还要抱残守缺,要积极拥抱社区的变化,正确的使用 CMake。

我不知道是国内的大佬们都不屑于分享 CMake 相关的工程实践,还是大家都只满足于能够 work 就行。能够看到的课程或者博客都只是点到为止,至于能不能唔到,就看各自的造化了。

所以我斗胆在接下来的日子里,分享我学习 CMake 的心路历程,CMake 相关的知识。希望能给到和我一样被 CMake 折磨过但又爱之切的朋友一些帮助。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eglinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值