automake和autoconf学习小结

 

从网上下载的许多源码的编译和安装过程非常简单,压缩后需要的操作只有三步:

./configure

make

make install

即我们只要运行./configure,这个脚本就能检测当前系统的一些特性;运行make,则会读取Makefile的一些配置,对源码进行编译。这种软件编译和安装的框架其实是有一套标准的,即GNU项目提出的GNU build systemGNU Build System指的是这样一种源码编译系统:它符合GNU Coding Standards标准,有configure脚本、Makefile脚本等,并且这些脚本遵循一定的最小接口规范,使得用户可以使用一些简单的命令(如:./configuremakemake install)在不同的系统架构上编译并安装GNU工程。

为了让你的源码实现这样的标准(即使用你的源码的人也可以轻松地在他的电脑上从简单的命令编译和安装你写的软件),除了自己手写configureMakefile.in脚本之外(后面会说到这个两文件),还有更简单的方法,就是使用Autotools来帮助你从一堆源码中生成脚本。

Autotools就是一系列帮助开发人员建立GNU Build System的开发套件。用于自动编译源码并实现类Unix系统间的可移植性。这个工具出现的原因是因为软件的可移植性面临巨大的挑战:系统间的C编译器不同、库函数不兼容等。如果简单使用预编译指令(#ifdef)来为不同的系统指定专用的代码块,那么由于开发环境的差别实现是太大了,就要求开发人员需要有很全面的技术知识,实现起来十分困难。Autotool的目的就是为了解决这一难题。当然,前面也说到可以通过自己写configureMakefile.in脚本来克服这种移植性问题(许多牛人就是这么干的)。

要为一组源码建立一个可移植的Makefile系统,我们需要的工具是automakeautoconf。首先,我们为一个简单的小例子,为一个helloworld程序建立起Makefile系统,在对基本流程有一个大概的了解后,再来理清一下以上所提到的工具的概念及它们所处的位置。

1.      一个简单的例子

这个例子和其中用到的方法,转自http://www.linuxcomputer.cn/,我在做这个例子的过程中,依据遇到的问题做一些修改。

我们操作这个例子的环境是:Ubuntu12.10,已安装上automakeautoconf

 

我们从大家最常使用的例子程序helloworld开始.

下面的过程如果简单地说来就是:

新建三个文件:

helloworld.c

configure.in

Makefile.a

然后执行:

aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld</SPAN< li>

就可以看到Makefile被产生出来,而且可以将helloworld.c编译通过.

很简单吧,几条命令就可以做出一个符合惯例的Makefile

现在开始介绍详细的过程:

1.建目录

在你的工作目录下建一个helloworld目录,我们用它来存放helloworld程序及相关文件,如在 /home/my/build下:

$ mkdir helloword

$ cd helloworl

2. helloworld.c

然后用你自己最喜欢的编辑器写一个hellowrold.c文件,如命令:vi helloworld.c。使用下面的代码作为helloworld.c的内容。

#include <stdio.h>

int main(int argc, char** argv){

     printf("%s", 'Hello, Linux World!\n");

     return 0;

}

完成后保存退出.
  现在在helloworld目录下就应该有一个你自己写的helloworld.c.

3.生成configure

我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.in的模板文件。

命令:

$ autoscan

$ ls

configure.scan helloworld.

执行后在 hellowrold目录下会生成一个文件:configure.scan,我们可以拿它作为configure.in的蓝本。

现在将configure.scan改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:

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

AC_INIT(helloworld.c)

AM_INIT_AUTOMAKE(helloworld, 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)

然后执行命令aclocalautoconf,分别会产生aclocal.m4configure两个文件:

$ aclocal

$ls

aclocal.m4 configure.in helloworld.c

$ autoconf

$ ls

aclocal.m4 autom4te.cache configure configure.in helloworld.

大家可以看到configure.in内容是一些宏定义,这些宏经autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。

autoconf是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。

要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4.

aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:”aclocal – create aclocal.m4 by scanning configure.ac”.

autoconfconfigure.in这个列举编译软件时所需要各种参数的模板文件中创建configure

autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。

m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器。

4.新建Makefile.am

新建Makefile.am文件,命令:

$ vi Makefile.am

内容如下:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=helloworld

helloworld_SOURCES=helloworld.

automake会根据你写的 Makefile.am来自动生成Makefile.in.

Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

在进行第五步前,先运行autoheader产生一个config.h.in的文件,否则会报错。

5.运行automake:

$ automake --add-missing

configure.in: installing `./install-sh'

configure.in: installing `./mkinstalldirs'

configure.in: installing `./missing'

Makefile.am: installing `./depcomp'</SPAN< li>

automake会根据Makefile.am文件产生一些文件,包含最重要的 Makefile.in.

6.执行configure生成Makefile

$./configure

$ ls -l Makefile

你可以看到,此时Makefile已经产生出来了.

7.使用Makefile编译代码

$make

运行helloworld

$ ./helloworld

Hello, Linux World!</SPAN< li>

这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的make命令,如make cleanmake installmake dist看看它们会给你什么样的效果。总结一下,以上的过程可以用下图表示:

2.      工具简介

GNU toolchain(GNU工具链)是GNU项目推出的一系列程序开发工具的总括。这个工具集包括了以下工具:

GNU make: Automation tool for compilation and build;

GNU Compiler Collection (GCC): Suite of compilers for several programming languages;

GNU Binutils: Suite of tools including linker, assembler and other tools;

GNU BisonParser generator

GNU m4m4 macro processor

GNU Debugger (GDB): Code debugging tool;

GNU build system (autotools):

      Autoconf

      Autoheader

      Automake

      Libtool

 

可以看到,AutotoolsGNU工具链的一员,它的另一个名称是GNU build system。它是一个程序开发工具套件。这里我们要用到的是automakeautoconfautoheaderautoscanalocal。概念上说,它们的从属关系如下图:

Autoconf主要针对的是可移植性问题。configure文件是一个可移植的脚本文件,autoconf可以看作是一个编译器,把configure.ac文件(这个文件中的语句都是一些宏)编译成configure脚本文件。Autoconf项目使用sh脚本语言用于configure。因而autoconf程序更像是一个宏展开工具,它使用M4宏处理工具把configure.ac中的宏定义展开为configure的宏实现。这些宏的定义在一些Autoconf工程文件中。

auotscan会遍历指定源码目录下的所有文件,找出其中需要特别指定的宏命令。它使用一些已安装的数据文件来检测这些“特殊语句”。它生成的文件configure.scan是一个蓝本文件,即只给出了最基本的宏语句。开发人发在这个文件中进行功能添加后,应该把它改名为configure.ac(也可以改为configure.in,但是不推荐)。

aclocal是一个perl 脚本程序,它根据configure.in文件的内容,自动生成aclocal.m4文件、aclocal的定义是:"aclocal - create aclocal.m4 by scanning configure.ac"aclocal.m4文件可以用来包含该源码包自定义的宏。

autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

我们使用automake --add-missing来产生Makefile.in。选项--add-missing的定义是 "add missing standard files to package",它会让automake加入一个标准的软件包所必须的一些文件.我们用automake产生出来的Makefile.in文件是符合GNU Makefile惯例的,接下来我们只要执行configure这个shell脚本就可以产生合适的Makefile文件了。

autoheader工具会产生config.h.in文件。

3.      技术细节

更多的技术细节,请查看automakeautoconf的文档(建议看原版,较全),这里只对我研究到的细节作介绍。

我们需要自己创建的文件有:每个目录(及子目录)一个Makefile.am;源代码;configure.ac(可以由configure.scan修改得到)。

利用autotools产生的文件有:

autoscanautoscan.log configure.scan

aclocalautom4te.cache acloca.m4

autoconfconfigure

autoheaderconfig.h.in

automake –adepcomp install.sh missing

 

configure.ac文件的内容是一些宏,这些宏经过autoconf处理后会变成检查系统特性。环境变量.软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。在这个文件中,以AC_开头的是autoconf工具使用的宏,在autoconf文档中有介绍;以AM_开头的是automake工具使用的宏,在automake文档中有介绍。

关于这些宏定义的语法,每个参数建议用中括号[]表示,这样就可以在这个中括号中调用另外一个宏而不会造成逗号(参数分隔符号)间的混乱。

AC_INIT以发布包的名字、版本、bug报告地址为参数,如果用户make dsit时(生成发布包),这些信息会随发布包被发布出去。

         AM_INIT_AUTOMAKE会初始化automake并传给它一些参数。这些参数中比较重要的是foreign,它表示automake将用比GNU 更宽松的标准来要求这个源码框架,即对某些文件(如ChangeLog, AUTHORS)是否在源码框架中不作强制要求。

         AC_PROG_CC宏会让configure脚本检查c编译器,并定义CC变量。

AC_CONFIG_HEADERS([config.h])会让configure脚本和生config.h头文件。config.hcofigure产生,这个文件自动收集在autoconf过程中出现的宏定义。所以这个文件最通常的用法是:在configure.ac中测试平台的一些特性,并用是否有宏定义来表示这些特性是否被这个平台支持,程序#includeconfig.h,通过#ifdef指令判断宏是否被定义,就可以在程序出实现平台相关的特性。

         AC_OUTPUT表示configure.ac的结尾,它会实际上产生AC_CONFIG_HEADERSAC_CONFIG_FILES宏中定义的文件。

Makefile.am是用来生成Makefile.in的,需要你手工书写。Makefile.am中定义了一些内容:

AUTOMAKE_OPTIONS

  这个是 automake的选项。在执行automake时,它会检查目录下是否存在标准GNU软件包中应具备的各种文件,例如AUTHORSChangeLogNEWS等文件。我们将其设置成foreign时,automake会改用一般软件包的标准来检查。

bin_PROGRAMS

  这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。

helloworld_SOURCES

  这个是指定产生"helloworld"时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。比如需要helloworld.h,helloworld.c那么请写成:helloworld_SOURCES= helloworld.h helloworld.c。如果你在 bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值