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.”+=”符号对于一个未定义的变量,默认采用”=”方式,而对于已经定义的变量,则沿袭原来定义的”=”或”:=的方式。

14.define定义的多行中,如果某一行以[Tab]开始,则该行被作为命令行处理。
15.目标指定变量和模式指定变量会对该目标或者符合该模式的目标以及所有用于构建该目标的依赖采用指定的变量,不影响其他目标的变量值,类似于局部参数。
16.ifdef只是用于判断变量是否被定义,并不对变量进行展开,如:
foo=
bar=$(foo)
ifdef foo返回false,而ifdef bar则返回true
17.在条件判断时不能使用自动变量.
18.使用make中的函数,如果函数的参数包括逗号或者空格,必须把逗号和空格赋值给一个变量,并引用该变量进行函数调用.
19.call函数在传递参数时,变量VARIABLE只能定义为直接展开式,不能定义为传递展开式
20.make -t此类操作并非调用shell的touch命令,而是直接有make操作更新时间戳.
21.对于多目标的模式规则,对于命令行执行一次以后就不会判断后续是否需要重建其他符合模式的目标。而多目标普通规则则会重建所有目标。
22.当目标模式中包括目录部分时,匹配规则首先去掉目录,单纯匹配基本文件名,然后将匹配得到的字符串加上目录前缀得到“茎”。
23.对于万用规则,为了避免效率问题,应定义成最终规则或添加哑模式规则,对于非最终规则的万用规则,当存在其他目标匹配规则时,则永不执行万用规则,
即使匹配规则的执行失败。
24.双后缀与单后缀。后缀规则不能有任何的依赖,否则会被当成普通规则对待。可以对变量.SUFFIXES进行定义添加可识别的后缀。
25.静态库加入新的.o文件后需要更新符号表,ranlib命令。再需要注意make -j选项的并发执行对于ar操作的影响,当几个ar同时操作一个静态库时,该静态库会损坏
因此需要进行控制。

转载请注明来源:Leoncom-《Reading notes about GNUmake details》
Trackback

no comment untill now

Add your comment now