Autotools 是一场灾难。
生成的./configure 脚本会检查过去 20 年左右没有出现在任何 Unix 系统上的功能。为此,它需要花费大量时间。
运行./configure 需要很长时间。尽管现代服务器 CPU 甚至可以有几十个内核,并且每台服务器可能有多个这样的 CPU,但./configure 是单线程的。我们仍然有足够的摩尔定律剩余时间,CPU 内核的数量将随着时间的推移而增加。因此,./configure 所花费的时间将大致保持不变,而由于摩尔定律,并行构建时间每 2 年减少 2 倍。或者实际上,我想说./configure 所花费的时间甚至可能会增加,因为利用改进的硬件来增加软件复杂性。
仅在项目中添加一个文件就需要运行automake、autoconf 和./configure,这将需要很长时间,然后您可能会发现,由于一些重要文件已更改,因此一切都已更改将被重新编译。因此,只需添加一个文件,make -j${CPUCOUNT} 就会重新编译所有内容。
关于make -j${CPUCOUNT}。生成的构建系统是一个递归的。 Recursive make has for a long amount of time been considered harmful.
那么当你安装已经编译好的软件时,你会发现它不起作用。 (想要证明吗?从 Github 克隆 protobuf 存储库,查看提交 9f80df026933901883da1d556b38292e14836612,将其安装到 Debian 或 Ubuntu 系统,然后嘿:protoc: error while loading shared libraries: libprotoc.so.15: cannot open shared object file: No such file or directory——因为它位于 /usr/local/lib 而不是 /usr/lib;解决方法是在输入make之前执行export LD_RUN_PATH=/usr/local/lib)。
理论上,通过使用autotools,您可以创建一个可以在Linux、FreeBSD、NetBSD、OpenBSD、DragonflyBSD和其他操作系统上编译的软件包。事实?每个从源代码构建软件包的非 Linux 系统在其存储库中都有许多补丁文件来解决 autotools 错误。看看例如FreeBSD /usr/ports:它充满了补丁。因此,在每个项目的基础上为非 autotools 构建系统创建一个小补丁比在每个项目的基础上为 autotools 构建系统创建一个小补丁一样容易。或者甚至更简单,因为标准 make 比 autotools 更容易使用。
事实是,如果您根据标准 make 创建自己的构建系统(并使其具有包容性而不是递归,遵循“递归使被认为有害”论文的建议),事情会以更好的方式工作.此外,如果您的项目是 10-100 个 C 语言文件的非常小的项目,并且每个 CPU 有几十个内核和多个 CPU,那么您的构建时间可能会减少一个数量级,甚至可能减少两个数量级。将自定义自动代码生成工具与基于标准 make 的自定义构建系统连接起来也更容易,而不是处理 m4 的自动工具混乱。使用标准的make,您至少可以在Makefile 中键入一个shell 命令。
那么,回答您的问题:为什么要使用自动工具?答:没有理由这样做。自从商业 Unix 过时以来,Autotools 就已经过时了。多核 CPU 的出现使自动工具更加过时。为什么程序员还没有意识到这一点,这是一个谜。我很乐意在我的构建系统上使用标准的make,谢谢。是的,生成 C 语言头包含的依赖文件需要一些工作量,但是由于不必与 autotools 斗争而节省了工作量。