Makefile相当于脚本语言。目的在于自动化编译。去执行是由所编译文件的依赖关系驱动。
1. Makefile文件的组成内容
a) 显示规则:说明生成目标文件的方法和步骤。显示指出文件依赖关系。
b) 隐式规则:makefile本身自动推到规则。
c) 变量定义:类似C宏定义(类似shell 变量)。
d) 文件指示:引用其他makefile,制定makefile有效部分,定义多行的命令。
e) 注释 #
2. Make命令自动当前目录下寻找makefile
a) Make –f <文件名> 可以用户指定makefile
b) make –I 或者 make –include-dir可以制定makefile目录
c) make也会在/usr/local/bin或/usr/include下寻找目录中包含的文件。
d) make –include <filename> 未找到文件时不报错。
3. make退出码
a) 0 表示makefile文件成功执行。
b) 1表示makefile文件执行出现错误。
c) 2表示在make –q 选项下一些目标不需要更新。
4. 规则形式
targets : prerequisites
command
……
5. Make认为目标文件依赖文件需要更新有三个条件(没有生成,修改时间晚,本身要更新)。
6. 隐式规则:make自动使用gcc –c 命令讲.c编译成同名的.o文件。
7. .PHONY:标号 表示该目标为伪目标,不生成文件。第一个目标为默认目标,一般为all。
8. Makefile允许使用通配符,如*.c。
9. Vpath变量实现搜索源文件的功能。若无,则在当前目录下寻找,若有,则在制定目录。
a) eg. vpath = ./src:../include
b) 制定模式 vpath <pattern> <directories> eg. vpath %.c /src %通配符表示匹配若干个字符数大于零的字符。
10. Make会把使用的命令显示出来。
a) 命令前加@字符,会执行但不显示。
b) Make –n 或 make –just-print则只是显示命令但是不执行(用于debug)不管有没有@。
c) 当makefile中想让上一条shell命令结果用在一条命令中时,用分号连接两命令。 eg. cd /home/admin;pwd
11. Makefile中命令退出码非零,则中止执行当前规则。
a) 命令行前加上—,则忽视该命令执行结果的判断。
b) Make –I 或者 make –ignore-errors可以忽视所有命令的退出码。
c) 某标号以.IGNORE声明作为目标。则该目标中的所有命令将会忽略退出码检测。
12. 使用变量 $(varname) 。为避免重意,$用$$表示。
13. 变量可以传递。
a) := 避免递归定义
b) ?=若定义过则不赋值。
c) +=追加变量定义
d) 自动化变量 $@, $%, $< , $? , $^ , $+ , $*
14. 使用判定条件
a) <conditional-directive>
<text if true >
else
<text if faulse>
endif
b) Ifeq若关键字相等则执行。
c) Ifneq若关键字不相等则执行。
d) Ifdef若关键字非空则执行,ifndef若关键字为空则执行。
15. 使用函数
a) 语法: $(<function> <arguments>) 或 ${<function><arguments>}
b) 字符串处理函数: subst, patsubst,strip,findstring,filter,filter-out,sort,word,wordlist,words,
c) Shell 函数: $(shell<command>,<parameter1>,<parameter2>…….)