本文主要是介绍使用Automake和Autoconf 生成Makefile 实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
工具简介
GNU Autoconf 及 Automake 这两个软件就是帮助程序开发者轻松产生Makefile 。用户只要使用 “./configure”, “make”, “make install” 就可以把程序安裝到系统中。
整个automake构建过程如下所示:
Autoscan
扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。
Aclocal
根据已经安装的宏,用户定义宏和aclocal.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件aclocal.m4中。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”
(m4 是一个通用的宏处理器,由 Brian Kernighan 和 Dennis Ritchie 设计。m4 是基于 Ritchie 早先为 AP-3 小型机开发的 m3 宏处理器扩展的。m4也是 POSIX 标准中的一部分,所有版本的 UNIX 下都可用。虽然这种语言可以单独使用,但大多数人需要 m4 仅仅是因为 GNU autoconf 中的 “configure” 脚本依赖它。宏处理器(或预处理器)一般用作文本替换工具。最终用户经常会用它来处理要反复使用的文本模板,典型的是用于编程工具,还会用于文本编辑和文字处理工具。)
Autoheader
根据configure.ac中的某些宏,运行m4,生成config.h.in。
Autoconf
将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。
Automake
automake将根据Makefile.am的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile。
利 用Automake,编程者只需要写一些预先定义好的宏 (macro),提交给Automake处理,就会产生一个可以供 Autoconf 使用的 Makefile.in文件。再配合使用 Autoconf产生的自动配置文件 configure 即可产生一份符合 GNU Makefile 惯例的 Makeifle 了。
应用实例
在开始使用 Automake 之前,首先确认你的系统安装有如下软件:
- GNU Automake
- GNU Autoconf
- GNU m4
- Perl
- GNU Libtool (如果你需要产生 shared library)
最好也使用 GNU C/C++ 编译器 、GNU Make 以及其它 GNU 的工具程序来作为开发的环境,这些工具都是属于 Open Source Software 不但免费而且功能强大。
Automake 所产生的 Makefile 除了可以做到程序的编译和连接,还可以有把源码文件包装起来以供发布,所以程序源代码所存放的目录结构最好符合GNU 的标准惯例,接下来就用一个简单程序来做例子。
工作目录如下:
使用用 autoscan 产生一个 configure.ac 的原型,执行autoscan 后会产生一个configure.scan 的文件,可以用它作为 configure.ac文件的蓝本。
将configure.scan改名为configure.ac,然后编辑 configure.ac文件
原始的configure.ac文件:
修改后的configure.ac文件:
需要注意的是:需要手动添加AM_INIT_AUTOMAKE宏以及修改AC_OUTPUT中指定生成Makefile的位置
在需要生成Makefile的目录中添加Makefile.am 文件
在例子中,一共有2个目录需要生成Makefile,分别是代码根目录(即test-1.0),以及含有源代码的src目录。
根目录中的Makefile.am文件内容如下:
src目录中的Makfile.am内容为:
注意:bin_PROGRAMS此变量表示编译后生成的是二进制执行程序,而且 = 后面可生成多个;_SOURCES的个数要与bin_PROGRAMS生成程序个数一致,_SOURCES前面的全称要与生成程序名完全一致,但命名规范略有不同,_SOURCES前面需要填上的字符串是将程序名(有路径的需包括路径)中除了数字和字母外的其他所有符号全改为“_”,比如图中的hello改为../hello的话,_SOURCES前面应改为“___hello”(此hello前有3个“_”)。
执行 aclocal 、autoheader和 autoconf ,分別会产生 aclocal.m4 、config.h.in及 configure 三个文件
执行 automake --add-missing ,automake 会根据Makefile.am 文件产生一些文件,包含最重要的Makefile.in
然后进入build目录,执行../configure
运行完configure之后,通过查看屏幕上显示的记录发现在当前目录(build)以及子目录(build/src)下已经各产生了一个 Makefile 文件,输入make即开始编译:
最后可运行make install将软件安装到系统中,也可以使用make dist将所有的代码打包发布
或者
需要注意的是,如果你最后要将程序打包发布,那么你需要在顶层目录的Makefile.am中加入:EXTRA_DIST=include,因为make dis默认是不打包include目录的。
上述产生Makefile 的过程和手动编写Makefile的方式非常不一样,使用 Automake 只需用到一些已经定义好的宏就可以了。我们把宏及目标 (target)写在Makefile.am 文件内,Automake 读入 Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的Makefile.in 文件,然后再由configure这个 shell scrīpt 根据 Makefile.in 产生合适的Makefile。
configure.ac 文件内容是一系列GNU m4 的宏,这些宏经Autoconf处理后会变成检查系统特性的shell scrīpts。 configure.ac文件中宏的顺序并没有特别的规定,但是每一个configure.in 文件必须在所有其它宏前加入 AC_INIT 宏,然后在所有其它宏的最后加上 AC_OUTPUT宏。一般可先用 autoscan 扫描原始文件以产生一个 configure.scan 文件,再对 configure.scan 做些修改成 configure.ac 文件。
编辑Configure.ac文件说明
Congfigure.ac中的宏说明如下:
AC_INIT(FILE) :该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION) :
这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版本编号。
AC_PROG_CC:检查系统可用的C编译器,若源代码是用C写的就需要这个宏。
AC_RPOG_CXX:检查是否有C++编译器。
AC_OUTPUT(FILE) :
设置 configure 所要产生的文件,若是Makefile ,configure 便会把它检查出来的结果填充到Makefile.in 文件后产生合适的 Makefile。
实际上,在使用 Automake 时,还需要一些其他的宏,这些额外的宏我们用 aclocal来帮助产生。执行 aclocal会产生aclocal.m4 文件,如果没有特别的用途,不需要修改它,用 aclocal 所产生的宏会告诉 Automake如何动作。
有了 configure.in 及 aclocal.m4两个文件以后,便可以执行 Autoconf来产生 configure 文件了。
编辑Makefile.am 文件说明
Automake 会根据 configure.in 中的宏并在perl的帮助下把Makefile.am 转成 Makefile.in 文件。 Makefile.am 文件定义所要产生的目标:
AUTOMAKE_OPTIONS :
设置 Automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 ''NEWS''、''AUTHOR''、''ChangeLog'' 等文件。设置为foreign 时,Automake 会改用一般软件的标准来检查。
bin_PROGRAMS :定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。
hello_SOURCES :定义 ''hello'' 这个执行程序所需要的原始文件。如果 ''hello''这个程序是由多个原始文件所产生,必须把它所用到的所有原始文件都列出来,以空白符隔开。假设 ''hello'' 还需要 ''hello.c''、''main.c''、''hello.h'' 三个文件的话,则定义
hello_SOURCES= hello.c main.c hello.h
如果定义多个执行文件,则对每个执行程序都要定义相对的filename_SOURCES。
编辑好 Makefile.am 文件,就可以用 Automake --add-missing来产生 Makefile.in。加上 --add-missing 选项来告诉 Automake顺便加入包装一个软件所必须的文件,如果你不使用该选项,Automake可能会抱怨缺少了什么文件。Automake产生出來的 Makefile.in 文件是完全符合 GNU Makefile 惯例的,只要执行 configure这个shell script 便可以产生合适的 Makefile 文件了。
make相关的命令
利用 configure 所产生的 Makefile文件有几个预先设定的目标可供使用,这里只用几个简述如下:
make all :产生设定的目标,既范例中的可执行文件。只敲入make 也可以,此时会开始编译源代码,然后连接并产生执行文件。
make clean :清除之前所编译的可执行文件及目标文件(object file, *.o)。
make distclean :除了清除可执行文件和目标文件以外,也把 configure 所产生的 Makefile 清除掉。 通常在发布软件前执行该命令。
make install :将程序安装到系统中,若源码编译成功,且执行结果正确,便可以把程序安装到系统预先设定的执行文件存放路径中,若用 bin_PROGRAMS 宏的话,程序会被安装到 /usr/local/bin下。
make dist :将程序和相关的文档包装为一个压缩文档以供发布 (distribution) 。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE 和 VERSION 这两个参数是根据 configure.in 文中AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定义。在我们的例子中会产生 ''hello-1.0.tar.gz'' 的文件。
make distcheck:和 make dist 类似,但是加入检查包装以后的压缩文件是否正常,这个目标除了把程序和相关文档包装成 tar.gz 文件外,还会自动把这个压缩文件解开,执行 configure,并执行 make all ,确认编译无错误以后,方显示这个 tar.gz 文件已经准备好并可以发布了。
这篇关于使用Automake和Autoconf 生成Makefile 实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!