1+1=10

记记笔记,放松一下...

现代CMake学习笔记(一)

从默默无闻,到成为C++跨平台构建工具的事实标准,不知道是因为C++太不争气了,还是cmake真的亮眼...

作为Qt爱好者,还是喜欢从Qt的角度捋一捋 CMake(另外,CMake的gui界面本身就是用Qt开发的)

CMake 时间线

  • 2000年,CMake 诞生,为 ITK 提供跨平台的构建工具
  • 2006年,KDE 这一Qt社区的重量级框架 确定将kde4构建工具从 autotools 切换为 cmake(这一事件对cmake来说应该影响深远,如果没有KDE决策者顶着各种异议做出的这一决定,估计也没有cmake的今天)
  • 2009年,Qt5开发阶段,Qt官方针对要不要将构建工具切换到cmake,展开的激烈的讨论,最终确定:不切换到cmake,自行开发Qt新的构建工具qbs。
  • 2014年,CMake 3.0 发布(传统cmake和现代的cmake的分界线)
  • 2017年,Visual Studio开始内置支持cmake。方便了Visual Studio下的Qt用户。
  • 2020年,Qt6正式将cmake作为自身的构建工具。

Qt 时间线

  • Qt4:尽管KDE4(Qt4的程序库)选择了cmake,但是Qt官方并没有跟进。(这一时期,kde和cmake在共同成长。cmake单方面支持Qt。)
    • Qt4.5:Qt进入Nokia旗下后,开始急速扩张。该版本起Qt增加LGPL授权
    • PySide:因与PyQt开发者就授权协议无法达成一致,Nokia的巴西团队开始自行开发Python绑定,取名PySide,采用LGPL授权。PySide采用cmake进行构建。
  • Qt5:社区经过激烈讨论,最终:Qt官方确定自行开发构建工具qbs,不用cmake。(不好评价这一决策对错。毕竟此时的cmake和几年后的cmake压根就不是一个东西。)
    • Qt5.5:Qt官方开始为Qt库提供cmake的支持,以便于cmake用户使用Qt。(在次之前,是cmake单方面支持Qt)
    • Qt5.15:为了让Qt5用户向Qt6过渡,引入 Version-less CMake target
  • Qt6: 正式将cmake作为自身的构建工具

关于 qmake

对于简单的项目,qmake语法真的很简单,简单易学。

不过,复杂的项目,qmake的工程文件真的像天书一样。本来我不这样认为,只是,当发现下面问题时,我改变了认知:

  • 当提到 .pro .pri .prf .prl 这四种文件,很多qmake用户只认识第一个的时候
  • 当提及 .pro文件中,如下变量有什么区别$$varName$${varName}$$(varName)$(varName)$$[varName]${varName},qmake用户脑袋嗡嗡的时候
  • 当问及一个由几十个.pri 和 .pro构成的工程,不少qmake用户没感觉的时候
  • 当看到qmake的官方维护人员,对于qmake相关的bug充满抱怨的时候

所以,离开qmake是早晚的事情

关于 qbs

和Qt发音 Cute 相传承,qbs的官方发音是 Cubes

  • 2010年,qbs开始开发。这时候Qt在Nokia旗下,也是Qt飞速扩张的时候。(注意和前面的时间线对应,否决cmake的同时开始的qbs)
  • 2012年,qbs 正式发布。
  • 2018年,qbs 被官方废弃(deprecated )。建议用户使用cmake

qbs设计挺好的,但是只有Qt社区用,不像cmake有大量的用户群,生态不行。

简单来说,这个东西就是因cmake不好而生,又因cmake上进而死的。

关于 PySide

PySide,据我所知,这是Qt官方最早使用CMake的公开项目。我最初学习cmake也正是因为PySide采用了cmake。

  • 2009,因无法与PyQt开发公司达成一致,Qt官方(Nokia)确定自己Qt4开发Pyhton 绑定,采用LGPL授权。采用cmake构建。
  • 201x,因为Nokia 的 xxxx xxx xxxx 问题,Qt分批出售,同时Qt旗下的大批项目关停,PySide是其中之一。
  • 2015,PySide2 开始复活,开始从Qt4向Qt5移植(个人猜测,应该是Python越来越火的原因)
  • 2018,PySide2 正式发布。基于Qt5 ,官方名字 Qt for Python
  • 2020,PySide6 发布,版本号开始与 Qt6同步。

CMake

前面提到 CMake分为传统的cmake和现代cmake,但是中文资料似乎跟进很慢。所以:看资料,先看年份(不过,年份问题挡不住大家不加标注的来回转载 )。

尽管不喜欢CMake,在传统CMake时代,还是陆续记过一些笔记 cmake 学习笔记(一) ... cmake学习笔记(五)

这些cmake内容尽管放到现在仍然工作的很好,但是就像现在写C++98程序的一样,可以用,但新版本更简洁、易学。

作为本系列笔记的第一篇,只扯些闲篇。希望能有时间续写后面的内容...

本文有些内容我没有严格找资料考证,有错误之外,欢迎指正

参考

  • Why the KDE project switched to CMake -- and how (continued)
  • https://www.qt.io/blog/qt-and-cmake-the-past-the-present-and-the-future
  • http://blog.gerryyang.com/gcc/clang/2022/07/31/modern-cmake-in-action.html
  • https://www.qt.io/blog/qt-6-build-system
  • https://www.kdab.com/using-cmake-with-qt-5/
  • https://www.qt.io/blog/2009/10/12/to-make-or-not-to-make-qmake-and-beyond
  • https://www.qt.io/blog/2009/10/14/to-make-or-not-to-make-qmake-and-beyond-redux
  • https://steveire.wordpress.com/2017/11/05/embracing-modern-cmake/
  • https://devblogs.microsoft.com/cppblog/cmake-support-in-visual-studio/
  • 浅谈 qmake 之 pro、pri、prf、prl文件
  • qmake 乱乱乱谈(一)
  • https://www.qt.io/blog/2018/10/29/deprecation-of-qbs

Tools cmake, qt