autotools使用

本文详细介绍如何使用Autotools工具集自动生成Makefile,包括autotools的使用流程、各工具的作用及具体步骤,并通过一个简单的hello.c示例程序演示整个过程。

以下内容均为《linux下c编程基础》书中内容。

1.autotools 使用流程
autotools 是系列工具,读者首先要确认系统是否装了以下工具(可以用 which 命令进行查
看)。
 aclocal
 autoscan
 autoconf
 autoheader
 automake

使用 autotools 主要就是利用各个工具的脚本文件以生成最后的 makefile。其总体流程是这样的。
 使用 aclocal 生成一个“ aclocal.m4”文件,该文件主要处理本地的宏定义;
 改写“ configure.scan”文件,并将其重命名为“ configure.in”,并使用 autoconf 文件生成 configure
文件。
接下来,笔者将通过一个简单的 hello.c 例子带领读者熟悉 autotools 生成 makefile 的过程,由于在这过程中
会涉及较多的脚本文件,为了更清楚地了解相互之间的关系,强烈建议读者实际动手操作以体会其整个过
程。
1) autoscan
它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。
它会搜索源文件以寻找一般的移植性问题并创建一个文件“ configure.scan”,该文件就是接下来 autoconf 要用到的“ configure.in”原型。如下所示:

[root@localhost automake]# autoscan
autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1
[root@localhost automake]# ls
autoscan.log configure.scan hello.c

由上述代码可知 autoscan 首先会尝试去读入“ configure.ac”(同 configure.in 的配置文件)文件,此时还没
有创建该配置文件,于是它会自动生成一个“ configure.in”的原型文件“ configure.scan”。
2)autoconf
configure.in 是 autoconf 的脚本配置文件,它的原型文件“ configure.scan”如下所示:

# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
#The next one is modified by david
#AC_INIT(FULL-PACKAGE-NAME,VERSION,BUG-REPORT-ADDRESS)
AC_INIT(hello,1.0)
# The next one is added by david
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_CONFIG_FILES([makefile])
AC_OUTPUT

下面对这个脚本文件进行解释。
 以“ #”号开始的行是注释。
 AC_PREREQ 宏声明本文件要求的 autoconf 版本,如本例使用的版本 2.59。
 AC_INIT 宏用来定义软件的名称和版本等信息,在本例中省略了 BUG-REPORT-ADDRESS,一
般为作者的 E-mail。
 AM_INIT_AUTOMAKE 是笔者另加的,它是 automake 所必备的宏,使 automake 自动生成
makefile.in,也同前面一样, PACKAGE 是所要产生软件套件的名称, VERSION 是版本编号(本行一定要加的)。
 AC_CONFIG_SRCDIR 宏用来检查所指定的源码文件是否存在,以及确定源码目录的有效性。在
此处源码文件为当前目录下的 hello.c。
 AC_CONFIG_HEADER 宏用于生成 config.h 文件,以便 autoheader 使用。
 AC_CONFIG_FILES 宏用于生成相应的 makefile 文件。
 中间的注释之间可以分别添加用户测试程序、测试函数库、测试头文件等宏定义。
接下来首先运行 aclocal,生成一个“ aclocal.m4”文件,该文件主要处理本地的宏定义。如下所示:

[root@localhost automake]# aclocal

再接着运行 autoconf,生成“ configure”可执行文件。如下所示:

[root@localhost automake]# autoconf
[root@localhost automake]# ls
aclocal.m4 autom4te.cache autoscan.log configure configure.in hello.c

3)autoheader
接着使用 autoheader 命令,它负责生成 config.h.in 文件。该工具通常会从“ acconfig.h”文件中复制用户附
加的符号定义,因为这里没有附加符号定义,所以不需要创建“ acconfig.h”文件。如下所示:

[root@localhost automake]# autoheader

4)automake
这一步是创建 makefile 很重要的一步, automake 要用的脚本配置文件是 makefile.am,用户需要自己创建相
应的文件。之后, automake 工具转换成 makefile.in。在该例中,笔者创建的文件为 makefile.am,如下所示:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c

下面对该脚本文件的对应项进行解释。
 其中的 AUTOMAKE_OPTIONS 为设置 automake 的选项。 GNU 对自己发布的软件有严格的规范,
