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

 

posted @   roverqqq  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示