Autotools上手指南1——autoconf基本思想

转自:http://blog.dccmx.com/2011/01/autotools-1/

要想弄懂Autotools并使用它,必须先要了解一下M4这个怪物。

那么何为M4呢,M4的名称取自Macro(M后面跟4个字母…)。它和C预处理器里的宏是一个概念(其实,M4和C预处理器都K&R操刀设计的!!),用来处理文本替换。也就是说,M4是bash里的预处理器。

取自维基的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
divert(-1)
This `divert' discards this text. Note that I had to quote the `divert'
in the comment so it wouldn't get undiverted.
This starts the count at ONE as the incr is a preincrement.
define(`H2_COUNT', 0)
The define H2_COUNT is redefined every time the H2 macro is used.
The dnl deletes everything on the line after it in the output (ie this bit)
define(`H2', `define(`H2_COUNT', incr(H2_COUNT))'dnl
`<h2>H2_COUNT. $1</h2>')
divert(0)dnl diversion to 0 means back to normal dnl removes this line.
H2(First Section)
H2(Second Section)
H2(Conclusion)

这段M4宏用m4处理输出的结果就是:

  
  
  
  
1
2
3
<h2>1. First Section</h2>
<h2>2. Second Section</h2>
<h2>3. Conclusion</h2>

简单说下:

1.M4的语法跟C里面宏的语法差不多,都很像函数,名字加括号。

2.M4里的参数即使声明了也是可以忽略的,如果一个宏一个参数都不加的话,括号都可以忽略。

懂了吧。就当你懂了。

autoconf就是基于M4这个工具来生成configure脚本的。

我们来看一个最简单的autoconf输入,将下面代码存为configure.ac:

1
2
3
AC_INIT([test], [1.0])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

再新建一个文件Makefile.in内容如下:

1
2
3
4
all: @PACKAGE_NAME@_bin
 
@PACKAGE_NAME@_bin: test.c
     gcc -o @PACKAGE_NAME@_bin test.c

好,下面执行命令:

1
2
$ autoconf
$ ./configure

看看,是不是生成了Makefile,是不是下面这样:

1
2
3
4
all: test_bin
 
test_bin: test.c
     gcc -o test_bin test.c

中间发生了什么?停我慢慢道来。

首先,autoconf读取configure.ac里的宏,并调用M4处理这些宏,做些检查,如果你很感兴趣,这些宏的实现可以在/usr/share/autoconf/autoconf/*.m4里找到这些宏的定义(看了不要发疯)。检查完会生成两个文件:configure。执行configure脚本生成config.status和config.log。config.log里面是执行的记录,config.status是下一步执行的脚本,用来生成Makefile,configure生成完这个脚本会自动调用的。

那Makefile.in又是什么呢?那是第二个宏AC_CONFIG_FILES([Makefile])执行时的默认输入。方括号是用来表示参数的。就像上面的‘`’一样。Makefile.in就是一个模板,用来生成Makefile。执行configure脚本时(实际上是config.status脚本),里面的%变量%会被替换成相应的内容。有哪些变量?看看config.log就知道了。

好了,autoconf的基本原理就这样了,本质上就做了件检查环境和变量替换的事。其他的事情以后慢慢讲。

你可能感兴趣的:(linux,autotool)