1,.PHONY: 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签。伪目标通过PHONY来指明。
比如,我们常用的make clean, 如果当前文件下有一个clean文件,就会命令出错,此时通过标签来识别就可以了。
2,特殊符号
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标 还要新的依赖文件 列表(集合)
hello.o: hello.c
cc -c hello.c
hello.o: hello.c
cc -c $<
3,MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”。md5sum命令采用MD5报文摘要算法(128位)计算和检查文件的校验和
md5sum test.c > text.txt
cat text.txt
4,格式规则
target... : prerequisites ...
command
target:一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites:要生成那个target所需要的文件或是目标。
command:make需要执行的命令。注意tab键开头(任意的Shell命令)
5,make -f Make.Linux,指定makefile文件。引用其它的Makefile:include Make.Linux
6,文件搜寻,VPATH = src:../headers(: 隔开)/
vpath %.c foo:在foo目录下匹配.c文件
7,命令包:
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
8,变量替换
foo := a.o b.o c.o
bar := $(foo:.o=.c)
“$(bar)”的值就是“a.c b.c c.c”
9,追加变量
objects = main.o foo.o bar.o utils.o
objects += another.o
$(objects)值变成:“main.o foo.o bar.o utils.o another.o”
10,默认配置命令行参数:override <variable> = <value>
11,目标变量:它的作用范围只在这条规则以及连带规则中,其值也只在作用范围内有效,而不会影响规则链以外的全局变量的值。
<target ...> : <variable-assignment>,赋值表达式,如“=”、“:=”、“+=”或是“?=”
12,函数:$(<function> <arguments> ) / ${<function> <arguments>}
13,文件名操作函数
$(dir <names...> ):取目录(最后一个'/'之前字符串)
$(notdir <names...> ):取文件(最后一个'/'之后字符串)
$(suffix <names...> ):取文件后缀
$(basename <names...> ):取前缀(包括路径)
14,foreach 函数
$(foreach <var>,<list>,<text>):把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。
15,if 函数
$(if <condition>,<then-part>,<else-part> ):<condition>参数是if的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
16,call 函数
reverse = $(2) $(1)
foo = $(call reverse,a,b)
此时的foo的值就是“b a”。
17,错误打印:$(error <text ...> )
其他细节可参考 https://blog.youkuaiyun.com/weixin_38391755/article/details/80380786