http://blog.csdn.net/lltaoyy/article/details/7615833

转篇文章,讲的不是很清楚,再附上几个资料连接,来自http://www.linuxdw.com/?q=node/77

  • 要获得更多资料,请访问 de<autoconfde< 主页
  • 关于 创建自动的配置脚本 有非常详细的参考资料。
  • GNU.org 给出了如何 编写 configure.ac 和 创建 de<configurede< 脚本 的建议。
  • 访问 GNU Make 您可以学到您从未了解的知识。在 GNU.org 上您还将找到有关 Makefile 基础、编写正确的 文档 等信息。
  • 向 Christian Berger 深入学习 交叉编译
  • IBM developerWorks 文章“交叉开发入门”探讨了交叉编译。
  • Erik Welsh 的 Bookmarks for Cross Compiling 是一个可以找到更多特定信息的地方。
  • 遵循 IBM developerWorks 教程学习 how to convert an existing C program or module into a cross-platform shared library
  • 尝试编写可移植的代码?请参考 10 Commandments for C Programmers.
  • Red Hat 在 Autobook 有一章是关于使用 GNU 自动工具来 Writing Portable C
  • 就 Red Hat 而言,通过 IBM developerWorks 文章“用 RPM 打包软件”学习如何实现更方便的安装。
  • 如果您是一个 Linux 新手,可以通过“Windows 到 Linux 之旅:第 9 部分. 安装软件”来学习如何安装软件。

    Linux下Makefile的automake生成全攻略

      作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了。

      在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”,“make”,“make instal”就可以把程序安装到Linux系统中去了。这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的Toy程序,那么这个文章对你也会有很大的帮助。

      一、Makefile介绍

      Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。

      Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

      Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。这样就造成了手工书写Makefile的诸多问题,automake恰好能很好地帮助我们解决这些问题。

      使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。下面我们将详细介绍Makefile的automake生成方法。

      二、使用的环境

      本文所提到的程序是基于Linux发行版本:Fedora Core release 1,它包含了我们要用到的autoconf,automake。

      三、从helloworld入手

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

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

      新建三个文件:

       helloworld.c
       configure.in
       Makefile.am

      然后执行:

    aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld

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

      很简单吧,几条命令就可以做出一个符合惯例的Makefile,感觉如何呀。

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

      1、建目录

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

    $ mkdir helloword
    $ cd helloworld

      2、 helloworld.c

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

    int main(int argc, char** argv)
    {
    printf("Hello, Linux World!\n");
    return 0;
    }

      完成后保存退出。

      现在在helloworld目录下就应该有一个你自己写的helloworld.c了。

      3、生成configure

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

      命令:

    $ autoscan
    $ ls
    configure.scan helloworld.c

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

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

    ============================configure.in内容开始=========================================
    # -*- Autoconf -*-
    # 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)
    ============================configure.in内容结束=========================================

      然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:

    $ aclocal 
    $ls 
    aclocal.m4 configure.in helloworld.c 
    $ autoconf 
    $ ls 
    aclocal.m4 autom4te.cache configure configure.in helloworld.c

      大家可以看到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”。

      autoconf从configure.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.c

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

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

      5、运行automake

      命令:

    $ automake --add-missing
    configure.in: installing `./install-sh'
    configure.in: installing `./mkinstalldirs'
    configure.in: installing `./missing'
    Makefile.am: installing `./depcomp'

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

      6、执行configure生成Makefile

    $ ./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... 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
    $ ls -l Makefile
    -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile

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

      7、使用Makefile编译代码

    $ make
    if gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -

    DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"helloworld\" -DVERSION=\"1.0\"

    -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \
    -c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \
    then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \
    else rm -f ".deps/helloworld.Tpo"; exit 1; \
    fi
    gcc -g -O2 -o helloworld helloworld.o

      运行helloworld

    $ ./helloworld 
    Hello, Linux World!

      这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的make命令,如make clean,make install,make dist,看看它们会给你什么样的效果。感觉如何?自己也能写出这么专业的Makefile,老板一定会对你刮目相看。

      四、深入浅出

      针对上面提到的各个命令,我们再做些详细的介绍。

      1、 autoscan

      autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。

      2、 configure.scan

      configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in

      3、 aclocal

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

      4、 autoconf

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

      configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。

      在configure.ini中:

      #号表示注释,这个宏后面的内容将被忽略。

      AC_INIT(FILE)

      这个宏用来检查源代码所在的路径。

    AM_INIT_AUTOMAKE(PACKAGE, VERSION)

       这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号:PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对应的软件包的名字和版本号。

    AC_PROG_CC

      这个宏将检查系统所用的C编译器。

    AC_OUTPUT(FILE)

      这个宏是我们要输出的Makefile的名字。

      我们在使用automake时,实际上还需要用到其他的一些宏,但我们可以用aclocal 来帮我们自动产生。执行aclocal后我们会得到aclocal.m4文件。

      产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了。

      5、 Makefile.am

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

    AUTOMAKE_OPTIONS

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

    bin_PROGRAMS

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

    helloworld_SOURCES

      这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。比如需要helloworld.h,helloworld.c那么请写成helloworld_SOURCES= helloworld.h helloworld.c。

      如果你在bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES。

      6、 automake

      我们使用automake --add-missing来产生Makefile.in。

      选项--add-missing的定义是“add missing standard files to package”,它会让automake加入一个标准的软件包所必须的一些文件。

      我们用automake产生出来的Makefile.in文件是符合GNU Makefile惯例的,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了。

      7、 Makefile

      在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:

    make

      根据Makefile编译源代码,连接,生成目标文件,可执行文件。

    make clean

      清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

    make install

      将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。

    make dist

      产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。

      它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

    make distcheck

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

    ===============================================
    helloworld-1.0.tar.gz is ready for distribution
    ===============================================
    make distclean

      类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。

      五、结束语

      通过上面的介绍,你应该可以很容易地生成一个你自己的符合GNU惯例的Makefile文件及对应的项目文件。

      如果你想写出更复杂的且符合惯例的Makefile,你可以参考一些开放代码的项目中的configure.in和Makefile.am文件,比如:嵌入式数据库sqlite,单元测试cppunit。

