makefile文件语法
规则格式
目标:依赖文件集合
命令1
命令2
注意:每条命令需要以TAB键开头
变量
= :赋值符,注意变量真实值取决于引用变量的最后一次有效值
:= :赋值符,注意变量真实值只会使用前面定义好的
?= :赋值符,如果变量赋值了,就不做操作,如果未被赋值,等于引用值
+= :变量追加
自动化变量
$@ --代表目标文件(target)
$^ --代表所有的依赖文件(components)
$< --代表第一个依赖文件(components中最左边的那个)。
$? --代表当前目标所依赖的文件列表中比当前目标文件还要新的文件。
$* --不包括后缀名的当前依赖文件的名字
makefile的函数
用法:
${函数名 参数集合} 或是 $(函数名 参数集合)
函数subst : 函数用于字符串的替换
此函数的功能是将字符串 中的内容替换为
$(subst < from > ,< to >,< test >)
函数 patsubst:函数用于完成模式字符串替换
此函数功能是查找test文件中是否有patten ,如果有用replacement替换
$(patsubst < pattern > ,< replacement >,< test >)
函数dir :函数用于获取目录
此函数功能是从nams中提取出目录部分
$(dir< names*** > )
函数nodir :函数用于获取文件名
此函数功能是从nams中提取出目录部分
$(nodir< names*** > )
函数foreach:函数用于完成循环
此函数功能是将list中变量逐个取出,放入参数 var 中,再执行Texe内操作,执行输出再组成字符串输出
$(foreach < var >,< list >,< text >)
函数wildcard:作用类似于通配符%,只是%适用于规则中,而定义变量与函数使用时,需使用wildcard函数
此函数功能是类似通配符%,获取后缀为.c的文件名集合
$(wildcard *.c)
注意事项:
1.通配符%:例如 %.o – 代表着本文件夹下后缀以.o的文件集合
%.s --代表着本文件夹下后缀以.s的文件集合
2. makeflie语法类似于字符串
makefile文件示例:
CROSS_COMPILE ?= arm-linux-gnueabihf- //先进行判断,再赋值操作
TARGET ?= bsp
CC := $(CROSS_COMPILE)gcc
LD:= $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
INCDIRS := imx6ul \ //头文件
bsp/clk \
bsp/led \
bsp/delay
SRCDIRS:= project \ //源文件
bsp/clk \
bsp/led \
bsp/delay
INCLUDE:= $(patsubst %, -I %, $(INCDIRS)) //函数patsubst进行字符串替换 将头文件路径加入 -I后进行替换
//获取源文件夹下所有.s文件并且加上路径
SFILES:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) //函数foreach进行循环操作,将SRCDIRS当作参数放入dir中,再执行wildcard获取文件夹下的.s文件 */
//获取源文件夹下所有.c文件并且加上路径
CFILES:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) //*/
//去掉SFILES中的路径
SFILENDIR:= $(notdir $(SFILES)) //函数notdir将变量中去掉路径
//去掉CFILES中的路径
CFILENDIR:= $(notdir $(CFILES))
//临时生成文件
//将SFILENDIR中的.S文件后缀替换成.O,并且添加路径 obj/
SOBJS:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) //此处中(SFILENDIR:.S=.o)是将.s文件替换成.o
//将SFILENDIR中的.c文件后缀替换成.O,并且添加路径 obj/
COBJS:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
//将SOBJS COBJS组合
OBJS:= $(SOBJS) $(COBJS)
//指定文件搜索路径,如果没有只会在当前文件夹内搜索
VPATH:= $(SRCDIRS)
//声明
.PHONY: clean
$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.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
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)