正点原子linux——BSP工程管理实验-编写通用Makefile

BSP工程管理实验-编写通用Makefile

第21讲

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 \				# 头文件.h路径
				   bsp/clk \
				   bsp/led \
				   bsp/delay 
				   			   
SRCDIRS			:= project \			#源代码.c路径
				   bsp/clk \
				   bsp/led \
				   bsp/delay 
				  			   
INCLUDE			:= $(patsubst %, -I %, $(INCDIRS))  # 指定生成文件的头文件路径
# patsubst:模式字符串替换函数
# -I指定头文件路径
# INCDIRS每个单词替换  imx6ul 变成 -I imx6ul 
SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
# foreach 循环作用,$(SRCDIRS)逐一取出当作dir
# 带入表达式$(wildcard $(dir)/*.S)在这些路径下找.S文件
# 在$(SRCDIRS)的多个路径下,就project有.S文件
# SFILES = project/start.S
SFILENDIR		:= $(notdir  $(SFILES))
CFILENDIR		:= $(notdir  $(CFILES))
# 去掉文件路径 project/start.S 变成 start.S  
SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
# 名字start.S变成start.o
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS			:= $(SOBJS) $(COBJS)
# 用于依赖处 $(TARGET).bin : $(OBJS),作用就是改下文件后缀
VPATH			:= $(SRCDIRS)
# 指定在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 $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<
	
clean:
	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
# 打印
print;
	@echo OBJ=$(OBJ)
	

函数总结

patsubst函数

$(patsubst ,, )

名称:模式字符串替换函数——patsubst。

功能:查找 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式,如果匹配的话,则以替换。这里,可以包括通配符“%”, 表示任意长度的字串。 如果中也包含“%”, 那么, 中的这个“%”将是中的那个“%”所代表的字串。(可以用“\”来转义, 以“%”来表示真实含义的“%”字符)

返回:函数返回被替换过后的字符串。

示例:

$(patsubst %.c,%.o,x.c.c bar.c)

把字符串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”

foreach函数

foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的, Makefile中的 foreach 函数几乎是仿照于 Unix 标准 Shell( /bin/sh)中的 for 语句,或是 C-Shell(/bin/csh)中的 foreach 语句而构建的。它的语法是:$(foreach < var>,< list>,< text>)

这个函数的意思是,把参数中的单词逐一取出放到参数所指定的变量中,然后再执行 所包含的表达式。每一次 会返回一个字符串,循环过程中, 的所返回的每个字符串会以空格分隔,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是 foreach 函数的返回值。所以, 最好是一个变量名, 可以是一个表达式,而 中一般会使用 这个参数来依次枚举中的单词

wildcard

如果你要让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合,那么,你可以这样:

objects := $(wildcard *.o)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值