GNU autotools 学习

学习资料:Autotools Tutorial ,以及对这个学习文档的一些记录,一下图片都是来自该文档。

为了:1,Porabale Packages

同样功能函数名称的不同,同样功能的库的名字的不同,以及头文件的不同,使得package 的移植成了大的问题。

2,Uniform Build

统一 编译方式、方法等。

使用configure。

Configure 工具用来收集不同系统所使用的不同的库,工具,以及系统支持的宏定义等信息,然后提供了统一的build 包的方法——make 。如图所示,configure产生了makefile文件用来make

 

 

Configure 之后提供的make install 命令会自动按照GNU 文件组织结构进行程序的安装,

GNU 标准文件结构

<!--[if !vml]--><!--[endif]-->

GNU autotools 学习_第1张图片

 

这个图是不是似曾相识呢,整个linux 系统的文件组织方式不是也是这个样子的吗,如图:

 

GNU autotools 学习_第2张图片

<!--[if !vml]--><!--[endif]-->

这里可以更加深刻的看出linuxwindows 的文件组织方式的不同,windows 下安装软件都是安装到一个文件夹下面的,而linux 下的安装确是按照软件功能组件的不同安装到不同的文件夹下面的。

Build 方法:

./configure && make && make install ,通过configure 可以指定软件包的安装前缀prefix ,还可以指定编译器等。例如:./configure –prefix ~/usr 就是指定安装前缀是home 下的usr 而不是usr 下的local 了。

 

如何configure

可以看到configure 需要两个文件,即:Makefile.inconfig.h.in ,那么这两个文件有时如何得到的呢。这就是需要autotools 的地方了。


可以看出,我们需要autoreconf 这个工具,还需要configure.acMakefile.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 AB 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文件的书写格式:

GNU autotools 学习_第3张图片

<!--[if !vml]--><!--[endif]-->

按照这种规则,hello简单程序的Makefile.am的内容就是:

bin_PROGRAMS = hello

hello_SOURCES = main.c

我想意思是很明确的了,将hello这个程序安装到prefix/bin目录下,并且hello的源程序是main.c。

 

你可能感兴趣的:(linux,windows,文档,Build,工具,makefile)