为什么有必要在 makefile 中指定所有内容?
3 回答
通常运行时的配置脚本将:
检查有关将要安装软件的机器的一些详细信息。该脚本检查系统上的大量依赖项。要使特定软件正常工作,可能需要您的机器上已经存在很多东西。如果您的系统上缺少任何主要要求,则配置脚本会
exit
并且您无法继续安装,直到您获得这些必需的东西。创建
Makefile
要在下一步中使用的 。
它运行一个脚本,该脚本通常会生成 makefile 和“configure.h”。
该脚本是用宏语言“m4”编写的。顶级宏位于 autoconf.ac 或(在旧系统中)autoconf.in 中。这些扩展包含较低级别的宏,这些宏又扩展为实际测试,这些测试创建小程序或任务来检查您拥有什么样的系统。
例如 AC_CHECK_HEADER([myheader.h], ...) 可能会生成一个小的 C 程序,如:
#include "myheader.h"
int main(int argc, char** argv) {
return 0;
}
如果程序编译,则认为检查“通过”,否则“失败”。此类检查的状态通常反映在 config.h 文件中。在通过检查时,您可能会在 config.h 中找到如下所示的一行:
#define HAVE_MYHEADER_H 1
在失败的测试中,它可能看起来像
#define HAVE_MYHEADER_H 0
当配置为使用 AM_INIT_AUTOMAKE 宏中的 autoconf 时,如果导出包含测试结果的变量,Makefile 还可以引用测试结果。因此,如果所需的库位于几个不同的典型位置,或者您的标准工具之一(如 tar、ar 等)的“有效”语法不同,或者首选工具不可用,则 Makefile 将为仍然能够使用不同的库位置、不同的工具语法或不同的工具集正确构建项目。
因此,在处理 Autotools 项目(configure / make / make install)时,Makefile 确实不包含构建项目所需的所有内容,它是从 Makefile.in 模板生成的,以便在您键入“configure”时专门匹配您的系统。
配置脚本从模板构建 Makefile,替换为您想要安装代码的位置以及用于构建程序的(C、C++、Fortran 等)编译器需要哪些定义。从理论上讲,这一切都可以一步完成,除了有许多不同的配置可能更容易分阶段完成。(例如,如果使用可用的多核机器构建大型程序,您可能希望指定发生一定数量的并行编译,这与配置方式无关。)