不知道现在人是懒了还是怎么了都使用这玩意,难道自己不会写makefile吗?我一直觉得makefile书写简单点就好了,就不要用atuomake 之类的工具了。今天同事给了我一个测试程序,就两个文件然后用automake工具生成makefile,我自己又加了一个文件,我自己都不知道如何编译。所以不得已对automake工具简单的研究了下。
(1) 简介
Autoconf/Automake工具用于自动创建功能完善的makefile文件。当前大多数软件包都是用这一工具生成makefile文件的。Autoconf/Automake工具组主要包括autoconf、automake、perl语言环境和m4。
现在大多linux 系统 默认已经安装了上述包,没有安装包的在ubuntu 中 sudo apt-get install 安装。
可以用命令查看是否安装 rpm -qa |grep autoconf
可以用命令查看安装路径 whereis autoconf
(2)生成makefile的步骤
1> 创建源代码文件,使用"autoscan"生成configure.scan文件,将其重命名为configure.ac,并做适当修改
2> 使用"aclocal"命令生成aclocal.m4文件
3> 使用"autoconf"命令由configure.ac和aclocal.m4文件生成configure文件。
4> 手工编辑Makefile.am文件,使用"automake"命令生成configure.in文件。
5> 手工编辑或由系统给定acconfig.h文件,使用"autoheader"命令生成config.h.in文件。
6> 使用"configure"命令由configuer、configure.in和config.h.in文件生成Makefile文件。
(3) 实例讲解
假设项目工程目录为: xxx\Hello 项目包含的源文件为:main.c hello.c hello.h
1> 在项目目录Hello下,通过运行autoscan,从而创建configure.scan、autoscan.log文件
2 > 把生成的configure.scan文件重命名为configure.in ,并对它进行修改
将 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) 注释 即 #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
将 AC_CONFIG_SRCDIR([hello.h]) 修改为 AC_CONFIG_SRCDIR([main.c]) //主程序
文件末尾增加下面几行:
AC_INIT(Hiworld,1.0) //生成程序名称版本
AM_INIT_AUTOMAKE(Hiworld,1.0)
AC_CONFIG_FILES([Makefile]) //config 文件生成的文件名 也就是生成makefile
3> 运行aclocal 产生aclocal.m4文件和autom4te.cache目录
4> 运行autoconf产生configure文件
5> 运行autoheader产生config.h.in文件
6> 创建文件Makefile.am
输入下面内容
AUTOMAKE_OPTIONS=foreign //默认参数
bin_PROGRAMS=hworld //生成可执行程序
hworld_SOURCES=main.c hello.c hello.h //源程序
7 > 运行automake --add-missing 产生文件Makefile.in 和链接depcomp、install-sh、missing
8> 运行./configure 产生文件Makefile
9> 运行make产生可执行文件hworld
10> 运行make install,则对hworld进行安装
(4) 杂谈
大部分开源软件包都使用automake 工具,所以我们一般学习或者从源码安装软件包的时候 执行以下步骤。
1> /configure
2> make
3> make install
更多内容可以查看博客 http://www.ibm.com/developerworks/cn/linux/l-makefile/