提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在对整个工程进行BSP工程管理之后,驱动、始终、延时等函数的源文件和头文件都放置在了不同的文件夹下,这样在编写 Makefile 的时候每次都需要编写路径,很麻烦。
一、BSP工程原型
整个工程如上。
二、解析Makefile
CROSS_COMPILE ?= arm-linux-gnueabihf- # 交叉编译的前缀
TARGET ?= ledc # 要生成的bin文件的名字
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)gcc
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
# 包含头文件路径
INCUDIRS := imx6u \ #蛮重要的通用知识点!!!表示本行未结束,写到下一行
bsp/clk \
bsp/led \
bsp/delay
# 源码路径组
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay
INCLUDE := $(patsubst %, -I %, $(INCUDIRS))
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) # 遍历找出 SRCDIRS 路径组的所有路径下的 .S 文件
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) # 遍历找出 SRCDIRS 路径组的所有路径下的 .c 文件
SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) # 首先将 SFILENDIR 里面所有的 .S 都替换为 .o 后缀 \
# 再在每个 .o 文件前面加上一个 obj/ 的路径
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS := $(SOBJS)$(COBJS) # 所有 obj/ 路径下的 .o 文件
VPATH := $(SRCDIRS)
.PHONY:clean
$(TARGET).bin : $(OBJS)
$(LD) -Timx6u.lds -o $(TARGET).elf $^
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
$(SOBJS) : obj%.o : %.S # 将所有的 .S 文件编译为 .o 并且存放到 obj 目录。
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
# 自动变量 $@, $<:目标文件集合;依赖目标集合的第一个文件
$(COBJS) : obj%.o : %.c # 将所有的 .c 文件编译为 .o 并且存放到 obj 目录。
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
clean:
rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).dis $(OBJS)
# 打印调试
print:
@echo INCLUDE = $(INCLUDE)
@echo SFILES = $(SFILES)
@echo CFILES = $(CFILES)
如上,解释也都放在注释里。
三、移植步骤
以上Makefile 可作为多个工程的通用,每次移植只需修改个别地方。
- 修改 target
TARGET ?= beep
- 头文件路径
INCUDIRS := imx6u \
bsp/clk \
bsp/led \
bsp/delay \
bsp/beep
- 源文件路径
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay \
bsp/beep
经过以上3步,即完成修改,可在终端make。
参考
代码摘自正点原子Linux驱动教程,文档参考《跟我一起写Makefile》(开发板资料 / 04、参考资料)。