比如必须附带许可证声明文件 COPYING 等,否则 automake 执行时会报错。 automake 提供了 3
种软件等级: foreign、 gnu 和 gnits,让用户选择采用,默认等级为 gnu。在本示例中采用 foreign
等级,它只检测必须的文件。
 bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
 hello_SOURCES 定义“ hello”这个执行程序所需要的原始文件。如果“ hello”这个程序是由多个
原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标
体 “ hello”需要 “ hello.c”、 “ david.c”、 “ hello.h”三个依赖文件,则定义 hello_SOURCES=hello.c david.c
hello.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的
file_SOURCES。
接下来可以使用 automake 命令来生成“ configure.in”文件, 在这里使用选项“ -a” (或者“ —adding-missing”)
可以让 automake 自动添加一些必需的脚本文件。如下所示:

[root@localhost automake]# automake –a(或者 automake --add-missing)
configure.in: installing './install-sh'
configure.in: installing './missing'
makefile.am: installing 'depcomp'
[root@localhost automake]# ls
aclocal.m4 autoscan.log configure.in hello.c makefile.am missing
autom4te.cache configure depcomp install-sh makefile.in config.h.in

可以看到,在 automake 之后就可以生成 configure.in 文件。
5)运行 configure
在这一步中,通过运行自动配置设置文件 configure,把 makefile.in 变成了最终的 makefile。如下所示:

[root@localhost automake]# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating makefile
config.status: executing depfiles commands

可以看到,在运行 configure 时收集了系统的信息,用户可以在 configure 命令中对其进行方便的配置。
在./configure 的自定义参数有两种,一种是开关式( –enable-XXX 或–disable-XXX),另一种是开放式,即后
面要填入一串字符( –with-XXX=yyyy)参数。读者可以自行尝试其使用方法。另外,读者可以查看同一目录
下的“ config.log”文件,以方便调试之用。
到此为止, makefile 就可以自动生成了。回忆整个步骤,用户不再需要定制不同的规则,而只需要输入简
单的文件及目录名即可,这样就大大方便了用户的使用。 autotools 生成 makefile 的流程如图所示。

2.使用 autotools 所生成的 makefile
autotools 生成的 makefile 除具有普通的编译功能外,还具有以下主要功能(感兴趣的读者可以查看这个简
单的 hello.c 程序的 makefile)。
1)make
键入 make 默认执行“ make all”命令,即目标体为 all,其执行情况如下所示:

[root@localhost automake]# make
if gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\"
-DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"hello\" -DVERSION=\"1.0\" -I.
-I. -g -O2 -MT hello.o -MD -MP -MF ".deps/hello.Tpo" -c -o hello.o hello.c; \
then mv -f ".deps/hello.Tpo" ".deps/hello.Po"; else rm -f ".deps/hello.Tpo"; exit 1; fi
gcc -g -O2 -o hello hello.o

此时在本目录下就生成了可执行文件“ hello”,运行“ ./hello”能出现正常结果,如下所示:

[root@localhost automake]# ./hello
Hello!Autoconf!

2)make install
此时,会把该程序安装到系统目录中去,如下所示:

[root@localhost automake]# make install
if gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\"
-DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"hello\" -DVERSION=\"1.0\" -I.
-I. -g -O2 -MT hello.o -MD -MP -MF ".deps/hello.Tpo" -c -o hello.o hello.c; \
then mv -f ".deps/hello.Tpo" ".deps/hello.Po"; else rm -f ".deps/hello.Tpo"; exit 1; fi
gcc -g -O2 -o hello hello.o
make[1]: Entering directory '/root/workplace/automake'
test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin"
/usr/bin/install -c 'hello' '/usr/local/bin/hello'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/root/workplace/automake'

此时,若直接运行 hello,也能出现正确结果,如下所示:

[root@localhost automake]# hello
Hello!Autoconf!

3)make clean
此时, make 会清除之前所编译的可执行文件及目标文件( object file, *.o),如下所示:

[root@localhost automake]# make clean
test -z "hello" || rm -f hello
rm -f *.o

4)make dist
此时, make 将程序和相关的文档打包为一个压缩文档以供发布,如下所示:

[root@localhost automake]# make dist
[root@localhost automake]# ls hello-1.0-tar.gz
hello-1.0-tar.gz

可见该命令生成了一个 hello-1.0-tar.gz 压缩文件。
由上面的讲述读者不难看出, autotools 是软件维护与发布的必备工具,鉴于此,如今 GUN 的软件一般都
是由 automake 来制作的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值