【发布时间】:2011-02-01 12:59:54
【问题描述】:
尽管所有内容都在 makefile 中指定,为什么还是有必要?
【问题讨论】:
标签: linux build makefile configure
尽管所有内容都在 makefile 中指定,为什么还是有必要?
【问题讨论】:
标签: linux build makefile configure
它运行一个脚本,该脚本通常会生成 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 文件非常大,是手动编写的吗?
配置脚本从模板构建 Makefile,替换为您想要安装代码的位置以及用于构建程序的(C、C++、Fortran 等)编译器需要哪些定义.从理论上讲,这一切都可以一步完成,只是有许多不同的配置可能更容易分阶段完成。 (例如,如果使用可用的多核机器构建大型程序,您可能希望指定发生一定数量的并行编译,这与配置方式无关。)
【讨论】:
运行时的配置脚本通常会:
检查机器的一些细节
该软件将在其上
安装。该脚本检查
对您的系统有很多依赖项。
使特定软件工作
正确地,它可能需要很多
存在于你身上的东西
机器已经。如果您的系统缺少任何主要要求,则配置脚本将 exit 并且您无法继续安装,直到您获得这些必需的东西。
创建Makefile 以用于下一步。
【讨论】:
./configure --help 会(通常?)提供可用选项列表。