automake/autoconf 入门
作为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 既能够作为编译器的前端,也能够独自作为一个宏处理器。