1.命令行之前加@取消命令行的回显,这种方式比用.SILENT特殊目标或者–silent参数要灵活,同样.IGNORE也没有在命令之前采用”-”灵活。
2.规则中的命令每一行为一个单独的shell命令行,执行相互独立。利用分号将两条命令放在一行才能成为一个shell命令行。
如cd bar;ls会显示bar目录下的ls,而cd bar \n ls 中cd不会影响ls的目录
3.make -j选项在MS-DOS下无用,因为它是单任务操作系统(-.-)。
4.在make执行失败,修改错误之后,明确的使用make clean先清除上次错误重建的所有目标。
5.make收到中断信号时会通过对目标文件的时间戳和make开始的时间进行比较,从而删除make中重建的文件,可以采用.PRECIOUS目标来设置不被删除的目标。
6.利用export对make中的环境变量对子make进行传递,利用unexport取消SHELL和MAKEFLAGS变量的自动传递。无参数的export表示对所有变量进行传递。
7.主控make和子make通过通信机制来限制系统在同一时刻所执行的任务数不大于make -j中所设定的,当OS不支持make过程中的父子间通信时,那-j选项将无效
8.空命令行可以防止make在执行时为该目标去查找隐含命令
9.对于变量的引用,除单字符变量外,必须为$()或者${}的方式,而$xx的方式则被认为是$(x)x。
10.”=”变量定义为递归式,变量在引用时被展开,有可能导致死循环或无限递归。使用define定义的方式与”=”相同。
“:=”变量定义为直接展开式,即在变量定义时展开替换,推荐的方式。
11.make对变量处理时不忽略中尾空格,因此可以采用直接变量展开定义一个空格变量
nullstring:=
space:=$(nullstring) #end of line
12.避免变量的多层嵌套
13.”+=”符号对于一个未定义的变量,默认采用”=”方式,而对于已经定义的变量,则沿袭原来定义的”=”或”:=的方式。

阅读全文…

1.当Makfile中的第一条规则目标名以”.”开始(不包括”./”)或者是模式规则时,并不作为”终极目标”
2.”$”表示变量和函数的引用,”$$”表示”$”
3.”order-only”依赖列表,order-only依赖的更新不会导致目标的更新
Targets:Normal-prerequisites | order-only-prerequistites
4.目录搜索时的VPATH,vpath,GPATH等含义以及导致重建目标所在目录的不同,$^表示通过目录搜索得到的依赖文件的完整路径名,$@比代表规则目标,隐含规则的命令就采用自动化变量来解决目录问题
5.隐含变量$(RM)=rm -f,在GUN make中应尽量采用伪目标.PHONY的方式,而非不包含依赖和命令的强制目标
6.多规则目标下,只能有一个规则给出重建此目标的命令,如果有多个规则给出了重建命令,则默认采用最后一个规则的命令。当同一目标要采用不同规则中的命令时,应采用”双冒号”规则
7.静态编译模式
Target….:Target-Pattern:Prereq-Patterns
8.双冒号规则与单冒号规则的不同

对于空依赖的双冒号规则,命令无条件执行;单冒号规则当目标文件存在时,永远不执行。双冒号规则针对同一目标不会进行规则合并,而是单独处理,即只执行由于依赖文件修改触发的规则
9.利用gcc -MM 和 sed 自动生成依赖关系.

1. make时重新编译的文件(未被编译过的源文件,被修改过的源文件,以及包含被修改的头文件的源文件)
2. Makefile规则(command行必须以[Tab]开头,Target也可是clean等伪目标)
Target…: Prerequisites
command


3. 默认情况下,Makfile中的第一个规则是终极目标,因此只有被终极目标所依赖的规则才会被会被执行(除非明确指定目标),MAKEFILES环境变量所指示的文件中的目标不会被认为是终极目标,终极目标仍是GUNmakefile,makefile或Makefile中的第一条规则.
4. 隐含规则下默认推导,对于目标文件X.o,默认使用cc -c X.c -o X.o命令
5. 尽量采用单目标,多依赖的书写方式,避免X.o Y.o:A.h的多目标单依赖方式,以增加规则的易读性、减少后期维护代价。
6. 第一条规则后以[Tab]开始的行是交给shell执行的,同时以[Tab]开始的注释行也会交给shell决定(-.-)
7. make寻找目标文件的文件名顺序为GUNmakefile,makefile,Makefile(但不推荐采用GUNmakefile,推荐Makefile)
8. 采用include指示符去替代MAKEFILES环境变量