文件过多,工程复杂
将文件分开存放,结构清晰
注:imu6ul.h仅起到包含imx6ul其它库函数的作用,而被各个bsp的头文件调用
obj用来存放编译后生成的.o中间文件
Makefile
#编译器名
CROSS_COMPILE ?= arm-linux-gnueabihf-
#目标名
TARGET ?= bsp
#编译流程名
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
#头文件路径集合 “\”换行
INCDIRS := imx6ul \
bsp/clk \
bsp/led \
bsp/delay
#源文件路径集合(.c/.S)
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay
#使用patsubst函数,给变量INCDIRS添加一个"-I"
#加“I”是因为Makefile语法要求指明头文件目录的时候需要加上“-I”
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
#SFILES保存工程中所有.S汇编文件(包含绝对路径)
#变量SRCDIRS已经存放了工程中所有的.S和.c文件,仅需要挑出.S即可
#借助了函数foreach和wildcard
#最终SFILES := project/start.S
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
#CFILES保存工程中所有.c汇编文件(包含绝对路径)
#变量SRCDIRS已经存放了工程中所有的.S和.c文件,仅需要挑出.c即可
#借助了函数foreach和wildcard
#最终CFILES := project/main.c bsp/clk/bsp_clk.c bsp/led/bsp_led.c bsp/delay/bsp_delay.c
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
#去掉了SFILES和CFILES的路径部分,仅保留了文件名
SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))
#变量SOBJS和COBJS是.S和.c文件编译以后对应的.o文件目录
#SOBJS = obj/start.o
#COBJS = obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS := $(SOBJS) $(COBJS)
#VPATH 指定搜索目录,当编译的时候所需的.S和.c文件会在SRCDIRS中指定的目录中查找
VPATH := $(SRCDIRS)
.PHONY: clean
$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.lds -o $(TARGET).elf $^
#$^ 所有依赖文件的集合
$(OBJCOPY) -O binary -S $(TARGET).elf $@
#$@ 所有目标的集合
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
#$< 依赖文件集合中的第一个文件,如果依赖文件是以模式%定义的,那么$<就是一系列符合模式的文件集合
#-Wall 使GCC产生尽可能多的警告信息
#-c 只编译,不链接成可执行文件,通常用于编译不含主程序的子程序
#-O2 比-O更好的优化编译、链接
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
编译烧录流程同之前一样