Autotools的使用

在编写程序时经常会遇到编写Makefile。如果像写出一个符合自由软件惯例。Makefile并不那么容易。为了减轻编写Makefile的工作,因此有了Automake。一下简单介绍其基本的用法。
一 一般过程
Automake 之前系统必须安装的软件:
GNU Automake
GNU autoconf
GNU m4
Perl
GNU libtool
一般linux发行版本都包括以上这些工具



使用autotools主要就是利用各个工具的脚本文件以生成最后的makefile。

Automake的步骤大致如下:
1.编写产生源代码
2.用autoscan产生configure.scan文件,编辑该文件产生新文件configure.in文件
3.执行aclocal,产生aclocal.m4
4.执行autoconf,产生configure
5.创建Makefile.am文件,并编辑成一定的样子
6.执行automake --add-missing, Automake会根据Makefile.am产生一些文件,其中包括最重要的Makefile.in
7.最后执行./configure,产生Makefile文档
8.执行make,生成可执行文件

9.执行make install,将可执行文件复制到系统路径下。



二helloword示例

1.在选定的目录下编写hello.c程序
int main(int argc, char** argv)
{
printf("Hello World!\n");
return 0;
}

2. 生成configure

        autoscan它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.in”原型( 我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.scan文件,可用此文件来当作configure.in的模板),将configure.scan改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)

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) 

#AC_CONFIG_FILES([makefile])



以“#”号开始的行是注释。

  •         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文件。
  •        中间的注释之间可以分别添加用户测试程序、测试函数库、测试头文件等宏定义。


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


然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:
     aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。 m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器。


     autoconf 是用来生成自动配置软件源代码脚本configure的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。
要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4
  autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。
     autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。



  [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命令,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因为这里没有附加符号定义,所以不需要创建“acconfig.h”文件。如下所示:
                   [root@localhost automake]# autoheader


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

        Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。
        运行automake,automake会根据你写的Makefile.am来自动生成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自动添加一些必需的脚本文件。如下所示:
                                

       可以看到,在automake之后就可以生成configure.in文件。




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


                                        

       可以看到,在运行configure时收集了系统的信息,用户可以在configure命令中对其进行方便的配置。在./configure的自定义参数有两种,一种是开关式(--enable-XXX或--disable-XXX),另一种是开放式,即后面要填入一串字符(--with-XXX=yyyy)参数。读者可以自行尝试其使用方法。另外,读者可以查看同一目录下的“config.log”文件,以方便调试之用。


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


 


6执行make生成可执行文件hello

7.Make install

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


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


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

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

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



       此时,若直接运行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来制作的。




补充:
利用configure所产生的Makefile,有几个缺省的参数可供使用,下面作简单介绍:
make all :产生我们设定的目标,只输入make也可以,此时会开始编译源代码,然后连接,产生可执行程序。
make clean : 清除之前所编译的可执行程序及目的文件(object file,*.o)
make distclean :除了清除可执行程序和目的文件外,也把configure所产生的Makefile清除掉
make install :将程序安装至系统中缺省的可执行程序存放路径。如果我们用bin_PROGRAMS宏的话,程序会被安装到/usr/local/bin目录
make dist :将程序和相关文件包装成一个压缩文件以供发布。执行之后,在目录下会产生一个PACKAGE-VERSION.tar.gz文件。PACKAGE和VERSION这两个变量是根据configure.in中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义而得来得。

make distcheck: 生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。



参考文献-------

http://www.eefocus.com/article/10-04/94616_1s.html

http://bbs.chinaunix.net/thread-2069243-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值