IMX6ULL——BSP工程管理Makefile文件格式

博客介绍
硬件:正点原子linux开发板IM6ULL
开发环境:Ubuntu下的VSCode
功能:使用VSCode对文件使用工程管理方式
参考:正点原子linux
声明:以下仅为个人学习认知。如有错误,希望提出建议。

为何使用工程管理模式
对于较大的项目,如果所有文件都放在一个目录下,那么工程的可读性就会很差。为了提高项目的管理和文件的处理可以使用将相同文件属性放在同一个文件夹下。
BSP工程管理的目的就是将相同属性的文件放置在同一文件内,这样可以通过文件夹知道文件属性。

使用VSCode代码管理工具

本例程使用的是VSCod代码管理工具,VSCode代码管理工具默认是将工程所在文件夹下的所有文件添加到本项目,对于使用多文件夹存放项目的方式,在VSCode代码管理工具是不会进行添加其他文件的,对于VSCode如何为项目添加其他文件夹步骤如下:

1. 创建工作区

打开文件夹
在这里插入图片描述
选择需要创建的文件夹
在这里插入图片描述
将工作区另存为
在这里插入图片描述
在这里插入图片描述
项目创建成功后自动会在工作区下创建一个 xxxx.code-workspace 文件
在这里插入图片描述

2. 添加项目文件夹

打开c_cpp_properties.jsib 文件
1)使用快捷键:Ctrl+Shift+P
2)在搜索栏输入:C/C++:Edit
3)点击 C/C++:编辑配置(U)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加项目文件夹,在"includePath": ["${workspaceFolder}/**" ] 中添加相对于与当前工作区的文件夹目录。
在这里插入图片描述

Makefile 文件的编写

Makefile是一个逆向编写步骤,首先需要考虑的是你最终需要什么文件,那不这个文件又是什么文件派生出来的呢,实际上Makefile文件就只这样一个反向推导的过程。
就以下面的一个历程为例:
需求:生成目标文件 ledc.bin
现有文件:当前工作目录下的所有.S、.c、.h

多文件夹 Makefile文件编写步骤:

  1. 获取所有头文件所在文件夹路径;
    获取所有源码文件所在问价夹路径
  2. 依据所头文件所在文件夹路径, 向头文件所有路径前面添加 -I
  3. 依据所有源码文件的文件夹路径进行获取所有源码文件路径加源码源码文件名;
  4. 依据第3进行将 所有源码文件转换为所要生成的目标文件名;
  5. 依据所有目标文件名进行进行对依赖文件编译;
  6. 将所有目标文件链接为一个最终目标文件。

项目工作目录
在这里插入图片描述

Makefile文件

CROSS_COMPILE	?=	arm-linux-gnueabihf-		#定义交叉编译链
TARGET			?= 	ledc						#创建目标文件名变量

CC				:=	$(CROSS_COMPILE)gcc			#LD 简写交叉编译变量
LD				:=	$(CROSS_COMPILE)ld			#LD 简写链接变量
OBJCOPY			:=	$(CROSS_COMPILE)objcopy		#OBJCOPY 简写格式转换编译链
OBJDUMP			:=	$(CROSS_COMPILE)objdump		#OBJcopy 简写格式反汇编变量

INCDIRS			:=	project	\					#定义包含所有 头文件(.h) 文件夹路径 变量
					imx6u	\
					bsp/clk	\
					bsp/led	\
					bsp/delay
SRCDIRS			:=	project	\					#定义包含所有 源码文件(.S、.c) 文件夹路径 变量
					bsp/clk	\
					bsp/led	\
					bsp/delay
INCLUDE			:=	$(patsubst %, -I %, $(INCDIRS))		#在所有 头文件(.h) 文件路径前 添加 -I  作用,在使用在使用gcc编译的时候作为连接文件伦将

SFILES			:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))	#获取所有源码文件夹路径下的 .S 文件名 并包含问价夹路径
CFILES			:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))	#获取所有源码文件夹路径下的 .c 文件名 并包含问价夹路径

SFILENDIR		:=	$(notdir $(SFILES))				# 将变量名 SFILES 中所有的文件夹路径去掉, 只保留文件名 .S
CFILENDIR		:=	$(notdir $(CFILES))				# 将变量名 CFILES 中所有的文件夹路径去掉, 只保留文件名 .c

SOBJS			:=	$(patsubst %, obj/%, $(SFILENDIR:.S=.o))		#将变量 SFILENDIR 中所有包含 .S 的字符串转换为 .o
COBJS			:=	$(patsubst %, obj/%, $(CFILENDIR:.c=.o))		#将变量 SFILENDIR 中所有包含 .c 的字符串转换为 .o
OBJS			:=	$(SOBJS) $(COBJS)		#获取所有 .o文件名

VPATH			:=	$(SRCDIRS)				#将Makefile文件执行所有源码文件路径

.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
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) $< -o $@		#将所有.S文件编译为.o文件
$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) $< -o $@		#将所有.S文件编译为.o文件

clean:
	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)	#清除项目编译文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值