基本规则
目标:依赖
命令
Makefile三要素:
- 目标:要生成的目标文件
- 依赖:目标文件由哪些文件生成
- 命令:通过执行该命令由依赖文件生成目标文件
工作原理
- 若想生成目标, 检查规则中的所有的依赖文件是否都存在:
- 如果有的依赖文件不存在, 则向下搜索规则, 看是否有生成该依赖文件的规则:
- 如果有规则用来生成该依赖文件, 则执行规则中的命令生成依赖文件;
- 如果没有规则用来生成该依赖文件, 则报错.
- 如果有的依赖文件不存在, 则向下搜索规则, 看是否有生成该依赖文件的规则:

- 如果所有依赖都存在,检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任何一个被更新,则目标必须更新。(检查的规则是哪个时间大哪个最新)
- 若目标的时间 > 依赖的时间, 不更新
- 若目标的时间 < 依赖的时间, 则更新

总结:
- 分析各个目标和依赖之间的关系
- 根据依赖关系自底向上执行命令
- 根据依赖文件的时间和目标文件的时间确定是否需要更新
- 如果目标不依赖任何条件, 则执行对应命令, 以示更新(如:伪目标)
变量
普通变量
- =定义$取值
foo = abc // 定义变量并赋值bar = $(foo) // 使用变量, $(变量名)
- =定义$取值
自带变量
CC = gcc #arm-linux-gccCPPFLAGS: C预处理的选项 -ICFLAGS: C编译器的选项 -Wall -g -cLDFLAGS: 链接器选项 -L -l
自动变量
- $@:表示规则中的目标
- $<:表示规则中的第一个条件
- $^:表示规则中的所有条件,组成一个列表,以空格隔开,自动消除重复项
- 自动变量只能在规则的命令中使用
模式规则
- %.o:%.c 所有.c文件生成对应.o文件
函数
- wildcard:查找指定路径下指定类型的文件
- src=$(wildcard *.c) // 找到当前目录下所有后缀为.c的文件,赋值给src
- patsubst:匹配替换
- obj=$(patsubst %.c,%.o, $(src)) // 将src中.c替换成.o
clean操作
- clean命令中的特殊符号
- -:此命令出错,make会继续执行后续命令。如“-rm main.o”
- @:不现实命令本身,只显示结果。如:“@echo clean done”
- make clean:当路径下有clean文件时,无法执行clean命令
- 解决方案:伪目标声明 .PHONY:clean
- 声明伪目标后,makefile将不会检查该目标是否存在或者该目标是否需要更新
注意事项
- make默认执行第一个出现的目标,可以通过make dest指定要执行的命令
- make -f xxx:执行名字为xxx的Makefile文件,不加-f默认寻找makefile/Makefile
