一. 确认你的系统安装有GNU的如下软件:
1. automake
2. autoconf
3. m4
4. perl
5. 如果你需要产生共享库(shared library)则还需要GNU Libtool
二. 用automake生成Makefile的步骤如下:
1. 由源文件通过autoscan命令生成configure.scan,然后修改configure.scan并重命名为configure.in
2. 由aclocal命令生成aclocal.m4
3. 由autoconf命令生成configure
4. 编辑一个Makefile.am(基本是一系列make的宏定义,偶尔也会出现make规则),由automake命令生成Makefile.in
5. 执行./configure生成Makefile
三. automake支持三种目录层次:flat、shallow和deep。
* flat包指的是所有文件都在一个目录中的包。为这类包提供的Makefile.am不需要SUBDIRS这个宏。所有源文件及自己写的头文件都位于当前目录里面,没有子目录。
* deep包指的是所有的源代码都被储存在子目录中的包,顶层目录主要包含配置信息。deep包的顶层Makefile.am将包括宏SUBDIRS,但没有其它定义需要创建的对象的宏。所有源文件及自己写的头文件都位于当前目录的一个子目录里面,而当前目录里没有任何源文件。
* shallow包指的是主要的源代码储存在顶层目录中,而各个部分(典型的是库)则储存在子目录中的包。主要源文件在当前目录里,而其它一些实现各部分功能的源文件各自位于不同目录。
四. 下面以一个例子说明shallow层次结构的源文件如何自动生成Makefile文件。
例子源程序结构如下:
hello是我们的工作目录,hello目录下有main.c和comm、tools、db、network、interface等五个目录。 comm目录下有comm.c和comm.h,tools目录下有tools.c和tools.h,同样其它目录分别有db.c、db.h、network.c、network.h、interface.c、interface.h。
按照如下步骤来自动生成Makefile:
1. autoscan
生成configure.scan文件
2. mv configure.scan configure.in,并编辑它成下面这样:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(hello.c, 1.0)
AM_INIT_AUTOMAKE(hello, 1.0)
#AC_CONFIG_SRCDIR([hello.c])
#AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile)
configure.in文件内容是一系列GNU m4 的宏,这些宏经autoconf处理后会变成检查系统特性的shell scripts。configure.in内宏的顺序并没有特别的规定,但每一个configure.in文件必須在所有宏前加入AC_INIT宏,然后在所有宏的最后加上AC_OUTPUT宏。可先用autoscan扫描原始文件以产生一个 configure.scan 文件,再对 configure.scan 做些修改成 configure.in 文件。
3. aclocal
生成aclocal.m4文件
4. autoconf
生成可执行的configure文件
5. 编辑一个Makefile.am文件,内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=main.c comm/comm.c comm/comm.h tools/tools.c tools/tools.h db/db.c db/db.h network/network.c network/network.h interface/interface.c interface/interface.h
# 如果定义多个执行文件,则对每个执行程序都要定义相对的filename_SOURCES
这样最后将利用上述hello_SOURCES源文件生成hello程序。
6. automake --add-missing
生成Makefile.in
7. ./configure
生成Makefile
make
make install
make clean
make distclean (连Makefile也清掉)
make dist (创建一个名为PACKAGE-VERSION.tar.gz的发行版)
图解:
文章摘自: http://hi.baidu.com/red_woods/item/951544e6cb24aed3ea34c94f
其他资源: http://www.cnblogs.com/ericdream/archive/2011/12/09/2282359.html
http://www.ibm.com/developerworks/cn/linux/l-makefile/
Automake: https://www.gnu.org/software/automake/