0%

autoconf-and-automake

automake 生成 Makefile 文件所需的工具: GUN AutomakeGNU AutoconfGNU m4PERLGNU Libtool
automake 生成 Makefile 文件所需的文件:需要编译的 源文件configure.ac 或者 configure.inMakefile.am

  • 运行 autoscan 命令
  • 然后手动修改 configure.scanconfigure.in 有的平台为 configure.ac
  • 修改 configure.in 里面的内容。
  • autoheader(可选,生成 config.h.in)
  • 运行 aclocal 命令,生成 aclocal.m4 文件
  • 运行 autoconf 命令,生成 configure 文件
  • 手动写 makefile.am
  • 执行 automake –a 将 makefile.am 生成 Makefile.in 同时生成选项可以补齐文件 config.guess,config.sub,install-sh,missing,depcomp
  • 运行./confiugre 脚本

configure

configure 脚本为了让一个程序能够在各种不同类型的机器上运行而设计的。在使用 make 编译源代码之前,configure 会根据自己所依赖的库而在目标机器上进行匹配。

约定俗成的,所有的 configure 脚本都把脚本文件名起为 configure,一般来讲都是 shell 脚本,根据所在的系统环境生成 makefile 文件。有时候看到一些程序的 configure 内容超级之多,让人难以看下去。

configure 脚本运行时扫描当前环境,生成一个名为 config.status 的子脚本。子脚本将 Makefile.in 文件转换为适应于当前系统环境的 Makefile 文件。

automake

autoMake

autoscan

autoscan 是用来扫描源代码目录生成 configure.scan 文件的.autoscan 可以用目录名做为参数,但如果你不使用参数的话,那么 autoscan 将认为使用的是当前目录.autoscan 将扫描你所指定目录中的源文件,并创建 configure.scan 文件。

过程:源代码文件 –>autoscan–>configure.scan–>configure.ac(或 configure.in)

configure.scan

configure.scan 包含了系统配置的 基本选项,里面都是 一些宏定义。我们需要将它改名为 configure.in

aclocal

aclocal 是 一个 perl 脚本程序.aclocal 根据 configure.in 文件的 内容,自动生成 aclocal.m4 文件.aclocal 的定义是 :aclocal -create aclocal.m4 by scanning configure.ac.

过程:configure.ac、acinclude.m4(可选)、用户宏文件(可选)–>aclocal–>aclocal.m4

autoheader

用于生成一个 configure 的模版头文件 config.h.in

通过扫描 configure.ac(或 configure.in),根据其中的某些宏(比如 cpp 宏定义)产生宏定义的模板文件 config.h.in,configure 脚本可以用这个文件生成一个由”#define”语句构成的宏定义文件 config.h。

当我们的程序要使用一些与平台相关的库时,由于在不同的平台上同样功能的库名字、函数、头文件的不同等,为了使程序具有可移植性,我们经常会在程序中使用一大堆的#ifdef 或#ifndef 预编译指令,这样非常地不方便。而 autoheader 就是解决这个问题的,在它生成的模板文件 config.h.in 中,为这些库、函数、头文件等定义了#undef 宏标志,configure 脚本把它转换成 config.h 后,就会变成#define 宏标志,用作这些库、函数、头文件的保护符。这样,你可以在程序里包含这个 config.h,然后使用其中的某些定义好的常量。

过程:configure.ac、aclocal.m4(可选)–>autoheader–>config.h.in

autoconf

autoconf 是用来产生 configure 文件的 .configure 是 一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的 系统来产生合适的 Makefile, 从而可以使你的源代码能在不同的操作系统平台上被编译出来。
configure.in 文件的内容是 一些宏,这些宏经过 autoconf 处理后会变成检查系统特性。环境变量。软件必须的参数的 shell 脚本.configure.in 文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上 AC_INIT 宏和 AC_OUTPUT 宏。
我们在使用 automake 时,实际上还需要用到其他的一些宏,但我们可以用 aclocal 来帮我们自动产生。执行 aclocal 后我们会得到 aclocal.m4 文件。
产生了 configure.in 和 aclocal.m4 两个宏文件后,我们就可以使用 autoconf 来产生 configure 文件了。

过程:configure.ac、aclocal.m4(可选)、config.h.in(可选)–>autoconf–>configure

Makefile.am

Makefile.am 是用来生成 Makefile.in 的,需要你手工书写.Makefile.am 中定义了一些内容

Makefile.am 是一种比 Makefile 更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成

automake

我们使用 automake –add-missing 来产生 Makefile.in.
选项 –add-missing 的 定义是 “add missing standard files to package”, 它会让 automake 加入一个标准的软件包所必须的一些文件。
我们用 automake 产生出来的 Makefile.in 文件是 符合 GNU Makefile 惯例的 , 接下来我们只要执行 configure 这个 shell 脚本就可以产生合适的 Makefile 文件了。

选要自己写一个 Makefile.am 文件,然后 automake 根据 configure.ac 和 Makefile.am 中定义的结构,生成 Makefile.in 文件。如果在 configure.ac 中定义了一些特殊的宏,比如 AC_PROG_LIBTOOL,它会调用 libtoolize 并产生 config.guess、config.sub、ltmain.sh 等文件。

automake 提供了三种软件等级 foreign、gnu 和 gnits,让用户选择采用,默认等级为 gnu。使用 gnu 等级时,automake 还要求你必须有一些额外的文件,它们是 install-sh、missing、depcomp、INSTALL、NEWS、 README、AUTHORS、ChangeLog、COPYING 共 9 个文件,它们是一个符合 GNU 规范的代码文件结构所必须的文件。automake 可以通过附加 –add-missing 参数(或 -a)自动生成其中的一些文件(install-sh、missing、depcomp、INSTALL、COPYING),剩下的 NEWS、README、AUTHORS、ChangeLog 要自己创建。

config.guess:GNU 构建系统区分三类机器,运行构建用的编译器的“构建”机器、运行构建的软件包的“主机”机器、编译器用来产生代码的“目标”机器。这个脚本用来猜测“构建”机器的类型,并输出脚本所运行的系统的配置名 (configure name)。

config.sub:使配置名规范化。

过程:Makefile.am、configure.ac–>automake(-a)–>Makefile.in、install-sh、missing、depcomp、INSTALL、COPYING。若调用了 libtoolize,则另外产生的还有 config.guess、config.sub、ltmain.sh 等。

./configure

configure 脚本会收集系统的信息,创建 config.status(这个文件可用来重新创建 configure 脚本),使用 Makefile.in 来创建 Makefile 文件,使用 config.h.in(如果有的话)来创建 config.h 文件,并生成一个日志文件 config.log(记录一些创建时的调试信息等),ltmain.sh 会产生 libtool 文件,有时还会产生文件 config.cache,stamp-h1(config.h 的时间戳文件)等。这样就完成了 Makefile 文件的制作,并且常常具有以下的功能:make、make install、make uninstall、make clean、make distclean、make dist。

libtool

提供一种标准的方法来创建静态库或共享库。它把特定于平台的库的产生过程的复杂性隐藏在一个统一的接口后面,这个接口通过 libtool 被所有的平台支持。

过程:Makefile.in、config.h.in–>configure–>config.status、Makefile、config.h

Ref

  1. autoconf 和 automake 流程
  2. 例解 autoconf 和 automake 生成 Makefile 文件
  3. automake 的理解和实践总结
  4. AutoMake 相关流程介绍
  5. 使用 autotools 生成 Makefile 学习笔记
  6. 理解 configure 脚本
  7. GNU Autotools 的研究
  8. configure 原理