一条规则的基础结构
target: prerequisite
@recipe (shell commands)
缩进是个tab,而且只能是tab,不能是空格。在makefile中,tab和空格是严格区分开的。每一句recipe(就是要执行的shell命令)的开头,都必须有一个tab。而makefile中的其他东西,例如target: prerequisite、ifeq、变量赋值等等,前面一般不能有tab。也就是说,开头有没有tab是区分“makefile中的shell命令(recipe)”和“makefile中的其他语句”的标志。二者作用不同、语法不同,可以说是两套系统,大家一定要严格区分开。
参考:https://www.cnblogs.com/RabbitHu/p/makefile_tab.html
目标: 预置条件
<TAB> 步骤
不希望 recipe 本身被打印处理,需要在 recipe 前添加 @
是 make 的命令默认是被 /bin/sh ——UNIX 的标准 Shell 解释执行的。
缩进与空格的那些坑
https://zhuanlan.zhihu.com/p/145439685
伪目标
目标(target)并不要求是一个文件,也可以只是步骤的名字
.PHONY 用来定义不是文件的目标, 避免和文件重名的这种情况
自动化变量
更多:https://seisman.github.io/how-to-write-makefile/implicit_rules.html#id11
- $@ : 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,$@ 就是匹配于目标中模 式定义的集合。
- $< : 依赖目标中的第一个目标名字。如果依赖目标是以模式(即 % )定义的,那么 $< 将是符合模 式的一系列的文件集。注意,其是一个一个取出来的。