当前位置:   article > 正文

IMX6ULL学习笔记(四)_$(sobjs) : obj/%.o : %.s $(cc) -wall -nostdlib -c

$(sobjs) : obj/%.o : %.s $(cc) -wall -nostdlib -c -o2 $(include) -o $@ $<


IMX6ULL裸机开发学习

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

Makefile中变量的使用

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

操作符:=

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

A = ${B}
B = ${A}
  • 1
  • 2

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

x := foo
y := ${x} bar
x := later
# 等价于
y := foo bar
x := later
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

y := ${x} bar
x := foo
  • 1
  • 2

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

操作符?=

FOO ?= bar
  • 1

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

ifeq ($(origin FOO), undefined)
FOO = bar
endif
  • 1
  • 2
  • 3

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/521704
推荐阅读
相关标签
  

闽ICP备14008679号