70

为什么有必要在 makefile 中指定所有内容?

4

3 回答 3

66

通常运行时的配置脚本将:

  • 检查有关将要安装软件的机器的一些详细信息。该脚本检查系统上的大量依赖项。要使特定软件正常工作,可能需要您的机器上已经存在很多东西。如果您的系统上缺少任何主要要求,则配置脚本会exit并且您无法继续安装,直到您获得这些必需的东西。

  • 创建Makefile要在下一步中使用的 。

于 2010-03-27T14:16:30.647 回答
34

它运行一个脚本,该脚本通常会生成 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”时专门匹配您的系统。

于 2010-03-27T14:36:54.823 回答
7

配置脚本从模板构建 Makefile,替换为您想要安装代码的位置以及用于构建程序的(C、C++、Fortran 等)编译器需要哪些定义。从理论上讲,这一切都可以一步完成,除了有许多不同的配置可能更容易分阶段完成。(例如,如果使用可用的多核机器构建大型程序,您可能希望指定发生一定数量的并行编译,这与配置方式无关。)

于 2010-03-27T14:20:39.383 回答