转自:http://blog.chinaunix.net/uid-9105154-id-2009272.html

本文中使用的实例仍为《手动建立makefile简单实例解析》中的5文件工程实例。

对于一个较大的项目而言,完全手动建立Makefile是一件费力而又容易出错的工作。autotools系列工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以比较轻松地生成Makefile了。现在Linux上的软件开发一般都是用autotools来制作Makefile。

autotools工具主要有:aclocal、autoscan、autoconf、autoheader、automake。使用autotools主要就是利用各个工具的脚本文件来生成最后的Makefile。下面结合实例来介绍具体的流程。

第一步 autoscan

使用autoscan在给定目录及其子目录树中检查源文件,如果没有给出目录,就在当前目录及其子目录树中进行检查。最终生成两个文件:configure.scan、autoscan.log

使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools-easy]$ tree
使用autotools建立Makefile简单实例解析 _autotools.
使用autotools建立Makefile简单实例解析 _autotools
|-- main.c
使用autotools建立Makefile简单实例解析 _autotools
|-- mytool1.c
使用autotools建立Makefile简单实例解析 _autotools
|-- mytool1.h
使用autotools建立Makefile简单实例解析 _autotools
|-- mytool2.c
使用autotools建立Makefile简单实例解析 _autotools`
-- mytool2.h
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools
0 directories, 5 files
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ autoscan
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ tree
使用autotools建立Makefile简单实例解析 _autotools.
使用autotools建立Makefile简单实例解析 _autotools
|-- autoscan.log
使用autotools建立Makefile简单实例解析 _autotools
|-- configure.scan
使用autotools建立Makefile简单实例解析 _autotools
|-- main.c
使用autotools建立Makefile简单实例解析 _autotools
|-- mytool1.c
使用autotools建立Makefile简单实例解析 _autotools
|-- mytool1.h
使用autotools建立Makefile简单实例解析 _autotools
|-- mytool2.c
使用autotools建立Makefile简单实例解析 _autotools`
-- mytool2.h
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools
0 directories, 7 files

其中,configure.scan是configure.in的原型文件。而configure.in是autoconf的脚本配置文件。所以下一步的工作就是要对configure.scan进行修改,将其转化为configure.in。

第二步   autoconf

configure.scan文件内容如下:

使用autotools建立Makefile简单实例解析 _autotools#                                               -*- Autoconf -*-
使用autotools建立Makefile简单实例解析 _autotools# Process
this file with autoconf to produce a configure script.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotoolsAC_PREREQ(
2.57)
使用autotools建立Makefile简单实例解析 _autotoolsAC_INIT(FULL
-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
使用autotools建立Makefile简单实例解析 _autotoolsAC_CONFIG_SRCDIR([main.c])
使用autotools建立Makefile简单实例解析 _autotoolsAC_CONFIG_HEADER([config.h])
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for programs.
使用autotools建立Makefile简单实例解析 _autotoolsAC_PROG_CC
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for libraries.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for header files.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for typedefs, structures, and compiler characteristics.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for library functions.
使用autotools建立Makefile简单实例解析 _autotoolsAC_OUTPUT

说明:

1、以“#”号开始的是行为注释。
2、AC_PREREQ宏声明本文件要求的autoconf版本。
3、AC_INIT宏用来定义软件的名称和版本等信息,这里的BUG-REPORT-ADDRESS可以省略。
4、AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。这个参数一般不需要修改。
5、AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。


修改时需要增加一个宏AM_INIT_AUTOMAKE(PACKAGE,VERSION),还要把AC_CONFIG_HEADER更改为AM_CONFIG_HEADER。

AC_OUTPUT是输出文件,如果有多个目录需要产生Makefile如AC_OUTPUT(Makefile src/Makefile)

具体如下:

使用autotools建立Makefile简单实例解析 _autotools#                                               -*- Autoconf -*-
使用autotools建立Makefile简单实例解析 _autotools# Process
this file with autoconf to produce a configure script.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotoolsAC_PREREQ(
2.57)
使用autotools建立Makefile简单实例解析 _autotools#AC_INIT(FULL
-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
使用autotools建立Makefile简单实例解析 _autotoolsAC_INIT(main,
1.0)
使用autotools建立Makefile简单实例解析 _autotoolsAM_INIT_AUTOMAKE(main,
1.0)
使用autotools建立Makefile简单实例解析 _autotoolsAC_CONFIG_SRCDIR([main.c])
使用autotools建立Makefile简单实例解析 _autotoolsAM_CONFIG_HEADER([config.h])
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for programs.
使用autotools建立Makefile简单实例解析 _autotoolsAC_PROG_CC
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for libraries.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for header files.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for typedefs, structures, and compiler characteristics.
使用autotools建立Makefile简单实例解析 _autotools
使用autotools建立Makefile简单实例解析 _autotools# Checks
for library functions.
使用autotools建立Makefile简单实例解析 _autotoolsAC_OUTPUT(Makefile)

第三步  autoheader

首先把configure.scan更改名称为configure.in。然后执行aclocal,autoconf,autoheader。

使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools-easy]$ mv configure.scan configure.in
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ ls
使用autotools建立Makefile简单实例解析 _autotoolsautoscan.log  configure.
in  main.c  mytool1.c  mytool1.h  mytool2.c  mytool2.h
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ aclocal
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ ls
使用autotools建立Makefile简单实例解析 _autotoolsaclocal.m4  autoscan.log  configure.
in  main.c  mytool1.c  mytool1.h  mytool2.c  mytool2.h
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ autoconf
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ ls
使用autotools建立Makefile简单实例解析 _autotoolsaclocal.m4  autom4te.cache  autoscan.log  configure  configure.
in  main.c  mytool1.c  mytool1.h  mytool2.c  mytool2.h
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ autoheader


