典型的./configure在Linux中有什么作用?
为什么有必要尽pipe在makefile中指定了一切?
通常运行时的configuration脚本将会:
-
检查有关将要安装软件的机器的一些细节。 这个脚本检查你系统上的很多依赖项。 为了使特定的软件正常工作,可能已经需要很多东西存在于您的机器上。 如果您的系统上缺less任何主要需求,configuration脚本将会
exit
,您将无法继续进行安装,除非您得到所需的东西。 -
创build要在下一步中使用的
Makefile
。
它运行一个脚本,通常会生成makefile和“configure.h”。
脚本是用macros语言朗读的“m4”编写的。 最高级别的macros可以在autoconf.ac或(在旧系统中)autoconf.in中find。 这些扩展包含较低级别的macros,然后扩展为实际的testing,创build小程序或任务来检查你有什么样的系统。
例如AC_CHECK_HEADER([myheader.h],…)可能会生成一个小的C程序,如:
#include "myheader.h" int main(int argc, char** argv) { return 0; }
如果程序编译,检查被认为是“通过”,否则“失败”。 这种检查的状态通常会反映在config.h文件中。 在通过检查时,你可能在config.h中find一行,如下所示:
#define HAVE_MYHEADER_H 1
而在一个失败的testing上,它可能看起来像
#define HAVE_MYHEADER_H 0
当configuration为在AM_INIT_AUTOMAKEmacros中使用autoconf时,如果包含testing结果的variables被导出,Makefile也可以引用testing结果。 因此,如果所需的库位于几个不同的典型位置,或者使用标准工具(如tar,ar等)的“what works”的语法不同,或者首选工具不可用,则Makefile将仍然能够使用不同的库位置,不同的工具语法或不同的工具集来正确构build项目。
因此,当处理一个Autotools项目(configure / make / make install)时,Makefile实际上并不包含构build项目所需的所有东西,而是通过Makefile.in模板生成的,以便在键入“configure”时特别匹配您的系统。
一个configuration脚本从模板中build立Makefile,replace你想要安装代码的地方,以及用于构build程序的(C,C ++,Fortran,…)编译器需要什么定义。 从理论上讲,所有这一切都可以一步完成,只是有许多不同的configuration可能会更容易分阶段进行。 (例如,如果用可用的多核机器构build一个大型程序,则可能需要指定一定数量的并行编译,这不是configuration的考虑因素。)