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



