(一)目标文件、依赖文件和执行规则
Makefile傻瓜教程-菜鸟笔记 (coonote.com)https://www.coonote.com/linux-note/makefile-simple-tutorial.html
.PHONY: 当目标文件已存在时,忽略,继续执行规则。
(二)变量赋值
(1)+=
字符串拼接,拼接只看当前值,不会用最终值替换。
(2)=和:=
= 当右侧存在变量时,一直搜索到文件末尾,用最终结果替换变量
:= 当右侧存在变量时,按照执行到该行之前的结果进行替换
(三)一些常用函数
(1) $(shell shell_cmd)
Makefile中使用shell命令
(2) $(realpath dirname)
返回一个绝对路径
(3) $(wildcard *.c)
通配符,显示指定路径下指定类型的所有文件,也可以用于显示单个文件。
(4) $(patsubst pattern,replacement,text)
字符串替换,将text中的pattern替换成replacement
(5) $(foreach var,list,text)
循环处理,将list中的参数逐一取出赋值到var然后执行text中的规则,返回字符串
(6) $(if <condition>,<then part>,<else part>)
通过if判断选择返回then part或者else part运算结果
(7) $(basename <names>)
取每个变量的前缀,对应suffix,取后缀
(8) $(addsuffix <suffix>,<names>)
为每个变量加后缀,对应addprefix,加后缀
(9) $(notdir <names>)
把展开的文件的路径去掉,只保留文件名
(10) $(call function,,,)
调用自定义函数,并传入参数。function一般通过define endef的形式进行定义
(四)if分支语句
ifeq($(var),value)
...
else ifeq($(*),*)
...
else
...
endif
(五) $$和$
当在Makefile中执行shell命令时,如果遇到$,则认为是一个变量,后面若是Makefile中的变量则直接进行替换,如果后面是依然是$(也就是遇到$$),那么按照字符串处理,这样就会传递给shell去执行,shell会用shell变量进行替换。
综上,Makefile中遇到$var,将用Makefile中的变量var进行值替换,如果遇到$$var,则用shell中的变量var进行替换。
(六) 一些$指代
$@: 当前目标
$<: 第一个依赖
$?: 比目标新的所有依赖
$^: 所有依赖
$*: 匹配符%匹配的部分
(七) 匹配符%
(16条消息) Makefile中的匹配符%_忘尘~的博客-CSDN博客_makefile中的%
(八)构建规则前加@和-
构建规则前加@表示直接运行规则,不再将规则打印出来;不加-时,运行出错会直接退出,加上-运行出错会继续执行下一条指令。