文章目录
一、Makefile文件
Makefile文件中,本质就是有很多规则构成的,当执行make命令时,解析对应的规则的依赖关系是否成立,如果成立则执行对应的命令。
规则的构成:
目标:依赖
(tab键)shell命令
二、关键字
1. .PHONY关键字
.PHONY是一个特殊的目标声明(注意,前面有一个点)
用于告诉make工具,后面列出的目标是 “伪目标”(伪目标并不是一个真正的文件,而是一个动作或者命令的名称)
2. .SUFFIXES关键字
用于控制make工具如何处理具有不同后缀名的文件之间的依赖关系和隐式规则
清除默认的后缀规则,可以这样使用:
.SUFFIXES:
三、变量
(一)赋值
Makefile文件中变量的使用:
变量名 = 变量值 --> 延迟赋值
变量名 := 变量值 --> 立即赋值,变量的值会在引用时展开,如果变量在赋值后、使用前被修改,那么引用的将是修改后的值
变量名 += 变量值 --> 追加赋值
变量名 ?= 变量值 --> 询问赋值,如果变量被赋新值,则变量等于新值;如果没有被赋值,则使用默认值
(二)引用变量
$(变量名)
$@ : 目标
$< : 第一个依赖文件
$^ : 所有的依赖文件
(三)打印变量的值
$(warning variable_name: $(variable_value))
产生警告信息,但是make进程不会停止
$(info variable_name: $(variable_value))
简单输出信息,不产生警告格式
四、语法
(一)分支结构
ifeq ($(arch),arm)
KERNELDIR := /home/linux/linux-5.10.61
else
KERNELDIR := /lib/modules/$(shell uname -r)/build/
endif
(二)* 和 %通配符
五、函数
(一)patsubst函数
patsubst
(二)wildcard函数
wildcard
(三)shell函数
$(shell shell命令)
调用shell命令
shell是Makefile的一个函数,用于执行括号内的命令。
命令会在Makefile被读取时(通常是make命令开始执行时)执行,而不是在Makefile中的某个规则(rule)被执行时。
六、执行
make 目标字符串 : 找到对应的Makefile文件中,规则的目标为"目标字符串"的规则,
然后判断依赖关系是否成立,如果成立则执行对应的shell命令,
如果依赖关系不成立则解析其它的规则,直到依赖关系成立。
Makefile中所有的变量都是字符串
- 注:SHELL中引用变量${变量};而Makefile中引用变量$(变量)