学习资料:Autotools Tutorial ,以及对这个学习文档的一些记录,一下图片都是来自该文档。
为了:1,Porabale Packages
同样功能函数名称的不同,同样功能的库的名字的不同,以及头文件的不同,使得package 的移植成了大的问题。
2,Uniform Build
统一 编译方式、方法等。
使用configure。
Configure 工具用来收集不同系统所使用的不同的库,工具,以及系统支持的宏定义等信息,然后提供了统一的build 包的方法——make 。如图所示,configure产生了makefile文件用来make
Configure 之后提供的make install 命令会自动按照GNU 文件组织结构进行程序的安装,
GNU 标准文件结构
<!--[if !vml]--><!--[endif]-->
这个图是不是似曾相识呢,整个linux 系统的文件组织方式不是也是这个样子的吗,如图:
<!--[if !vml]--><!--[endif]-->
这里可以更加深刻的看出linux 和windows 的文件组织方式的不同,windows 下安装软件都是安装到一个文件夹下面的,而linux 下的安装确是按照软件功能组件的不同安装到不同的文件夹下面的。
Build 方法:
./configure && make && make install ,通过configure 可以指定软件包的安装前缀prefix ,还可以指定编译器等。例如:./configure –prefix ~/usr 就是指定安装前缀是home 下的usr 而不是usr 下的local 了。
如何configure :
可以看到configure 需要两个文件,即:Makefile.in 和config.h.in ,那么这两个文件有时如何得到的呢。这就是需要autotools 的地方了。
可以看出,我们需要autoreconf 这个工具,还需要configure.ac 和Makefile.am 这两种文件。
那么如果不用autoreconf 这个工具,该怎么作呢。
<!--[if !vml]--><!--[endif]-->
这个图片显示了其实autoreconf 这个工具其实是几个工具的集合,他们分别是aclocal (产生本地宏定义的工具)automake (产生Makefile.in) 的工具,以及autoconf 这个产生configure 文件的工具。
下面通过一个例子详细讲解一下:
AC_INIT([amhello], [1.0], [[email protected]])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT
这里面为什么要用'[' 把amhello 等字符括起来呢,是因为AC_INIT 是一个宏定义,‘ [’ 是一个延迟宏展开的符号,只有到最后一层才能将宏定义展开,比如:
#DEFINE MET (A ,B ) A met B
#DEFINE N1 na
#DEFINE N2 nb
MET (N1,N2) 的结果是na met nb ,但是如果N1 的定义是#define na,nc ,那么宏展开后将是什么呢?
将是,na met nc 当然这里define 不是c 语言里的define ,而是想AC_INIT 那样的定义。所以‘ [’ 可以保证宏展开的正确性。
再说configure.in 文件,AM_INIT_AUTOMAKE 这是一个为automake 使用的宏,其中foreign 是为了告诉,这个程序包不是遵循GUN 规范的程序,从而避免编译过程出错。 AC_CONFIG_FILES是告诉configure输出什么文件的。再来看看Makefile.am文件的书写格式:
<!--[if !vml]--><!--[endif]-->
按照这种规则,hello简单程序的Makefile.am的内容就是:
bin_PROGRAMS = hello
hello_SOURCES = main.c
我想意思是很明确的了,将hello这个程序安装到prefix/bin目录下,并且hello的源程序是main.c。