1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= bsp
3
4 CC := $(CROSS_COMPILE)gcc #$(变量名)引用变量
5 LD := $(CROSS_COMPILE)ld
6 OBJCOPY := $(CROSS_COMPILE)objcopy
7 OBJDUMP := $(CROSS_COMPILE)objdump
8 #整个工程的.h头文件目录,"\"表示换行符
9 INCDIRS := imx6ul \
10 bsp/clk \
11 bsp/led \
12 bsp/delay
13 #整个工程的所有.c和.s文件
14 SRCDIRS := project \
15 bsp/clk \
16 bsp/led \
17 bsp/delay
18
19 # $(subst <from>,<to>,<text>) 将字符串<text>中的<from>内容替换为<to>
20 # $(patsubst <pattern>,<replacement>,<text>) 和上面一样但是多了"%".
21 # $(dir <names...>) 提取目录.如$(dir </src/a.c>) 还回/src.
22 # $(notdir <names...>) 提取文件名.如$(notdir </src/a.c>) 还回a.c
23 # $(foreach <var>, <list>,<text>) 把参数<list>中的单词逐一取出来放到参数<var>中,然后再执行<text>所包含的表达式。
24 # 每次<text>都会返回一个字符串,循环的过程中,<text>中所包含的每个字符串会以空格隔开,最后当整个循环结束时,
25 # <text>所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值。
26 INCLUDE := $(patsubst %, -I %, $(INCDIRS))
27
28 SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
29 CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
30
31 SFILENDIR := $(notdir $(SFILES))
32 CFILENDIR := $(notdir $(CFILES))
33
34 SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))#放入obj文件夹
35 COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
36 OBJS := $(SOBJS) $(COBJS)
37
38 VPATH := $(SRCDIRS)
39 # "="变量的真实值取决于它所引用的变量的最后一次有效值.
40 #":="不会使用后面定义变量的值.
41 #"?="若前面没有赋值则现在赋值.若已经赋值则用之前的值.
42 #"+="追加变量的内容.
43 .PHONY: clean #伪目标clean. 避免生成文件,规则后面的命令会执行.
44
45 $(TARGET).bin : $(OBJS)
46 $(LD) -Timx6ul.lds -o $(TARGET).elf $^
47 $(OBJCOPY) -O binary -S $(TARGET).elf $@
48 $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
49 #"%"目标中表示对文件名的匹配.或者表示模式规则.
50 $(SOBJS) : obj/%.o : %.S #所有的.c和.s文件.