Autoconf是一个用于生成shell脚本的工具,可以自动配置软件源代码以适应多种类似POSIX的系统。为了让你的软件包在所有的不同系统上都可以进行编译。

GNU 构建系统

Autoconf解决了系统特使构建和运行时信息的难题,但在软件开发时还有更多的难题,GNU构建系统是为了更好的开发软件而开发的一套完整的公益事业。
主要组成部分有AutoconfAutomakeLibtool

Automake

为了兼容各个系统的make使用。
从Makefile.am文件和Autoconf一起生成Makefile.in文件。

Gnulib

这是GNU代码的中央仓库,目的是共享免费的软件包。它的共享是源码级别的,只需要从上面直接拉取到自己的源码树。

Libtool

生产动态的共享库是非常困难的事情,每个系统都有自己的编译工具、编译标志、etc.。
Libtool会处理所有的共享库请求。需要共享库的时候会自Libtool会自动地被使用,无需知晓其语法规则。

制作configure脚本

下面的图表演示了如何生成可在configure中使用的文件:

后缀*代表执行过程,[]代表可选项

  • 只使用Autoconf
     your source files --> [autoscan*] --> [configure.scan] --> configure.ac

     configure.ac --.
                    |   .------> autoconf* -----> configure
     [aclocal.m4] --+---+
                    |   `-----> [autoheader*] --> [config.h.in]
     [acsite.m4] ---'

     Makefile.in

使用Automake:

     [acinclude.m4] --.
                      |
     [local macros] --+--> aclocal* --> aclocal.m4
                      |
     configure.ac ----'
     
     configure.ac --.
                    +--> automake* --> Makefile.in
     Makefile.am ---'

配置一个软件包时如何使用文件:

                            .-------------> [config.cache]
     configure* ------------+-------------> config.log
                            |
     [config.h.in] -.       v            .-> [config.h] -.
                    +--> config.status* -+               +--> make*
     Makefile.in ---'                    `-> Makefile ---'

编写configure.ac

configure.ac包含了Autoconf的宏调用,用于测试程序包需要的或可以使用的系统功能。

autoscan可以是良好的开端。

shell脚本编译器

autoconf是为了产生可移植的shell脚本–configure的编译器。

Autoconf语言

原文:Autoconf-Language

引用符号是[],强烈建议对所有包含 宏名、逗号、括号、前导空格、换行符 的参数都加上引用符号。
参数中的任何前导空格和新的行都会被忽视,除非被引用。
详细引用规则

  • 当在宏参中使用相同的文本时,必须有一个额外的引用级别,并且对重复的部分或者整体进行双重的符号引用。
已经在文本中引用了AC_DC:[echo "Hard rock was here!  --AC_DC"]
宏参中引用时:AC_MSG_WARN([[AC_DC] stinks  --Iron Maiden])

引用宏的黄金法则是每扩展一次宏,就去除一次引用。whenever you expect macro expansion, expect quote expansion; i.e., expect one level of quotes to be lost.

描述不能被引用两次。

注释以#开头

note:引用变量:如果是宏赋值的变量,则可直接$xxx,如果是shell变量则需要${xxx}。如果赋值与引用都在一段shell脚本里面,那么可直接引用$xxx

标准configure.ac布局

按照推荐顺序来调用宏:

 AC_INIT(package, version, bug-report-address)
 information on the package
 checks for programs
 checks for libraries
 checks for header files
 checks for types
 checks for structures
 checks for compiler characteristics
 checks for library functions
 checks for system services
 AC_CONFIG_FILES([file...])
 AC_OUTPUT

使用autoscan插件生成configure.ac

autoscan检查在目录下的源文件。

生成configure.scan文件之后需要检查修改才能将其重命名为configure.ac

使用ifnames列出条件语句

ifnames打印所有给定的C源文件中的#if, #elif, #ifdef, or #ifndef出现在执行文件中的标识符排序列表

使用autoconf创建configure

无参运行autoconf从configure.ac创建configure。
autoconf processes configure.ac with the M4 macro processor, using the Autoconf macros.

如果加了参数,那么它从那个文件中读取并输出配置脚本到标准输出;如果加了参数-,它从标准输读取然后输出到标准输出。

Autoconf宏被定义在多个文件里面。先找跟随Autoconf一起发布的文件中的宏,再在含有发布的Autoconf宏文件的文件夹中找可选文件[acsite.m4]中的宏,然后在当前文件夹中找[aclocal.m4]的宏。后定义的宏会覆盖之前定义的宏。

建议使用–trace选项来检查configure.ac文件。

使用autoreconf更新configure脚本

autoreconf 重复运行 autoconf, autoheader, aclocal, automake, libtoolize, and autopoint (when appropriate) 在特殊目录及其子目录下更新GNU构建系统。默认只更新老的文件。不会传递–autoconf-dir=dir 或 --localdir=dir。