快速了解一下Makefile,为了RVOS课程
Makefile规则target:prerequisites #目标:依赖的文件或者其他目标cmd_1cmd_2cmd_3.PHONY:clean#伪目标clean:cmd
Makefile变量、模式匹配 变量
系统变量
.PHONY: allall:echo "$(CC)" echo "$(AS)" echo "$(MAKE)" #输出结果#echo "cc" #cc#echo "as" #as#echo "make" #make
自定义变量
=,延迟赋值(引用此变量的时候才赋值)
A=123B=$(A)A=456.PHONY: allall:echo "$(B)" #输出结果#456
:=,立即赋值
A=123B:=$(A)A=456.PHONY: allall:echo "$(B)" #输出结果#123
?=,空赋值(变量为空的时候才有效)
A?=123#B:=$(A)A?=456.PHONY: allall:echo "$(A)" #输出结果#123
+=,追加赋值(不会改变变量的值)
A?=123#B:=$(A)A+=456.PHONY: allall:echo "$(A)" #输出结果#123 456
自动化变量
$<,第一个依赖文件
$^,全部的依赖文件
$@,目标
all:targeta targetbecho "$<"echo "$^"echo "$@"targeta:targetb:#输出结果#echo "targeta"#targeta#echo "targeta targetb"#targeta targetb#echo "all"#all
模式匹配%,匹配任意多个非空字符
类似于shell的*通配符
%:echo "$@"
默认规则.o文件默认使用.c文件编译
Makefile条件分支ifeq(var1,var2)....else....endif
ifneq(var1,var2)....else....endif
Makefile常用函数 patsubst模式替换函数
.PHONY:allall:echo "$(patsubst %.c,%.o,x.c.c bar.c)"
把字串“x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果 是“x.c.o bar.o”
notdir取文件名函数
.PHONY:allall:echo "$(notdir src/foo.c hacks)"
返回值为:“foo.c hacks”
wildcard获取匹配模式文件名函数
.PHONY:allall:echo "$(wildcard *.c)"
返回值为当前目录下所有.c 源文件列表
foreach函数“foreach”不同于其它函数。它是一个循环函数。类似于 Linux 的 shell 中的 for 语句
dirs := a b c d files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)).PHONY:allall:echo "$(files)"
把文件夹里边的文件全部找出来
Makefile解决头文件依赖 写一个头文件,并把头文件添加到编译器的头文件的路径实时检查头文件的更新情况,一旦头文件发生变化,应该重新编译所有相关文件 较为完善的MakefileARCH?=x86ifeq ($(ARCH),x86)CC=gccelse CC=arm-linux-gnueabihf-gccendifTARGET=mp3BUILD_DIR=buildSRC_DIR=module1 module2INC_DIR=includeCFLAGS=$(patsubst %,-I%,$(INC_DIR))INCLUDE= $(foreach dir,$(INC_DIR),$(wildcard $(dir)/*.h))SOURCES= $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES)))VPATH=$(SRC_DIR)$(BUILD_DIR)/$(TARGET):$(OBJS)$(CC) $^ -o $@ $(CFLAGS)$(BUILD_DIR)/%.o:%.c $(INCLUDE) | create_build$(CC) -c $< -o $@.PHONY:create_buildcreate_build:mkdir -p $(BUILD_DIR).PHONY:cleanclean:rm -rf $(BUILD_DIR)