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