BSP 工程管理

目录

一、创建工程目录

二、编写通用Makefile

 1、基本变量

1、2、常用函数

3、基本工具


一、创建工程目录 

目标文件目录、驱动文件目录、库文件目录

bsp驱动文件目录

obj目标文件目录

 库文件目录

 二、编写通用Makefile

1、变量

#编译链接
CROSS_COMPFILE ?= arm-linux-gnueabihf-
TARGET 		?= ledc

#编译工具
CC		:=$(CROSS_COMPFILE)gcc
LD		:=$(CROSS_COMPFILE)ld
OBJCOPY	:=$(CROSS_COMPFILE)objcopy
OBJDUMP	:=$(CROSS_COMPFILE)objdump

#头文件
INCDIRS 	:=	imx6ul	\
			bsp/clk	\
			bsp/led	\
			bsp/delay	
#源文件
SRCDIRS	:=	project	\
			bsp/clk	\
			bsp/led	\
			bsp/delay	

 2、函数

#链接头文件 匹配文件 % 通配符
INCLUDE	:= 	$(patsubst %, -I %, $(INCDIRS))  

#索引源文件 找到所有.s文件 找到所有.o文件
SFILES	:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))	
CFILES	:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

#去掉所有的路径名
SFILENDIR	:=	$(notdir $(SFILES))  
CFILENDIR	:=	$(notdir $(CFILES))

#替换后缀名
SOBJS	:=	$(patsubst %, obj/% , $(SFILENDIR:.S=.o))  #匹配文件 % 通配符 SFILENDIR:=.S=.o  .S======>.o
COBJS	:=	$(patsubst %, obj/% , $(CFILENDIR:.c=.o))
OBJS		:=	$(SOBJS)$(COBJS)#所有的.o文件

VPATH	:=	$(SRCDIRS)#指定源码的路径

函数 patsubst

作用:用来完成模式字符串替换

$(patsubst <pattern>,<replacement>,<text>)

此函数查找字符串<text>中的单词是否符合模式<pattern>,如果匹配就用<replacement>来
替换掉,<pattern>可以使用通配符“%”,表示任意长度的字符串,函数返回值就是替换后的字
符串。如果<replacement>中也包涵“%”,那么<replacement>中的“%”将是<pattern>中的那个
“%”所代表的字符串

比如:$(patsubst %.c,%.o,a.c b.c c.c)
将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”,替换完成以后的字
符串为“a.o b.o c.o”。

函数 notdir

作用:用来去掉路径名

函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名

$(notdir <names…>)
此函数用与从文件名序列<names>中提取出文件名非目录部分,比如:
$(notdir </src/a.c>)
提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。

函数 foreach

作用:用来完成循环

foreach 函数用来完成循环,用法如下:
$(foreach <var>, <list>,<text>)
此函数的意思就是把参数<list>中的单词逐一取出来放到参数<var>中,然后再执行<text>所
包含的表达式。每次<text>都会返回一个字符串,循环的过程中,<text>中所包含的每个字符串
会以空格隔开,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串将会是
函数 foreach 函数的返回值。

函数 wildcard

作用:用来在变量定义和函数使用时,通配符自动展开

通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,
通配符不会自动展开,这个时候就要用到函数 wildcard,使用方法如下:
$(wildcard PATTERN…)
比如:$(wildcard *.c)

3、编译

$(TARGET).bin : $(OBJS)
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S  $(TARGET).elf $@
	$(OBJDUMP) -D -m arm  $(TARGET).elf > $(TARGET).dis

#表示将所有的.o文件编译并且存放到obj目录下
$(SOBJS) : obj/%.o : %.S  
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

#表示将所有的.o文件编译并且存放到obj目录下
$(COBJS) : obj/%.o : %.c  
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

#清除不要的文件 #PHONY伪目标
.PHONY:clean
	rm -rf $(TARGET).bin $(TARGET).eld $(TARGET).dis $(TARGET).elf $(SOBJS)

#打印提示信息
print:
	@echo  INCLUDE = $(INCLUDE)
	@echo  SFILES = $(SFILES)
	@echo  CFILES = $(CFILES)
	@echo  SFILENDIR = $(SFILENDIR)
	@echo  CFILENDIR = $(CFILENDIR)
	@echo  OBJS = $(OBJS)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值