主要参考链接:
第2篇原理讲的较多,
但是里面有点错误,按照它的流程一步一步实现是不行的。
第1篇提供了示例代码,这里就以这个示例代码为例,顺便做个记号。
Automake看上去就是可以自动生成Makefile的东东,实际上这个过程需要多个工具的配合,
这些工具集称为Autotools.
包括autoconf/automake/m4/perl/libtool(其中libtool非必须)。
所以如果系统上没装就先装好了。
至于这些工具的关系,参见[2]以及
GNU Automake手册。应用Automake的最终目标是实现编译安装时./configure --prefix=... 以及make ,make install等几个命令就能搞定的目标。
这个流程图是从[2]拿过来的,
实际上这个图少了个步骤,就是这个步骤导致按照整个流程走的话会提示错误。根据这个错误我们可以知道是缺少了config.h.in这个文件,这是个模板文件,我们可以用autoheader自动生成,然后作为configure.in必需的文件。在写好configure.in之后要运行autoheader,由于[2]里面的示例代码不能下载,这里就以[1]作为示例,以下内容主要翻译自[1],加上一点点注解而已。
我们需要的两个重要文件是configure.ac和Makefile.am,configure.ac可以通过欺骗autoscan,直接运行autoscan生成configure.scan然后改成configure.ac并修改内容。
Makefile.am需要自己编写。
关于configure.ac文件
autoconf会查找一个叫configure.ac(或者configure.in,兼容以前的版本),并使用M4这个宏处理器创建configure脚本。
每个configure.ac文件的内容组织都是相似的,一般都包含了如下的内容:
AC_INIT([Hello], [0.1], [bug-report@hello.example.com], [hello], [http://hello.example.com/])
AC_PREREQ([2.59])
AM_INIT_AUTOMAKE([1.10 no-define])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CXX
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
AC_INIT 宏提供项目信息给autoconf,如上所示,依次包括了项目名称、版本号、bug报告地址、tarball名称和项目主页。
AM_INIT_AUTOMAKE增加对automake的初始化和检查。
AC_PROG_CXX检查C++编译器,如果项目使用C语言,则可以用AC_PROG_CC检查。
AC_CONFIG_FILES列出了configure将要产生的文件,默认情况下,每个文件是从对应的模板文件(一般其后缀是.in)生成的,比如Makefile由configure处理Makefile.in生成的。
AC_CONFIG_HEADERS[config.h]指示使用config.h文件,autoconf需要一个config.h.in文件来生成config.h,这个头文件会被包含在源代码里面。
config.h.in这个模板文件也可以用autoheader工具自动生成,如果configure.ac里面使用了AC_CONFIG_HEADERS,那么当你使用autoreconf命令时它会自动调用autoheader,实际上使用autoreconf可以省去了流程图中的大部分流程。
注意automake默认是生成符合GNU风格的项目,GNU项目中要求带有一些信息文件,如果缺乏的话automake会报错,这些信息文件是NEWS,README,AUTHORS,ChangeLog,如果想遵循默认规则,就先自己创建这几个空文件,否则只要在AM_INIT_AUTOMAKE加上foreign即可,如下:
AM_INIT_AUTOMAKE([1.10 no-define foreign])
关于Makefile.am文件
automake以Makefile.am文件作为输入,根据在里面找到的宏生成Makefile.in文件,这个文件将由configure使用并生成Makefile文件。
在Makefile.am里面添加以下两行:
bin_PROGRAMS=hello
hello_SOURCES=hello.h hello.cc main.cc
可以看到这两行有衔接关系,bin_PROGRAMS指示了要生成的程序名,而这个程序的生成需要的源文件就是hello.h hello.cc main.cc等,实际上bin_PROGRAMS的"bin"也引用了预定义的变量bindir,它代表了可执行程序所在目录。
注意我们需要自己准备的文件只有两个configure.ac和Makefile.am,写好之后,只需要执行以下命令,就可以实现编译安装了。
touch NEWS README AUTHORS ChangeLog
提供几个GNU风格项目的信息文件(可以不要,但需要改下配置)
autoreconf --force --install
这个步骤是按序运行aclocal,autoconf,autoheader,automake以生成config.h.in,Makefile.in,configure脚本以及其他辅助文件。
./configure
从Makefile.in中生成Makefile文件,从config.h.in生成config.h文件。
make
示例给出的项目文件组织:
helloworld_cc
autogen.sh
configure.ac
Makefile.am
src
helloworld.h
helloworld.cc
main.cc
foofiles
foo.h
foo.cc
configure.ac内容
AC_INIT([Helloworld C++], [0.5], [bug-report@hello.example.com],
[helloworld_cc], [http://hello.example.com/])
AC_PREREQ([2.59])
AM_INIT_AUTOMAKE([1.10 -Wall no-define])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CXX
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.am
AUTOMAKE_OPTIONS = subdir-objects
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
bin_PROGRAMS = hello
hello_SOURCES = src/hello.h src/hello.cc src/main.cc \
src/foo/foo.h src/foo/foo.cc
dist_noinst_SCRIPTS = autogen.sh
项目文件下载地址:
http://www.openismus.com/documents/linux/automake/helloworld_cc-0.5.tar.gz