现在的位置: 首页 > 综合 > 正文

automake

2012年11月27日 ⁄ 综合 ⁄ 共 2258字 ⁄ 字号 评论关闭

转载:

http://hi.baidu.com/red_woods/blog/item/a0e8d151db73fd2643a75b41.html

 

一. 确认你的系统安装有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的发行版)

图解:

抱歉!评论已关闭.