【Linux笔记】解读Makefile

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在对整个工程进行BSP工程管理之后,驱动、始终、延时等函数的源文件和头文件都放置在了不同的文件夹下,这样在编写 Makefile 的时候每次都需要编写路径,很麻烦。


一、BSP工程原型

在这里插入图片描述
整个工程如上。

二、解析Makefile

CROSS_COMPILE ?= arm-linux-gnueabihf- # 交叉编译的前缀
TARGET		  ?= ledc # 要生成的bin文件的名字

CC 				:= $(CROSS_COMPILE)gcc
LD 				:= $(CROSS_COMPILE)gcc
OBJCOPY			:= $(CROSS_COMPILE)objcopy
OBJDUMP			:= $(CROSS_COMPILE)objdump

# 包含头文件路径
INCUDIRS		:= imx6u \ #蛮重要的通用知识点!!!表示本行未结束,写到下一行
					bsp/clk \
					bsp/led \
					bsp/delay

# 源码路径组
SRCDIRS			:= project \
					bsp/clk \
					bsp/led \
					bsp/delay

INCLUDE			:= $(patsubst %, -I %, $(INCUDIRS))

SFILES 			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) # 遍历找出 SRCDIRS 路径组的所有路径下的 .S 文件
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) # 遍历找出 SRCDIRS 路径组的所有路径下的 .c 文件

SFILENDIR		:= $(notdir $(SFILES))
CFILENDIR		:= $(notdir $(CFILES))

SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) # 首先将 SFILENDIR 里面所有的 .S 都替换为 .o 后缀 \
															# 再在每个 .o 文件前面加上一个 obj/ 的路径
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))

OBJS			:= $(SOBJS)$(COBJS) # 所有 obj/ 路径下的 .o 文件

VPATH			:= $(SRCDIRS)

.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 # 将所有的 .S 文件编译为 .o 并且存放到 obj 目录。
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
	# 自动变量 $@, $<:目标文件集合;依赖目标集合的第一个文件
$(COBJS) : obj%.o : %.c # 将所有的 .c 文件编译为 .o 并且存放到 obj 目录。
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

clean:
	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).dis $(OBJS)


# 打印调试
print:
	@echo INCLUDE = $(INCLUDE)
	@echo SFILES  = $(SFILES)
	@echo CFILES  = $(CFILES)

如上,解释也都放在注释里。


三、移植步骤

以上Makefile 可作为多个工程的通用,每次移植只需修改个别地方。

  1. 修改 target
TARGET		  ?= beep
  1. 头文件路径
INCUDIRS		:= imx6u \ 
					bsp/clk \
					bsp/led \
					bsp/delay \
					bsp/beep
  1. 源文件路径
SRCDIRS			:= project \
					bsp/clk \
					bsp/led \
					bsp/delay \
					bsp/beep

经过以上3步,即完成修改,可在终端make。

参考

代码摘自正点原子Linux驱动教程,文档参考《跟我一起写Makefile》(开发板资料 / 04、参考资料)。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值