1、.SUFFIXES:
#删除所有已定义的可识别后缀
2、 如果在Makefile中存在特殊目标“.DELETE_ON_ERROR” ,make在执行规则过程中,如果规则的命令执行错误,将删除此规则生成的目标文件。
3、$(word N,TEXT)
函数名称:取单词函数—word。
函数功能:取字串“TEXT”中第“N”个单词(“N”的值从 1 开始)
4、$(words TEXT)
函数名称:统计单词数目函数—words。
函数功能:字算字串“TEXT”中单词的数目。
返回值:“TEXT”字串中的单词数。
5、内嵌变量“MAKE_VERSION”代表当前的 make 版本。
6、
ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.81))
$(warning ********************************************************************************)
$(warning * You are using version $(MAKE_VERSION) of make.)
$(warning * Android can only be built by version 3.81.)
$(warning * see http://source.android.com/source/download.html)
$(warning ********************************************************************************)
$(error stopping)
endif
在make执行的第一阶段会展开不在规则中的函数和变量,故make 会执行$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.81)。
执行过程是:
由于$(MAKE_VERSION)为makefile的变量引用形式,美元符号“$”在 Makefile 中有特殊的含义,所有在命令或者文件名中使用“$”时需要用两个美元符号“$$”来表示。
故make展开shell函数时,会把expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.81处理为expr $(echo 3.81 | sed "s/[^0-9\.].*//") = 3.81后送给shell执行
,而$(command)是bash语法中的命令替换语法,故shell会执行echo 3.81 | sed "s/[^0-9\.].*//",并用执行的结果替换$(echo 3.81 | sed "s/[^0-9\.].*//"),做后执行
expr 3.81 = 3.81,并把执行结果返回给make以作为$(shell)函数的执行结果。
7、使用伪目标主要有三点原因:
避免目标和文件名重名而使我们的期望失败;
提高执行make时的效率,当一个目标被声明为伪目标后, make 在执行此规则时不会试图去查找隐含规则来创建它;
当伪目标作为某个目标的依赖时,其命令体都会被强制执行。
问题点:
1、
# this turns off the RCS / SCCS implicit rules of GNU Make
% : RCS/%,v
% : RCS/%
% : %,v
% : s.%
% : SCCS/s.%
什么是RCS/SCCS隐式规则?为什么可以关闭此规则?
参考:
http://hi.baidu.com/419836321/blog/item/f78923876dbe082466096e62.html
http://www.360doc.com/content/12/0307/10/8555864_192398586.shtml