CMake 已经成为 C++ 构建工具事实上的标准了,即便觉得它很难用,但项目发布,跨部门协同,基本都以 cmake 为准。尽管你可能觉得其它构建工具更顺手,没问题,你们平时用就行,但项目发布或者跨团队协同时,你得同时用上 cmake 来标准化。
那么对于内部中小项目,非正式个人练手项目,或者非发布阶段的开发过程,是否也需要上 cmake 呢?还真不一定,一旦不用 cover 整个宇宙的构建需求,我们大可以找一个趁手的二号构建工具,满足平时使用。那么哪个二号构建工具值得推荐呢?
很多流行的构建工具,从 xmake 到 meson,恐怕都不适合,因为他们都试图同 cmake 去竞争试图要 cover 整个宇宙,即便号称精简,也不可能精简到哪里,尽管他们最简单的 demo 看起来好像真的超简单,但再稍微复杂点,比如考虑多平台架构,加个 release/debug 和包管理,一个个都变得丑陋不堪,立马原型毕露,因为他们都是命令式的。
我从 2009 年开发了一个叫做 emake 的构建工具,就是一个 emake.py 的单一脚本,持续使用并陆陆续续迭代了 15 年,今天感觉可以让他出来走两步。
推荐它,因为它有可能是你见过最简单的构建工具了,简单到什么程度呢?
第一:定义式构建工具
简单点例子:main.mak 就三行:
flag: -Wall, -O3
mode: exe
src: foo.c, bar.c, main.c
第一行设定编译参数,第二行指明目标格式,第三行设定源代码,这也是大部分时候写点小玩具,小测试的样子,然后:
emake main.mak
就能生成 main.exe
了,定义式的意思就是不像 cmake
一样每次要在 CMakeLists.txt
里写个小程序,而是跟 IDE 一样定义好源文件,设定好 release/debug 的编译参数,然后 emake 帮你做好默认工具链初始化,依赖分析,多核编译等等一堆琐事。
而且还没有 cmake 的 rm -rf build && mkdir build && cmake -B build -G "MinGW Makefiles" .
初始化环节,这个初始化每次都很蛋疼,极大的阻碍了我创建新项目的热情。更不用在 build 目录生成一大堆 shit,写好 emake 工程文件就能直接编译出可执行了,没有任何第二层构建工具的依赖。
也不会每个项目像 cmake 一样单独占用一个目录,我一堆小项目全部放一个目录里都没事情。到这里你可能会说,好像也没比 xmake 简单多少啊?别急我们还能继续简化。
第二:零工程文件
如果你连工程文件都懒得写,没关系,emake 支持以 docstring 的形式将工程配置写到代码中:
#include <stdio.h>
//! flag: -Wall, -O3
//! src: foo.c, bar.c
int