2007年8月28日星期二

GNU Make学习(1)

1.Make是一个“古董级”的工具,其像橡树年轮,记录了近三十年计算机科学进步的痕迹。或许在学习Make中你会如考古般发现新奇的过往智慧,但更多的时候你将迷失于旧与新的迷雾之中,这也正是Make对于Windows平台下成长的一代程序员来说难懂的原因。但在每个IDE的F5或F9的背后,都能找到Make的身影。要进阶编程功力,当从了解Make开始。

2.Make是一个工具,它完成两个任务:一是建立一个多个文件的关系图,其用来描述文件间的依赖关系;二是检测文件的新旧,并按照关系图来进行命令执行以完成局部或整体的更新工作。所以在Make中存在两类语言,一为建立关系图,一为进行文本处理。

3.在学习Make前,应了解本机上的Make环境。在Windows系统中,由于安装BCB、VC2005等都会自带Make工具。而本文所用的Make是GNUMake 3.8,在Cygwin和DevCPP中都有。不同的Make对应不同的语法,故在BCB中由bpr文件导出的Make文件不能在GNUMake下编译。我就是犯了一次这样的错误。

4.Make中最简单的方式就是通过显性说明来建立关系图。对于小项目这还是很不错的方案,但对于大项目则不行。原因有三:一是重复声明过多,代码冗余,不利于维护;二是声明过细,移植性差;但最重要的是往往文件关系复杂到无法通过人脑来进行关系声明,这就必须用一种计算机辅助方式来进行关系推衍,这在Make中称为“Rule(规则)“。

5.Makefile难于阅读与调试的原因在于其自上而下的书写格式与”(关系图)自底而顶“的执行顺序往往是不一致的,也是人难于掌握的。所以Makefile采用Target(目标)与Rule(规则)这两种机制来分割问题。要注意的是这两种机制是双刃剑,其使用不当往往会造成Makefile的更晦涩难懂。

6.Phony Target用于结构化Makefile,将问题分割,并可优化用户界面。而其中的Empty Target则用来控制命令执行范围,避免非更新区域的反复执行。而对于大项目,制定一个Help Phony是常用技巧。但Phony Target也会破坏一些自然逻辑结构,从而给阅读带来一些障碍。要适当应用Phony Target,不要采用特殊技巧,在欺骗Make工具的同时也会欺骗阅读者,可能包含未来的你。

7.Rule则屏蔽了关系图的细节,让计算机来自动铺砌关键帧间的空隙。所以良好的Rule即能提高阅读性,又能提高执行效率。

8.Make诞生于Unix,其带有很强的*nix家族的色彩。比如其支持的通配符(WildCards)与Bourne Shell相同,包括~,*,?,[...]和[^...]。其有着古旧的键缩进惯例。

9.在Makefile中要注意变量展开、宏展开和函数展开的顺序。要充分理解Automatic Variables(自动变量)的作用;要用VPATH来指定被搜索文件的目录;要善于利用正则表达式来处理文本变量问题,特别是在gcc -M问题上。要小心地分割项目,善于利用eval函数来达到特定要求。

10.注意递归变量的声明与使用,这些变量与C中指针相似。

11.变量用$()来取值,摈弃过时的${}方式。

12.注意Command的Comment(前面有)与Makefile的Comment间的差异

13.正是有了简洁而强有力的函数支持,GnuMake具有很强的文本处理能力;而定义良好的自定义函数或宏,可提高Makefile的通用性和移植性。

14.inline函数是最常见的形式。

15.命令修改符 @-消音;- 消噪音(埋头工作) + 无论如何都要工作(即便是--just print模式)