基本规则

目标:依赖
命令
Makefile三要素:

  • 目标:要生成的目标文件
  • 依赖:目标文件由哪些文件生成
  • 命令:通过执行该命令由依赖文件生成目标文件

image.png

工作原理

  • 若想生成目标, 检查规则中的所有的依赖文件是否都存在:
    • 如果有的依赖文件不存在, 则向下搜索规则, 看是否有生成该依赖文件的规则:
      • 如果有规则用来生成该依赖文件, 则执行规则中的命令生成依赖文件;
      • 如果没有规则用来生成该依赖文件, 则报错.

image.png

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

image.png
总结:

  • 分析各个目标和依赖之间的关系
  • 根据依赖关系自底向上执行命令
  • 根据依赖文件的时间和目标文件的时间确定是否需要更新
  • 如果目标不依赖任何条件, 则执行对应命令, 以示更新(如:伪目标)

image.png

变量

  • 普通变量

    • =定义$取值
      1. foo = abc // 定义变量并赋值
      2. bar = $(foo) // 使用变量, $(变量名)
  • 自带变量

    1. CC = gcc #arm-linux-gcc
    2. CPPFLAGS: C预处理的选项 -I
    3. CFLAGS: C编译器的选项 -Wall -g -c
    4. LDFLAGS: 链接器选项 -L -l
  • 自动变量

    • $@:表示规则中的目标
    • $<:表示规则中的第一个条件
    • $^:表示规则中的所有条件,组成一个列表,以空格隔开,自动消除重复项
    • 自动变量只能在规则的命令中使用
  • 模式规则

  • %.o:%.c 所有.c文件生成对应.o文件

image.png

函数

  • wildcard:查找指定路径下指定类型的文件
    • src=$(wildcard *.c) // 找到当前目录下所有后缀为.c的文件,赋值给src
  • patsubst:匹配替换
    • obj=$(patsubst %.c,%.o, $(src)) // 将src中.c替换成.o

image.png

clean操作

  • clean命令中的特殊符号
    • -:此命令出错,make会继续执行后续命令。如“-rm main.o”
    • @:不现实命令本身,只显示结果。如:“@echo clean done”
  • make clean:当路径下有clean文件时,无法执行clean命令
    • 解决方案:伪目标声明 .PHONY:clean
    • 声明伪目标后,makefile将不会检查该目标是否存在或者该目标是否需要更新

image.png

注意事项

  • make默认执行第一个出现的目标,可以通过make dest指定要执行的命令
  • make -f xxx:执行名字为xxx的Makefile文件,不加-f默认寻找makefile/Makefile