IMX6ULL学习笔记(四)

本文介绍IMX6ULL开发板上的裸机开发流程,重点讲解Makefile的编写技巧,包括变量声明与使用、操作符详解及实际案例。通过具体实例帮助读者掌握Makefile的编写方法。


IMX6ULL裸机开发学习

以下内容是我在学习正点原子IMX6ULL开发板alpha中记录的笔记,部分摘录自正点原子IMX6ULL开发手册。推荐看《跟我一起写Makefile》

Makefile中变量的使用

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上"$"符号,但最好
用小括号“()”或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”字符,
那么你需要用“$$”来表示。

操作符:=

为了防止“=”在变量中使用变量会造成无限的变量展开,比如下面这种情况

A = ${B}
B = ${A}

所以常用:=操作符来定义变量。

x := foo
y := ${x} bar
x := later
# 等价于
y := foo bar
x := later

这种方法,前面的变量不能使用后面的变量,只能使用前面已定义好了的变
量。 比如

y := ${x} bar
x := foo

那么y的值是bar,而不是foo bar

操作符?=

FOO ?= bar

其含义是,如果FOO没有被定义过,那么变量FOO的值就是bar,否则,这条语句什么也不做,相当于

ifeq ($(origin FOO), undefined)
FOO = bar
endif

Makefile练手

# 使用的交叉编译器
CROSS_COMPILER 	?= 	arm-linux-gnueabihf-
CC 				:= 	$(CROSS_COMPILER)gcc
LD 				:= 	$(CROSS_COMPILER)ld
OBJCOPY 		:= 	$(CROSS_COMPILER)objcopy
OBJDUMP 		:= 	$(CROSS_COMPILER)objdump

# 链接生成的文件名
TARGET 			:= 	led

# Make查找路径
VPATH 			:=	project \
					imx6ul \
					bsp/led \
					bsp/clk \
					bsp/delay \

# 工程所有.C .S .H 文件所在路径
INCLUDEDIRS 	:= 	project \
					imx6ul \
					bsp/led \
					bsp/clk \
					bsp/delay \

# 给路径加上 -I 参数,因为编译时需要对路径需要使用 -I 选项
INCLUDES 		:=	$(patsubst %, -I %, $(INCLUDEDIRS))

# 查找工程下所有的 .s .c 文件,包含路径
SFILES 			:= 	$(foreach dir, $(INCLUDEDIRS), $(wildcard $(dir)/*.s))
CFILES 			:= 	$(foreach dir, $(INCLUDEDIRS), $(wildcard $(dir)/*.c))

# 所有的 .s .c 文件 去掉前面的路径
SFILESNODIR		:= 	$(notdir $(SFILES))
CFILESNODIR		:= 	$(notdir $(CFILES))

# 获取所有的 .s .c 文件的文件名,将其后缀名改为 .o ,并添加 obj/ 前缀,这样编译生成的.o文件就会放置到 obj文件夹下
SOBJS			:= 	$(addprefix obj/, $(SFILESNODIR:.s=.o))
COBJS			:= 	$(addprefix obj/, $(CFILESNODIR:.c=.o))

OBJS 			:=  $(SOBJS) $(COBJS)

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

# SOBJS中所有匹配 obj/%.o 的文件名 所对应的依赖 %.s
$(SOBJS) : obj/%.o : %.s
	$(CC) -c -O2 $(INCLUDES) -o $@ $< 

# COBJS中所有匹配 obj/%.o 的文件名 所对应的依赖 %.c
$(COBJS) : obj/%.o : %.c
	$(CC) -c -O2 $(INCLUDES) -o $@ $<

.PHONY : clean
clean:
	rm -rf obj/*.o $(TARGET).bin $(TARGET).elf $(TARGET).dis load.imx

.PHONY : printf
printf:
	@echo INCLUDES=$(INCLUDES)
	@echo SFILES=$(SFILES)
	@echo CFILES=$(CFILES)
	@echo SFILESNODIR=$(SFILESNODIR)
	@echo CFILESNODIR=$(CFILESNODIR)
	@echo SOBJS=$(SOBJS)
	@echo COBJS=$(COBJS)
	@echo OBJS=$(OBJS)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值