【Linux裸机实验】BSP工程管理实验

  • 编写Makefile (裸机通用)

/*定义编译器*/
CROSS_COMPILE 	?= arm-linux-gnueabihf-
/*定义目标名*/
TARGET		  	?= bsp
/*定义编译工具名*/
CC 				:= $(CROSS_COMPILE)gcc
LD				:= $(CROSS_COMPILE)ld
OBJCOPY 		:= $(CROSS_COMPILE)objcopy
OBJDUMP 		:= $(CROSS_COMPILE)objdump
/*.h 头文件目录*/
INCDIRS 		:= imx6ul \
				   bsp/clk \
				   bsp/led \
				   bsp/delay 
/*.c 和.S 文件目录。*/				   			   
SRCDIRS			:= project \
				   bsp/clk \
				   bsp/led \
				   bsp/delay 
				   
/*【patsubst】字符替换 给变量 INCDIRS 添加一个“-I”(头文件语法需要) */		
/*即INCLUDE := -I imx6ul -I bsp/clk -I bsp/led -I bsp/delay */	  
INCLUDE			:= $(patsubst %, -I %, $(INCDIRS))

/*挑出所有的.S 汇编文件 【foreach】完成循环、返回字符串 【wildcard】获取目录下.s文件 */		
/*即SFILES := project/start.S */	
SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
	
/*即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))

/*【notdir】去掉文件中的目录部分,提取出文件名 */	
SFILENDIR		:= $(notdir  $(SFILES))
CFILENDIR		:= $(notdir  $(CFILES))

/*.S 和.c 文件编译以后对应的.o 文件目录 所有的.o 文件都放到 obj 文件夹下 */
SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
/*两个变量的集合 */
OBJS			:= $(SOBJS) $(COBJS)
/*指定搜索目录 当编译的时候所需的.S 和.c 文件就会在 SRCDIRS 中指定的目录中查找 */
VPATH			:= $(SRCDIRS)

.PHONY: clean

/*生成最终的可执行文件 $(TARGET).bin*/	
$(TARGET).bin : $(OBJS)
        /*链接 【imx6ul.lds】为链接脚本文件 【$^】的意思是所有依赖文件的集合,即objs变量的值*/
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
        /*将 ledc.elf 文件转为 ledc.bin 【$@】的意思是目标集合,即$(TARGET).bin*/
	$(OBJCOPY) -O binary -S $(TARGET).elf $@
        /*反汇编 生成$(TARGET).dis*/
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis


/*针对不同的文件类型将其编译成对应的.o 文件 【$<】的意思是依赖目标集合的第一个文件*/
$(SOBJS) : obj/%.o : %.S
	$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<


/*通过命令“make clean”可以清理工程*/	
clean:
	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

	

 

你可能感兴趣的:(#,Linux学习之路)