Automake 设置说明

来源:互联网 发布:淘宝上很火的安娜家 编辑:程序博客网 时间:2024/06/18 02:44

参考:http://www.gnu.org/software/automake/#documentation

本文中提到的章节及页码,请自行下载automake.pdf查看。

1. configure.ac 设置说明

让我们从configure.ac的内容开始吧。

AC_INIT([amhello], [1.0], [bug-automake@gnu.org])AM_INIT_AUTOMAKE([-Wall -Werror foreign])AC_PROG_CCAC_CONFIG_HEADERS([config.h])AC_CONFIG_FILES([Makefilesrc/Makefile])AC_OUTPUT
        此文件由autoconf(创建配置)和automake(创建各种Makefile.ins)读取。 它包含一系列M4宏,将扩展为shell代码,最终形成配置脚本。 我们不会详细说明这个文件的语法,因为Autoconf手册有关于它的整个部分(参见“Autoconf手册”中的“编写configure.ac”一节)。
        前缀为AC_的宏是Autoconf宏,记录在Autoconf手册中(参见“Autoconf手册”中的“Autoconf宏索引”)。 以AM_开头的宏是Automake宏,在本手册后面将会介绍(见第B.1节[宏指数],第166页)。

        configure.ac的前两行初始化Autoconf和Automake。 AC_INIT接收包的名称,其版本号和关于包的错误报告的联系人地址(该地址例如在./configure --help结尾处输出)。 当您将此设置适用于您自己的软件包时,请勿盲目复制Automake的地址:使用您的软件包的邮件列表或您自己的邮箱地址。

        AM_INIT_AUTOMAKE的参数是automake的选项列表(请参见第17章[选项],第118页)。 -Wall和-Werror要求automake打开所有警告并将其报告为错误。 我们在这里讲Automake的警告,比如Makefile.am中的可疑指令。 这与编译器的调用绝对无关,即使它可能支持类似名称的选项。 使用-Wall -Werror是开始在包上工作时的安全设置:您不想错过任何问题。 后来你可能会决定放松一下。 外部选项告诉Automake该包不会遵循GNU标准。 GNU软件包应该总是分发更多的文件,如ChangeLog,AUTHORS等。我们不希望automake在这个小例子中抱怨这些丢失的文件。

        AC_PROG_CC行使配置脚本搜索C编译器并使用其名称定义变量CC。 Automake生成的src / Makefile.in文件使用变量CC构建hello,所以当configure从src / Makefile.in创建src / Makefile时,它将使用它找到的值来定义CC。 如果Automake被要求创建一个使用CC的Makefile.in,但是configure.ac没有定义它,它会建议您添加一个到AC_PROG_CC的调用。

        AC_CONFIG_HEADERS([config.h])调用会导致configure脚本创建一个config.h文件,它们是由configure.ac中的其他宏定义的。 在我们的例子中,AC_INIT宏已经定义了其中的一些。 配置运行后,以下是config.h的摘录:

.../* Define to the address where bug reports for this package should be sent. */#define PACKAGE_BUGREPORT "bug-automake@gnu.org"/* Define to the full name and version of this package. */#define PACKAGE_STRING "amhello 1.0"...
        您可能注意到,src / main.c包含config.h,因此可以使用ACKAGE_STRING。 在一个真实世界的项目中,config.h可以变得非常大,每个功能在系统上都有一个“#define”。
        AC_CONFIG_FILES宏声明配置应该从* .in模板创建的文件列表。 Automake还扫描此列表以找到它必须处理的Makefile.am文件。 (这很重要,要记住:当向项目添加新目录时,应该将其Makefile添加到此列表中,否则Automake将永远不会处理您在该目录中写入的新Makefile.am。)

        最后,AC_OUTPUT行是一个关闭命令,实际上产生脚本的一部分,负责创建使用AC_CONFIG_HEADERSAC_CONFIG_FILES注册的文件。

        开始一个新项目时,我们建议您从这样一个简单的configure.ac开始,并逐渐添加其它需要的测试。 命令autoscan还可以建议您的软件包可能需要的几个测试(参见“Autoconf手册”中的“使用autoscan创建configure.ac”)。

2. Makefile.am 设置说明

        我们现在转到src / Makefile.am。 此文件包含用于构建和安装hello的Automake指令。

bin_PROGRAMS = hellohello_SOURCES = main.c
        Makefile.am具有与普通Makefile相同的语法。 当automake处理一个Makefile.am时,它会将整个文件复制到输出Makefile.in中(后来将通过configure转换为Makefile),但会通过生成一些构建规则和其他变量来响应某些变量定义。 通常,Makefile.ams只包含上述变量定义的列表,但是它们也可以包含其他可以在没有解释的情况下传递的变量和规则定义。
        以_PROGRAMS结尾的变量是列出生成的Makefile应该构建的程序的特殊变量。 在Automake说话时,这个_PROGRAMS后缀叫做主; Automake可识别与不同类型文件对应的其他原色,如_SCRIPTS,_DATA,_LIBRARIES等。

        bin_PROGRAMS的“bin”部分告诉automake所生成的程序应该安装在bindir中。 回想一下,GNU构建系统使用一组变量来表示目标目录,并允许用户自定义这些位置(请参见第2.2.3节[标准目录变量],第4页)。 任何这样的目录变量可以放在一个主要的前面(省略dir后缀)来告诉automake在哪里安装列出的文件。

        程序需要从源文件构建,因此对于_PROGRAMS变量中列出的每个程序,automake将会根据另一个名为prog_SOURCES的变量查找,列出其源文件。 可能有多个源文件:它们都将被编译并链接在一起。
        Automake还知道在创建tarball时需要分发源文件(与构建的程序不同)。 所以这个hello_SOURCES声明的副作用是main.c将是由make dist创建的tarball的一部分。
        最后,这里有一些关于顶级Makefile.am的解释。

SUBDIRS = srcdist_doc_DATA = README
        SUBDIRS是一个特殊变量,列出在处理当前目录之前应该递归的所有目录。 所以这一行是负责构建src / hello,即使我们从顶层运行它。 在安装README之前,此行还会导致make install安装src / hello(不是这个顺序很重要)。
        行dist_doc_DATA = README导致README被分发并安装在docdir中。 使用_DATA主文件列出的文件不会自动使用make dist构建的tarball的一部分,因此我们添加dist_前缀,以便它们分发。 但是,对于README来说,这不是必要的:automake自动分配它遇到的任何README文件(自动分发的其他文件的列表由automake --help提供)。 因此,第二行的唯一重要作用是在安装过程中安装README。

        此示例中未涉及的一件事是从程序代码访问安装目录值(请参见第2.2.3节[标准目录变量],第4页),即将其转换为定义的宏。 为此,请参阅“Autoconf手册”中的“定义目录”一节。