第四步  automake

这是很重要的一步。automake需要的脚本配置文件是Makefile.am,这个文件需要自己建立。

使用autotools建立Makefile简单实例解析 _autotoolsAUTOMAKE_OPTIONS=foreign
使用autotools建立Makefile简单实例解析 _autotoolsbin_PROGRAMS
=main
使用autotools建立Makefile简单实例解析 _autotoolsmain_SOURCES
=main.c mytool1.c mytool1.h mytool2.c mytool2.h

AUTOMAKE_OPTIONS为设置automake的选项。automake提供了3种软件等级:foreign、gnu、gnits,让用户选择使用,默认等级是gnu。现在使用的foreign只是检测必要的文件。

bin_PROGRAMS定义了要产生的执行文件名。如果产生多个可执行文件,每个文件名用空格隔开。

file_SOURCES定义file这个执行程序的依赖文件。同样的,对于多个执行文件,那就要定义相应的file_SOURCES。

接下来就是使用automake对其生成configure.in文件。这里可以使用选项--adding-missing让automake自动添加一些必要的脚本文件。


第五步  运行configure

使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools-easy]$ automake --add-missing
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ ./configure
使用autotools建立Makefile简单实例解析 _autotoolschecking
for a BSD-compatible install... /usr/bin/install -c
使用autotools建立Makefile简单实例解析 _autotoolschecking whether build environment
is sane... yes
使用autotools建立Makefile简单实例解析 _autotoolschecking
for gawk... gawk
使用autotools建立Makefile简单实例解析 _autotoolschecking whether make sets $(MAKE)... yes
使用autotools建立Makefile简单实例解析 _autotoolschecking
for gcc... gcc
使用autotools建立Makefile简单实例解析 _autotoolschecking
for C compiler default output... a.out
使用autotools建立Makefile简单实例解析 _autotoolschecking whether the C compiler works... yes
使用autotools建立Makefile简单实例解析 _autotoolschecking whether we are cross compiling... no
使用autotools建立Makefile简单实例解析 _autotoolschecking
for suffix of executables...
使用autotools建立Makefile简单实例解析 _autotoolschecking
for suffix of object files... o
使用autotools建立Makefile简单实例解析 _autotoolschecking whether we are
using the GNU C compiler... yes
使用autotools建立Makefile简单实例解析 _autotoolschecking whether gcc accepts
-g... yes
使用autotools建立Makefile简单实例解析 _autotoolschecking
for gcc option to accept ANSI C... none needed
使用autotools建立Makefile简单实例解析 _autotoolschecking
for style of include used by make... GNU
使用autotools建立Makefile简单实例解析 _autotoolschecking dependency style of gcc... gcc3
使用autotools建立Makefile简单实例解析 _autotoolsconfigure: creating .
/config.status
使用autotools建立Makefile简单实例解析 _autotoolsconfig.status: creating Makefile
使用autotools建立Makefile简单实例解析 _autotoolsconfig.status: creating config.h
使用autotools建立Makefile简单实例解析 _autotoolsconfig.status: config.h
is unchanged
使用autotools建立Makefile简单实例解析 _autotoolsconfig.status: executing depfiles commands

这样就完成了Makefile的制作。这是具有的功能:make、make install、make uninstall、make clean、make distclean、make dist。

1、键入make默认执行make all。其目标体为all。

