Makefile疑难解答和技巧合集

Makefile文档

Makefile是GNU make中最重要的一个文件,官方的文档:GNU make,当然也是比较复杂和难懂的。

Makefile教程

很早以前,咱们国人写过这么一篇《跟我一起写 Makefile》,这篇文章写得是比较不错的,通过通俗易懂的例子教你怎么写Makefile,但是是一页一页的html,看起来累死,你也可以到网上去搜索相应的pdf,下载下来后,在写作和分析别人写得Makefile的时候,可以作为参考手册。

Makefile基础

Makefile的大致框架如下:

target(目标) ... : prerequisites(依赖目标) ...
    <TAB>command(命令)

上述的翻译:目标、依赖目标、命令 是来自《跟我一起写 Makefile》,大家在看这本书的时候,一定要记住,千万要看清目标和依赖目标,千万别看错了。我个人觉得prerequisites还是翻译成“前置条件”比较好,尽管从意义上来看在这里的prerequisites确实是依赖的目标,但是翻译成了“前置条件”不至于把读者给看晕和看错。

Makefile的调试

Makefile挺难的,更难的是那些变量值、那些调用过程,一个复杂点的Makefile会把你给完全绕晕。这个时候,对于Makefile的调试就非常重要了。对于Makefile的调试,主要看这篇文章,写得相当不错:Makefile常用调试方法
我调试的时候,常用下面的技巧:
1. make的时候,用参数 “-n” “--just-print” “--dry-run” “--recon”,这4个参数是完全一样的。比如 make -n
2. 但是上面只能看到具体执行了哪个命令,假如Makefile相当庞大和复杂,那么就不知道这个命令是由哪个规则调用的,这个时候就需要用下面的参数: --debug=basic,也就是完整的命令是:make -n --debug=basic,出来的结果非常不错,强烈推荐这个。
3. 对于某个变量的值是多少,可以用$(error, ….) $(warning, ….)这2个函数来打印。

Mafefile的函数参考

《跟我一起写 Makefile》这本书写得比较早,有些函数在它上面找不到了,需要在官网http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions参考,官网是全面的。

Makefile的模式规则

其实挺简单的,就是类似正则表达式,比如下面的:

all: bin/a bin/b
bin/%: ...

那么 bin/a 就会匹配 bin/%,bin/b 也会匹配 bin/%

再比如:

all: bin/a/image bin/b/image
bin/%/image: ...

那么 bin/a/image 就会匹配 bin/%/image,bin/b 也会匹配 bin/%/image

再来一个例子:

all: bin/a/image bin/b/image

bin/a/image: ...

bin/%/image: ...

那么 bin/a/image 会匹配 bin/a/image 和 bin/%/image 这2个目标,这2个目标都执行!

Makefile的中间规则文件

隐含规则,可以参见《跟我一起写 Makefile》,其中上面所说到的模式规则也是属于隐含规则。那么上面所提到的bin/a,bin/a/image所匹配的bin/%, bin/%/image这些就是属于中间规则,假如这些中间规则结果是个文件,那么就叫做中间规则文件。正常情况下,中间规则文件是在规则执行完后要被删除的,比如:

%.txt: foo.log
    # pass

%.log:
    # pass

执行结果如下:

$ make a.txt -n
# pass
# pass
rm foo.log

上面的foo.log这个就是中间规则文件,所以要被删除的。为了防止中间规则文件被删除,那么用下面的来定义,这样就不会删除该中间规则文件了:
.PRECIOUS: foo.log
或者
.SECONDARY: foo.log

发表评论

邮箱地址不会被公开。 必填项已用*标注