在Linux中,典型的"./configure"命令做什么?

71

即使所有内容都已在makefile中指定,为什么还需要这样做?

3个回答

67

通常,运行配置脚本会执行以下操作:

  • 检查要安装软件的计算机的某些详细信息。此脚本在您的系统上检查许多依赖项。为了使特定软件正常工作,可能需要您的计算机上存在很多东西。 如果您的系统缺少任何重要要求,则配置脚本将退出,并且您无法继续安装,直到获取这些所需内容。

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


4
以前从不知道 makefile 是由 configure 创建的 :) - Mask
2
它还提供了一个界面来配置(恰当地)编译选项。./configure --help通常会给出可用选项列表。 - intuited

35

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


我注意到这些“configure”文件非常庞大,它们是手动编写的吗? - Mask
11
不,配置脚本是对指令的扩展(也使用m4语言),这些指令放在configure.ac(或在旧系统中的configure.in)文件中。运行autoconf将从configure.ac生成configure脚本,但有时需要修补宏库。当需要这样做时,运行aclocal,它将尝试验证所有宏都已正确定义(并可用于下一次autoconf执行)。 - Edwin Buck
我认识的每个人似乎都是在路上随便学会这些东西的,而没有正式学习过。它实际上在大学里教吗? - TrojanName
3
大学教授建筑系统所必要的核心思想,但通常是在不同的非建设上下文中进行教学。直到他们的建筑系统以某种方式失败之前,很少有人会考虑将它们应用于建筑系统。也就是说,有关建筑系统、幂等性、(依赖)映射、(平台)集合分析、验证(又称测试)等理论方面的知识是必要的。大多数人在选购工具时只关注工具本身,而把这些知识抛在脑后,这就像是只学会使用 MS Word 而不去学习写作技巧。 - Edwin Buck

7
一个配置脚本会从模板中构建Makefile,将一些东西替换进去,例如你想要安装代码的位置以及用于构建程序的(C、C ++、Fortran等)编译器所需的定义。理论上,这可以在一个步骤中完成,但由于可能有许多不同的配置,因此分阶段做会更容易。(例如,如果使用多核机器构建大型程序,则可能希望指定并行编译的数量,这与如何配置事物无关。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接