规则
格式
targe...:prerequisites ...command...生成的文件列表 : 依赖列表生成的文件脚本命令
示例:
大致执行逻辑与流程
> vim makefileabc.log:a.logecho 333touch abc.logecho "done"### 脚本含义:依赖a.log 通过脚本 生成 abc.log> makemake: *** No rule to make target 'a.log', needed by 'abc.log'. Stop.### 第一次执行,应为没有依赖项报错退出> touch a.log> makeecho 333333touch abc.logecho "done"done### 手动创建依赖项,可以顺利执行### 脚本依次输出每行脚本和每行的执行结果> makemake: 'abc.log' is up to date.### 由于已经生成 target,输出已是最新> touch a.log> makeecho 333333touch abc.logecho "done"done### 更新一下依赖项的修改时间,因为依赖项要晚于目标的更新时间,所以可以重新跑一遍命令
显示命令语句
默认情况下,makefile 里每行命令都会展示出来,然后输出命令执行的输出。
但是有些语句没必要输出出来,比如 echo 333 的调试语句。
可以使用 @ 放在命令前面,就不会输出出来
> vim makefileabc.log:a.log@echo 333touch abc.log@echo "done"> make333touch abc.logdone### echo 333 语句没显示,只展示了执行结果
.PHONY
makefile 里常常有 .PHONY 属性,这个作用是定义伪目标列表。这样当目表存在时也会执行下面的命令,不会跳过执行。
.PHONY: all dep build clean test coverage coverhtml lint
根据 make 执行逻辑,当 target 存在时就会判断文件是否为最新的,如果是就跳过,执行,如果不是就继续执行。 我们常有一些命令仅仅是定义一组过程,分块逻辑,并不是要真正的编译出 target 文件。 例如 clean 一般约定为清除已生成文件列表。里面有些 rm 命令,不会生成 clean 文件,所以可以一遍遍执行 make clean 如果当前目录下正好有个 clean 文件,又没有设置 .PHONY 命令端,之前的命令将不会别执行,因为 make 判断有个 target 已生成,且是最新的,就会跳过执行。
引用
- https://blog.csdn.net/weixin_38391755/article/details/80380786 Makefile教程(绝对经典,所有问题看这一篇足够了)
