makefile
单行变量
- var = hello 替换 - var += test 追加 - var := hello 常量 - var ?= hello 若没定义过,则定义,若定义过,则忽略 - foo = hello.c heq.c - bar = $(foo:.c=.o) 使用foo变量初始化bar变量,并将.c更换为.o
多行变量
var代表下面两行内容 define var echo "hello" echo "test" endef
使用变量
$var
${var}
自动化变量
a.%.b:%.c - $@:所有目标,a.foo.b - $<:依赖中的每一个,a.c - $^:依赖中的所有,*.c - $*:目标中%及之前的内容,a.foo
通配符
- *:所有
- %:模式匹配,代表任意一个
文件搜索路径
1. 通过变量VPATH 2. 通过关键字vpath 举例:.h文件存放在include文件夹下,.c文件存放在src文件夹下 通过VPATH: VPATH = ./include:./src 通过vpath: vpath %h ./include vpath %c ./src 注意:makefile路径与gcc路径不同 makefile文件搜索路径是指make中目标和依赖文件所在的路径,命令中源文件包含的头文件路径需要使用gcc的-I参数指定
makefile执行步骤
读入所有被include的makefile文件
解析变量
推导隐晦规则
为所有目标生成依赖关系
根据依赖关系,决定哪些目标需要重新生成
执行命令
字符串函数
- 取字符串中单词 - word,wordlist,words - $(word 1,test)取test中第一个单词 - $(wordlist 2,4,test):取test中第2到4个单词 - $(words test):计算test中单词个数 - 单词替换 - subst,patsubst - $(subst old,new,test):将test中的old替换成new - $(patsubst old,new,test):使用正则表达式替换,$(patsubst %.c,%.o,test) - 过滤与反过滤 - filter,filter-out - $(filter %.c,test):过滤test中所有以.c结尾的单词,并返回 - $(filter-out %.c,test):与filter相反 - 去空格 - strip - $(strip test):去除test中所有空格 - 查找 - findstring - $(findstring str,test):查找test中是否有str字符串,若有,返回str,否则返回空
文件函数
- dir:获取目录 - $(dir name):返回目录 - notdir:获取文件名 - $(notdir name):返回文件名 - suffix:获取后缀 - $(suffix name):返回name的后缀 - basename:获取前缀 - $(basename name):返回name的前缀 - addsuffix:添加后缀 - $(addsuffix .c,name):为name添加后缀.c - addprefix:添加前缀 - $(addprefix foo,name):为name添加前缀foo
控制函数
$(if 条件表达式,执行语句) $(foreach n,list,a$(n)):将list中每个单词依次赋值给n,执行最后一条语句
条件控制
ifeq (var1,var2) else endif
自动依赖头文件
OBJS = $(patsubst %.c,%.o,$(filter %.c,$(shell ls))) -include $(OBJS:%.o=%.d) %.d : %.c @set -e;rm -f $@;\ $(CC) -MM $(CFLAGS) $< > $@.$$$$;\ sed 's,\($*\)\.o [ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\ rm -f $@.$$$$
make命令参数
make 命令参数详解 -f : 指定make的文件 make -f makefile.common -C : 编译指定目录 make -C subdir -j : 多线程编译 make -j4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了