• 自动make工具--autotools


    自动生成Makefile

    GNU提供的autoconf和automake两套工具可自动完成符合自由软件惯例的makefile的编写。这样就可以像常见的GNU程序一样,只要使用“./configure”,“make”,“make install”就可以把程序安装到linux系统中去了。

    Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。
      Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

    1. 系统简介

    本文档在ubuntu下试验。

    ~$uname -a

    Linux yuxi-virtual-machine 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:15:33 UTC 2013 i686 i686 i386 GNU/Linux

    ~$lsb_release -a

    No LSB modules are available.

    Distributor ID:  Ubuntu

    Description: Ubuntu 12.04.2 LTS

    Release: 12.04

    Codename:    precise

    2. 安装工具

    》GNU autoconf

    》GNU automake

    》GNU m4

    》GNU libtool

    可通过which查看当前系统是否安装autoconf。

    sudo apt-get install autoconf。

    autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种程序库的工具。

    3. 自动生成makefile的步骤

    1)   运行autoscan命令 
    扫描源代码以搜寻普通的可移植性问题,比如检查编译器、库、头文件等,生成文件configure.scan,它是configure.ac的一个雏形。

    2)   将configure.scan文件重命名为configure.ac或configure.in,并按照需要修改configure.ac或configure.in文件 。
    configure.ac文件的内容是一些宏,confiugre.ac调用一系列autoconf宏来测试程序需要的或用到的特性是否存在,以及这些特性的功能。这些宏经过autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.ac文件中的宏的顺序并没有规定,但是你必须在文件的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。在configure.ac中的一些常用宏定义。

    宏名称

    说明

    AC_PREREQ

    声明autoconf要求的版本号

    AC_INIT

    定义软件名称、版本号、联系方式

    AM_INIT_AUTOMAKE

    必须要的,参数为软件名称和版本号

    AC_CONFIG_SCRDIR

    用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性

    AC_CONFIG_HEADER

    用于生成config.h文件,以便autoheader命令使用

    AC_PROG_CC

    指定编译器,默认GCC

    AC_CONFIG_FILES

    生成相应的Makefile文件,不同文件夹下的Makefile通过空格分隔。例如:AC_CONFIG_FILES([Makefile, src/Makefile])

    AC_OUTPUT

    用来设定configure所要产生的文件,如果是Makefile,configure会把它检查出来的结果带入Makefile.in文件产生合适的Makefile

    3)   执行aclocal命令 
    aclocal是一个perl 脚本程序。aclocal根据configure.ac文件的内容,自动生成aclocal.m4文件。

    4)   执行autoheader命令 
    该命令生成config.h.in文件。该命令通常会从acconfig.h文件中复制用户附加的符号定义。

    5)   执行autoconf命令 
    有了configure.ac和aclocal.m4 两个文件以后,我们就可以使用autoconf来产生configure文件了。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。

    6)   在Project目录下新建Makefile.am文件

    7)   运行automake命令 
    automake会根据Makefile.am文件产生一些文件,其中最重要的是Makefile.in文件。

    8)   执行configure生成Makefile。

    4. helloworld举例

    5. 要做的事

    1)  configure.scan重命名为configure.ac或configure.in,并按照需要修改configure.ac内容。

    2)  编写Makefile.am文件。

    3)  autoscan;--;aclocal;autoheader;autoconf;--;automake;

    --代表前两步要做的事情。

    arm平台交叉编译脚本:

    echo "remove all object files ..."
    make distclean
    echo "remove configure files ..."
    rm -rf INSTALL COPYING ChangeLog AUTHORS NEWS README auto* aclocal* config* depcomp install* missing Makefile.in src/Makefile.in
    rm -rf cscope.out tags tags.filename 
    echo "clean success..."
    
    echo "autoscan ..."
    autoscan
    echo "modify configure.in ..."
    sed '/^AC_INIT/a
    AM_INIT_AUTOMAKE(program,1.0)' configure.scan 1>configure.in
    echo "aclocal ..."
    aclocal
    echo "autoheader ..."
    autoheader
    echo "autoconf ..."
    autoconf
    echo "automake ..."
    automake --foreign --add-missing
    echo "./configure ..."
    ./configure --host=arm-linux --build=i686-linux CC=arm-linux-gcc STRIP=arm-linux-strip

    6. 打包

    一切搞定以后,可以正常的生成Makefile文件,编译生成的程序或库也没有任何问题了,此时我们可能需要对源文件进行打包。使用make dist 命令就可以完成自动打包任务,自动打包包含的内容如下:

    • 所有源文件
    • 所有的Makefile.am文件
    • configure读取的文件
    • Makefile.am中包含的文件
    • EXTRA_DIST指定的文件
    • 采用dist及nodist指定的文件,如可以将某一源文件指定为不打包:
    • nodist_client_SOURCES = client.c

    使用 make dist 命令之后,就会在当前目录下生成一个在AC_INIT 中定义的软件名称和版本号的 tar.gz 压缩包。

    7. 结束语

    GNU 的很多工具经常给人一种感觉: 功能很强大,但也很难学。autotools 可以说是这类工具的一个典型,它需要用户对 shellmake软件编译m4 宏语言,以及 Unix/Linux操作系统各方面知识都有一定的了解使用时又要autoconf automake libtool 多个工具相互配合,如果要给软件增加国际化功能,还要再了解和掌握 gettextpo 等工具和规则与学习其他知识一样,所谓难,其实是不了解,不熟悉本文通过一个范例演示使用autotools 的过程,是让不了解的人熟悉这个工具但真正的理解,还需要将它运用到自己的软件项目当中,不断地实践,不断地思考和总结。

    参考:

      1. http://www.jellythink.com/archives/1056?utm_source=tuicool&utm_medium=referral 使用autoconf和automake生成makefile文件
      2. http://www.ibm.com/developerworks/cn/linux/l-makefile/  例解autoconf和automake生成Makefile文件
      3. http://www.cppblog.com/liu1061/articles/54740.html 使用GNU autotools改造一个软件项目zi
  • 相关阅读:
    Jmeter非GUI模式运行脚本
    vmware下 linux如何扩展磁盘空间
    (完美解决方案)Windows Server 2012 R2报错:无法启动此程序,因为计算机中丢失 apimswincrtstdiol110.dll 解决
    Python程序执行性能优化心得
    jmeter中TPS和吞吐量区别与联系
    Python多进程之Pool进程池浅析
    为什么Jmeter 运行时到达持续时间不停止?
    一些在线实用小工具
    笔记20171225
    JMeter 安装 linux平台
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/5569257.html
Copyright © 2020-2023  润新知