自动生成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

自动make工具--autotools的更多相关文章

  1. Makefile自动生成工具-----autotools的使用(详细)

    相信每个学习Linux的人都知道Makefile,这是一个很有用的东西,但是编写它是比较复杂,今天介绍一个它的自动生成工具,autotools的使用.很多GNULinux的的软件都是用它生成Makef ...

  2. C/C++ makefile自动生成工具(comake2,autotools,linux),希望能为开源做点微薄的贡献!

      序     在linux下C或C++项目开发,Makefile是必备的力气,但是发现手写很麻烦. 在百度有个comake2工具,用于自动生成Makefile工具,而在外边本想找一个同类工具,但发现 ...

  3. 制作dll自动注册工具

    记录一个简单的dll自动注册工具制作:主要用到的是DllRegisterServer()方法,其实我们平常注册dll文件内部都会调用这个方法. 这里我就直接写在主程序里面了,需要注意的地方也直接在代码 ...

  4. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  5. h5自动生成工具

    一.前言 写了很多h5之后,对于写手写html和css已经麻木的我决定动手写个工具自动生成h5结构和样式.其实这个想法由来已久,但总是觉得自己技术不够,所以一直没实行.直到某天我真的写够了,我决定动手 ...

  6. Mysql自动备份工具1.0(2013年11月15日更新)

    Mysql自动备份工具1.0 下载地址 2013-11-15 1.解决日历控件在Windows7/8/8.1环境下遮挡按钮问题:2.解决按月备份当月没有该日期问题: 2013-11-13 1.Mysq ...

  7. 好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面)

    转载:http://www.cnblogs.com/lyhabc/p/3322437.html 挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面) 这个工具主要就是 ...

  8. 项目管理及自动构建工具Maven

    项目管理及自动构建工具Maven 一.Maven安装.目录结构.cmd命令1.下载安装apache-maven-3.2.3-bin.zip下载:http://maven.apache.org/down ...

  9. C#_自动化测试1_模拟post,get_12306火车票网站自动登录工具

    还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗. 今天我们就开发一个12306网站自动登录软件. 帮助您轻松订票 通过前两篇博客Fiddler教程和HTTP协议详解,我们了解了Web ...

随机推荐

  1. 《深入理解Spark-核心思想与源码分析》(一)总体规划和第一章环境准备

    <深入理解Spark 核心思想与源码分析> 耿嘉安著 本书共计486页,计划每天读书20页,计划25天完成. 2018-12-20   1-20页 凡事豫则立,不豫则废:言前定,则不跲:事 ...

  2. Word中对象显示不完整

    选中上下文字后,右键没有段落,如果是图片的话是有的,那么我们可以点击菜单栏中段落的右下三角,在那设置单倍行距.

  3. 如何用css做一个爱心

    摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...

  4. android中使用gdbserver调试c程序

    先废话两句,这篇文章可能有所缺陷,因为我并没有条件去测试动态库的调试.(主要是因为是自己的手机不想乱放各种so) 所以我只能说有空的话我会去进行下测试,这里就先这样了. 1.测试代码gdb-test. ...

  5. 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction

    今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...

  6. 十个Chatbot框架介绍

    十个Chatbot框架介绍 原创 2016年12月13日 16:01:23 4616 Chatbot列表 1.  Artificial Intelligence Markup Language    ...

  7. ubuntu vim markdown 实时预览

    vim-instant-markdown插件 该插件支持vim编辑markdown文件时实时预览,不需要手动做任何事情! 使用vim打开一个xxx.md文件,浏览器会自动打开一个预览网页,在编辑这个文 ...

  8. Oracle Database Link 的创建和使用小见

    假设:需要从数据库db_a通过db_link连接到db_b查询数据库b的部分相关信息 前提条件: 数据库a账户需要有创建dblink的权限,如果没有可以使用dba账户赋权限 grant CREATE ...

  9. 基础普及-Jar、War、Ear

    名词解释 Jar文件(扩展名为. Jar) 包括Java类的普通库.资源(resources).辅助文件 (auxiliary files)等 War文件(扩展名为.War) 包括所有Web应用程序. ...

  10. Android之——获取手机安装的应用程序

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47114331 前几篇有关Android的博文中.向大家介绍了几个项目中经常使用的有 ...