关于configure和Makefile的更多相关文章

  1. Configure,Makefile.am, Makefile.in, Makefile文件

    一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...

  2. configure.*和Makefile.*之间的关系

    现在很多项目都在使用GUI编译器,Kdevelop\Eclipse等等,诚然它给我们提供了极大地便利,但我们仍需要简单了解编译的过程.本文旨在简单叙述由源码(*.cpp & *.h)经过编译得 ...

  3. configure生成makefile的配置项说明

    一般Linux软件使用configure来检测系统生成makefile文件之后可使用make来编译安装软件. configure的配置选项有哪些呢?现简单收集如下,不断更新中. 以gcc -v为例,可 ...

  4. [转]Linux中configure/makefile

    本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...

  5. 如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefile

    1 2 3 4 5 6 7 8 9 //根据configure.in和Makefile.am生成makefile的步骤,基于UBUNTU 12.04 1.autoscan (可选) 2.aclocal ...

  6. configure.ac和Makefile.am的格式解析概述

    1. configure.ac和Makefile.am的格式解析概述 1.1. Autotools相关工具链 1.1.1. Autotools 1.1.2. 其他相关工具 1.2. 工具链的流程 1. ...

  7. unix automake 使用,快速生成你的Makefile

    使用automake快速生成编译的Makefile 1,确保自己装有的软件automake autoconf 2, 1)执行autoscan 并将生成的configure.scan重命名为config ...

  8. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  9. Configure,make,make install详解

    转:http://my.oschina.net/qihh/blog/66113?fromerr=6ej3CfGJ   无论对于一个初学者还是一个资深的Linux程序员,编写Makefile文件都是一件 ...

随机推荐

  1. Ubuntu 下配置 SSH服务全过程及问题解决

    Windows下做Linux开发,装虚拟机里,怎么可以不用SSH呢.有人说,“做Linux开发,还不直接装机器上跑起来了,还挂虚拟机,开SSH……闲的蛋疼了吧”,不管怎样,我接触Linux算是3年了, ...

  2. Mysql数据库表的类型有哪些

    截至目前,MySQL一共向用户提供了包括DBD.HEAP.ISAM.MERGE.MyIASM.InnoDB以及Gemeni这7种Mysql表类型.其中DBD.InnoDB属于事务安全类表,而其他属于事 ...

  3. 《深入理解Android2》读书笔记(七)

    接上篇<深入理解Android2>读书笔记(六) 广播接受者 注册 ContextImpl @Override public Intent registerReceiver(Broadca ...

  4. Java-多线程编程(一)

    创建多线程 [Thread class]1.继承Thread类,重写run() [Runnable接口]2.实现Runnable接口,重写run() [*Callable接口]3.实现Callable ...

  5. scrapy抓取拉勾网职位信息(三)——爬虫rules内容编写

    在上篇中,分析了拉勾网需要跟进的页面url,本篇开始进行代码编写. 在编写代码前,需要对scrapy的数据流走向有一个大致的认识,如果不是很清楚的话建议先看下:scrapy数据流 本篇目标:让拉勾网爬 ...

  6. python之面向对象编程二

    类的成员 类的成员可以分为三大类:字段.方法.属性. 字段:普通字段.静态字段. 方法:普通方法.类方法.静态方法 属性:普通属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多 ...

  7. 将Electron桌面应用转化为Win10的UWP应用

    如果有小伙伴不知道如何打包Electron桌面应用的,请戳我. 微软提供了一款快捷工具:electron-windows-store,用于将electron桌面应用打包成Windows10系统上.ap ...

  8. 【BZOJ 3262】 3262: 陌上花开 (CDQ分治)

    3262: 陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A ...

  9. [BZOJ4033][HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2437  Solved: 1034[Submit][Stat ...

  10. CodeForces - 965D Single-use Stones

    题面在这里! 如果你强行把问题建模,可以发现这是一个裸的增广路,又因为这是区间连边,所以跑一个 点数O(N)边数O(N log N)的线段树优化建边的网络流即可,不知道能不能过23333 但其实这个问 ...