前言
本篇文章内容直接明了,就是对于用BSP的方式编写程序后进行对应的Makefile文件的编写和相应的注释。
说明
在学习Linux板子时我发现了一个问题,每个工程的Makefile文件都没有任何与之相对应的注释,这样对于新手来说无疑是非常闹过的一件事情,邵了还好,一旦代码内容一往上增加,我们就会越看越懵,以至于后面直接看不下去,所以对于BSP的方式,我从头到尾的对于Makefile文件里面的代码进行逐字逐句的注释,以帮助需要的朋友快速的看懂并且理解.
代码编写及注释
在bash里面(就是在对Makefile里面进行编程)进行编写的时候,可能有些用户对于怎样注释的问题存在问题,这里我也给大家写上了。
单行注释是#打头,而多行注释就是<< BLOCK xxxx BLOCK(xxxx就是需要注释的内容)
#对于CROSS_COMPILE和TARGET进行赋值,?=是意思就是判断CROSS_COMPILE和TARGET是否前面已经赋值如果前面赋值过了,两者则保持前面的值不变,否则就将arm-linux-gnueabihf-和bsp赋值给CROSS_COMPILE和TARGET
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET ?= bsp
#这里和上面意思差不多,都是赋值的意思,而:=意思就是直接赋值,这里就是将编译烧写的命令进行了模块化的编写
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
#定义头文件目录的文件,将其赋值给INCDIRS,:=后面的路径用户根据自己的实际路径进行编写
INCDIRS := imx6ul \
bsp/clk \
bsp/led \
bsp/delay
#定义.c文件目录的路径,将其赋值给SRCDIRS,:=后面和前面一样
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay
#在对前面的.h文件进行编译的时候需要在文件前面加上 -I,这里INCLUDE的作用就是存放:=后面命令加上 -I的.h文件,patsubst函数是模式字符串替换函数
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
#SFILES和CFILES用来保存我们工程吓到所有汇编文件(.S)和c文件(.c),:=后面语句的意思就是将SRCDIRS下所有适配的.S和.c文件放入dir中
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
#获取SFILES和CFILES文件中的.S文件和.c文件的文件名(不带路径)
SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))
#将SFILENDIR和CFILENDIR的.S和.c文件全部变成.o文件(OBJS)并且移动到obj目录下
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS := $(SOBJS) $(COBJS)
#指定文件路径,当编译时找不到文件路径,这儿就能发挥作用,让其在SRCDIRS指定的路径当中查找
VPATH := $(SRCDIRS)
#创建伪目标进行后面的清除功能
.PHONY: clean
#这里就是对工程的编译过程,也一样的格式,都不要变动,这里就不细讲了
$(TARGET).bin : $(OBJS)
#运行imx6ul.lds文件将.o文件生成.elf链接文件
$(LD) -Timx6ul.lds -o $(TARGET).elf $^
#将.elf文件进行格式转换成.bin文件
$(OBJCOPY) -O binary -S $(TARGET).elf $@
#将elf反汇编成.dis文件
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
#将所有的.s编译成 .o文件
$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
#将所有的.c编译成 .o文件
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
#清除函数,将对应的.elf .dis .bin文件删除
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
总结
编写Makefile文件主要就是考察我们的汇编基础和逻辑能力,对于不咋熟悉的同学来说,可以多看看配套的参考文档