使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools-easy]$ make
使用autotools建立Makefile简单实例解析 _autotoolsmake  all
-am
使用autotools建立Makefile简单实例解析 _autotoolsmake[
1]: Entering directory `/home/armlinux/program/autotools-easy'
使用autotools建立Makefile简单实例解析 _autotools
source='main.c'object='main.o' libtool=no
使用autotools建立Makefile简单实例解析 _autotoolsdepfile
='.deps/main.Po' tmpdepfile='.deps/main.TPo'
使用autotools建立Makefile简单实例解析 _autotoolsdepmode
=gcc3 /bin/sh ./depcomp
使用autotools建立Makefile简单实例解析 _autotoolsgcc
-DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c `test -f 'main.c'|| echo './'`main.c
使用autotools建立Makefile简单实例解析 _autotoolssource
='mytool1.c'object='mytool1.o' libtool=no
使用autotools建立Makefile简单实例解析 _autotoolsdepfile
='.deps/mytool1.Po' tmpdepfile='.deps/mytool1.TPo'
使用autotools建立Makefile简单实例解析 _autotoolsdepmode
=gcc3 /bin/sh ./depcomp
使用autotools建立Makefile简单实例解析 _autotoolsgcc
-DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c `test -f 'mytool1.c'|| echo './'`mytool1.c
使用autotools建立Makefile简单实例解析 _autotoolssource
='mytool2.c'object='mytool2.o' libtool=no
使用autotools建立Makefile简单实例解析 _autotoolsdepfile
='.deps/mytool2.Po' tmpdepfile='.deps/mytool2.TPo'
使用autotools建立Makefile简单实例解析 _autotoolsdepmode
=gcc3 /bin/sh ./depcomp
使用autotools建立Makefile简单实例解析 _autotoolsgcc
-DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c `test -f 'mytool2.c'|| echo './'`mytool2.c
使用autotools建立Makefile简单实例解析 _autotoolsgcc  
-g -O2   -o main  main.o mytool1.o mytool2.o  
使用autotools建立Makefile简单实例解析 _autotoolsmake[
1]: Leaving directory `/home/armlinux/program/autotools-easy'

2、make install(uninstall)

3、make clean (distclean)

make clean仅仅是清除之前编译的可执行文件及配置文件。而make distclean要清除所有生成的文件。

使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools-easy]$ make clean
使用autotools建立Makefile简单实例解析 _autotoolstest
-z "main"|| rm -f main
使用autotools建立Makefile简单实例解析 _autotoolsrm
-f *.o core *.core
使用autotools建立Makefile简单实例解析 _autotools[armlinux@lqm autotools
-easy]$ make distclean
使用autotools建立Makefile简单实例解析 _autotoolstest
-z "main"|| rm -f main
使用autotools建立Makefile简单实例解析 _autotoolsrm
-f *.o core *.core
使用autotools建立Makefile简单实例解析 _autotoolsrm
-f *.tab.c
使用autotools建立Makefile简单实例解析 _autotoolsrm
-rf ./.deps
使用autotools建立Makefile简单实例解析 _autotoolsrm
-f Makefile
使用autotools建立Makefile简单实例解析 _autotoolsrm
-f config.h stamp-h1
使用autotools建立Makefile简单实例解析 _autotoolsrm
-f TAGS ID GTAGS GRTAGS GSYMS GPATH
使用autotools建立Makefile简单实例解析 _autotoolsrm
-f config.status config.cache config.log configure.lineno

4、make dist

将所有的程序和相关的文档打包为一个压缩文件以供发布。

[armlinux@lqm autotools-easy]$ make dist
{ test
!-d main-1.0|| { find main-1.0-type d !-perm -200-exec chmod u+w {} ';'&& rm -fr main-1.0; }; }
mkdir main
-1.0
find main
-1.0-type d !-perm -777-exec chmod a+rwx {} ; -o
!-type d !-perm -444-links 1-exec chmod a+r {} ; -o
!-type d !-perm -400-exec chmod a+r {} ; -o
!-type d !-perm -444-exec /bin/sh /home/armlinux/program/autotools-easy/install-sh -c -m a+r {} {} ;
|| chmod -R a+r main-1.0
/bin/sh /home/armlinux/program/autotools-easy/missing --run tar chof - main-1.0| GZIP=--best gzip -c >main-1.0.tar.gz
{ test
!-d main-1.0|| { find main-1.0-type d !-perm -200-exec chmod u+w {} ';'&& rm -fr main-1.0; }; }
[armlinux@lqm autotools
-easy]$ ls
aclocal.m4      config.h     config.status  depcomp     main
-1.0.tar.gz  Makefile     missing        mytool1.h  mytool2.h
autom4te.cache  config.h.
in  configure      install-sh  main.c           Makefile.am  mkinstalldirs  mytool1.o  mytool2.o
autoscan.log    config.log   configure.
in   main        main.o           Makefile.in  mytool1.c      mytool2.c  stamp-h1