DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1012|回复: 0
打印 上一主题 下一主题

[待整理] Linux下C编程基础之:使用autotools

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-10 07:37:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
        3.6  使用autotools

        在上一小节,读者已经了解到了make项目管理器的强大功能。的确,makefile可以帮助make完成它的使命,但要承认的是,编写makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成makefile而同时又能让用户享受make的优越性呢?本节要讲的autotools系列工具正是为此而设的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成makefile了,这无疑是广大用户所希望的。另外,这些工具还可以完成系统配置信息的收集,从而可以方便地处理各种移植性的问题。也正是基于此,现在Linux上的软件开发一般都用autotools来制作makefile,读者在后面的讲述中就会了解到。
         
        3.6.1  autotools使用流程

        正如前面所言,autotools是系列工具,读者首先要确认系统是否装了以下工具(可以用which命令进行查看)。
        n aclocal
        n autoscan
        n autoconf
        n autoheader
        n automake
        使用autotools主要就是利用各个工具的脚本文件以生成最后的makefile。其总体流程是这样的。
         
        n 使用aclocal生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义;
        n 改写“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
         
        下面对这个脚本文件进行解释。
        n 以“#”号开始的行是注释。
        n AC_PREREQ宏声明本文件要求的autoconf版本,如本例使用的版本2.59。
        n AC_INIT宏用来定义软件的名称和版本等信息,在本例中省略了BUG-REPORT-ADDRESS,一般为作者的E-mail。
        n AM_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,使automake自动生成makefile.in,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
        n AC_CONFIG_SRCDIR宏用来检查所指定的源码文件是否存在,以及确定源码目录的有效性。在此处源码文件为当前目录下的hello.c。
        n AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
        n AC_CONFIG_FILES宏用于生成相应的makefile文件。
        n 中间的注释之间可以分别添加用户测试程序、测试函数库、测试头文件等宏定义。
         
        接下来首先运行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
         
        下面对该脚本文件的对应项进行解释。
        n 其中的AUTOMAKE_OPTIONS为设置automake的选项。GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了3种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本示例中采用foreign等级,它只检测必须的文件。
         
        n bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
         
        n 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的流程如图3.9所示。
         
       

        图3.9  autotools生成makefile的流程图

         
        3.6.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"
<p>          /usr/bin/install -c &
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-14 14:47 , 耗时 0.087840 秒, 22 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表