典型的 ./configure 在 Linux 中做了啥?
Posted
技术标签:
【中文标题】典型的 ./configure 在 Linux 中做了啥?【英文标题】:What does a typical ./configure do in Linux?典型的 ./configure 在 Linux 中做了什么? 【发布时间】:2011-02-01 12:59:54 【问题描述】:尽管所有内容都在 makefile 中指定,为什么还是有必要?
【问题讨论】:
【参考方案1】:它运行一个脚本,该脚本通常会生成 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 项目(配置/制作/制作安装)时,Makefile 确实不包含构建项目所需的所有内容,它是从 Makefile.in 模板生成的,以在您键入“configure”时专门匹配您的系统”。
【讨论】:
我注意到这些configure
文件非常大,是手动编写的吗?
不,configure 脚本是对 configure.ac(或旧系统 configure.in)文件中指令的扩展(也使用 m4 语言)。运行 autoconf 将从 configure.ac 生成配置脚本,但有时您需要修补宏库。当你需要这样做时,运行 aclocal,它会尝试验证所有的宏都被正确定义(并且可用于下一次 autoconf 执行)。
我认识的每个人似乎都只是在没有正式学习的情况下一路捡起这些东西。它实际上是在大学里教授的吗?
大学里教授必要的核心思想,但是,它们是在不同的非构建环境中教授的。通常很少有人会想到将它们应用于构建系统,直到他们的构建系统开始以某种方式失败。也就是说,学习构建系统、幂等性、(依赖)映射、(平台)集分析、验证(又名测试)等背后的理论。大多数人在购买工具时将这些知识留在门口,然后他们唯一关心的事情。这类似于学习如何使用 MS Word 而不是学习写作。【参考方案2】:
配置脚本从模板构建 Makefile,替换为您想要安装代码的位置以及用于构建程序的(C、C++、Fortran 等)编译器需要哪些定义.从理论上讲,这一切都可以一步完成,只是有许多不同的配置可能更容易分阶段完成。 (例如,如果使用可用的多核机器构建大型程序,您可能希望指定发生一定数量的并行编译,这与配置方式无关。)
【讨论】:
【参考方案3】:运行时的配置脚本通常会:
检查机器的一些细节
该软件将在其上
安装。该脚本检查
对您的系统有很多依赖项。
使特定软件工作
正确地,它可能需要很多
存在于你身上的东西
机器已经。如果您的系统缺少任何主要要求,则配置脚本将 exit
并且您无法继续安装,直到您获得这些必需的东西。
创建Makefile
以用于下一步。
【讨论】:
以前从不知道 makefile 是由 configure 创建的:) 它还提供了一个接口来配置(恰当地)编译选项。./configure --help
会(通常?)提供可用选项列表。以上是关于典型的 ./configure 在 Linux 中做了啥?的主要内容,如果未能解决你的问题,请参考以下文章
freeMarker——程序开发指南之配置(Configuration)