您的位置:首页 > 其它

运用autoconf和automake自动生成Makefile实例讲解

2009-12-05 10:36 731 查看
在开始使用autoconf和automake之前,首先确认你的系统安装有GNU的如下软件:

1. automake

2. autoconf

3. m4

4. perl

5. 如果你需要产生共享库(shared library)则还需要GNU Libtool

自动生成一个makefile的步骤。


第一步:

----------

假如我们有一个目录hello, 里面有main.c以及子目录comm,子目录中有comm.h comm.c

第二步:

----------

运行 autoscan
, 自动创建两个文件: autoscan.log configure.scan

第三步:

----------

修改configure.scan的文件名为configure.in

查看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_CONFIG_SRCDIR([main.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

------------------------------------------------

解读以上的文件:

------------------------------------------------

# -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

# AC_PREREQ:

# 确保使用的是足够新的Autoconf版本。如果用于创建configure的Autoconf的版

# 本比version 要早,就在标准错误输出打印一条错误消息并不会创建configure。

AC_PREREQ(2.61)

#

# 初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址

#

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

#

# 用来侦测所指定的源码文件是否存在,来确定源码目录的有效性

#

AC_CONFIG_SRCDIR([main.c])

#

# 用于生成config.h文件,以便autoheader使用

#

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.

#

# 创建输出文件。在`configure.in'的末尾调用本宏一次。

#

AC_OUTPUT

------------------------------------------------

修改动作:

1.修改AC_INIT里面的参数: AC_INIT(main,1.0, pgpxc@163.com)

2.添加宏AM_INIT_AUTOMAKE, 它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。

3.在AC_OUTPUT后添加输出文件Makefile

修改后的结果:

------------------------------------------------

# -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)

AC_INIT(main, 1.0, pgpxc@163.com)

AC_CONFIG_SRCDIR([main.c])

AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(main,1.0)

# 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)

------------------------------------------------

第四步:

运行 aclocal
, 生成一个“aclocal.m4”
文件和一个缓冲文件夹autom4te.cache
,该文件主要处理本地的宏定义。

第五步:

运行 autoconf
, 目的是生成 configure

第六步:

运行 autoheader
,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。

第七步:

下面即将运行 automake
, 但在此之前应该做一下准备工作!

首先

创建一个 Makefile.am
.这一步是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am,用户需要自己创建相应的文件。之后,automake工具转换成Makefile.in。

这个Makefile.am的内容如下:

------------------------------------------------

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=main

main

_SOURCES=main.c comm/comm.h comm/comm.c

------------------------------------------------

下面对该脚本文件的对应项进行解释。

main改为要生成的程序名(主程序名)


如何需要用到mysql,则在Makefile.am中加入



INCLUDES=     -I./   -I/usr/local/mysql/include/
LIBS=   -L/usr/lib/mysql   -lmysqlclient


还可以在INCLUDES上指名自己程序所在的路径,但是注意不能有空格


其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU(在第1章中已经有所介绍)对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用 户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。

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

main_SOURCES定义“main”这个执行程序所需要的原始文件。如果”main”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原 始文件都列出来,并用空格隔开。例如:若目标体“main”需要“main.c”、“sunq.c”、“main.h”三个依赖文件,则定义 main_SOURCES=main.c sunq.c main.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。

其次

使用automake对其生成“configure.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。

注意需要手工生成一些文件(在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件),否则会报错终止

$ automake --add-missing


第八步

运行configure
,在这一步中,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。

第九步

运行 make
,对配置文件Makefile进行测试一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: