欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Makefile学习

时间:2023-07-20
目的

快速了解一下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解决头文件依赖 写一个头文件,并把头文件添加到编译器的头文件的路径实时检查头文件的更新情况,一旦头文件发生变化,应该重新编译所有相关文件 较为完善的Makefile

ARCH?=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)

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。