4.初始化和输出文件

4.1 初始化 configure

AC_INIT (package, version, [bug-report], [tarname], [url])

第一个要执行的宏。设置程序名、版本号、联系方式...。他们都应该是静态的参数,不能是shell参数、引用或者新行,但是可以通过m4计算出来。

AC_INIT([vdsm],
        [m4_esyscmd([build-aux/pkg-version --version])],
        [vdsm-devel@lists.fedorahosted.org])

4.2 解决Autoconf的版本

选择最低的Autoconf的版本确保可以成功的编译configure.ac

AC_PREREQ (version)

要求Autoconf的最低版本,如果不满足则报错并退出。必须在AC_INIT之前定义。

AC_PREREQ([2.69])

4.4 找到 configure 的输入

AC_CONFIG_SRCDIR (unique-file-in-source-dir)

unique-file-in-source-dir是包的源码目录下的某些文件。configure检查这些文件确保目录包含源码。

AC_CONFIG_AUX_DIR (dir)

辅助构建工具(e.g., install-sh, config.sub, config.guess, Cygnus configure, Automake and Libtool scripts, etc.)所在的目录。dir可以是srcdir的绝对或相对路径,通常命名为build-aux

AC_CONFIG_AUX_DIR([build-aux])

AC_REQUIRE_AUX_FILE (file)

声明file必须在上述定义的文件夹中必须存在。

AC_REQUIRE_AUX_FILE([tap-driver.sh])

AC_CONFIG_MACRO_DIR (dir)

指定dir作为额外的Autoconf宏的定位。

note:如果在Automake中使用aclocal生成aclocal.m4文件,必须在顶级的Makefile.am文件中设置ACLOCAL_AMFLAGS = -I dir

4.5 输出文件

AC_OUTPUT ([file]..., [extra-cmds], [init-cmds])

不推荐使用这个废弃的接口,用以下三个宏代替:

      AC_CONFIG_FILES(file...)
      AC_CONFIG_COMMANDS([default],
                         extra-cmds, init-cmds)
      AC_OUTPUT

AC_OUTPUT

生成config.status并启动它。configure.ac应该以调用此宏结束。 config.status执行所有的配置动作:所有的输出文件、头文件、命令、链接、要配置的子目录

AC_PROG_MAKE_SET

如果Make命令、$MAKE被设置或者其他make,预定义了$(MAKE),定义输出变量SET_MAKE将是空值。否则将SET_MAKE定义为设置$(MAKE)的宏定义。

4.6 执行配置动作

configure实际上还有一个隐藏的子文件config.status。configure检查系统,config.status基于检查的结果执行相应的操作。

4.7 创建配置文件

AC_CONFIG_FILES (file..., [cmds], [init-cmds])

AC_OUTPUT通过复制输入文件(默认是file.in文件)并代替里面的变量的值来创建每一个file。通常用于生成Makefile,但也可以指定其它文件。

      AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
      AC_CONFIG_FILES([autoconf], [chmod +x autoconf])

冒号分隔指定输入文件:

      AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
                      [lib/Makefile:boiler/lib.mk])

4.8 Makefile中的替换

被替换到输出文件的变量称作output variables

4.8.1 预置输出变量

  • CFLAGS - C编译器的调试和优化选项。
  • builddir - 等于.
  • abs_builddir - builddir的绝对名称。
  • top_builddir - 当前目录相对于顶级目录的相对路径。在顶级目录与builddir相等。
  • top_build_prefix - 当前目录相对于顶级目录的相对路径,带有/如果不为空。帮助make在顶级构建目录区别对待./filefile
  • abs_top_builddir - top_builddir的绝对名称。
  • srcdir - 对于makefile包含了源码的目录。
  • abs_srcdir - srcdir的绝对名称。
  • top_srcdir - 对于package包含了源码的顶级目录。在顶级目录的的configure.ac中没有用处,是空值!!!;在子目录的configure.ac和Makefile.am中才能发挥作用。
  • abs_top_srcdir - 对于package包含了源码的顶级目录的绝对名称。 更多说明请参考Preset Output Variables

4.8.2 安装目录变量

后缀/被删除,例如${prefix}/lib

  • bindir - 可执行文件的安装目录。
  • datadir - 安装特殊的只读、架构依赖的数据文件目录。
  • datarootdir - 只读架构依赖数据文件的根目录。通常是/usr/local/share,但是写作$(prefix)/share(如果使用Autoconf,写作@datarootdir@,其余变量同理)。
  • docdir - 文档文件。
  • exec_prefix - 架构依赖文件的安装前缀。默认情况下与prefix相同。
  • includedir - 安装C的头文件
  • infodir - Info格式的文档
  • libdir - 对象代码库文件
  • libexecdir - 其它程序运行的可执行文件
  • mandir - man格式文档的安装顶级目录
  • prefix - 所有文件的安装前缀。
  • sbindir - 系统administrators运行的可运行文件的安装目录。 更加详细的说明参考Variables for Installation Directories

4.9 配置头文件

AC_CONFIG_HEADERS (header ..., [cmds], [init-cmds])

AC_OUTPUT创建一个头文件,该文件列出一系列的#define声明;赋值DEFS=-DHAVE_CONFIG_H。通常头文件header的名字是config.h

一般输入源是header.in,可以采用冒号分隔符来指定输入来源。

AC_CONFIG_HEADERS([config.h:config.hin])

4.10 运行任意配置命令

AC_CONFIG_COMMANDS (tag..., [cmds], [init-cmds])

config.status结束的时候执行额外的命令。 下面两个类似的宏是由configure执行的,不能使用config.status来重新运行它们。

AC_CONFIG_COMMANDS_PRE (cmds)

创建config.status之前执行。

AC_CONFIG_COMMANDS_POST (cmds)

创建config.status之后执行。