makefile 中 wildcard、notdir、patsubst、addprefix 解释

目录

wildcard 获取跟当前模式匹配的文件名

查找一层目录

查找多层目录

notdir 去文件路径

 patsubst 模式替换

addprefix 加前缀函数


wildcard 获取跟当前模式匹配的文件名

查找一层目录

这个命令是文件名处理函数:$(wildcard pattern),获取跟当前模式匹配的文件名;

#定义代码目录
SRC_DIR = src

#查找所有目录下所有cpp文件
sources := $(wildcard $(SRC_DIR)/*.cpp)

#打印变量值
$(info( $(sources))

实践出真知,自己动手写一个Makefile,执行这两行命令,执行makefile能够列出src文件夹下的所有cpp文件;

同时发现一个问题,此命令找不到src文件夹下的二级目录下的cpp文件,此时要进一步完善Makefile,

查找多层目录

如下:(牵扯到在Makefile中执行shell命令)

#定义代码目录
SRC_DIR = src

#查找代码目录下递归文件夹下的文件夹,最多查到src文件夹下三级文件夹
DIRS := $(shell find $(SRC_DIR) -maxdepth 3 -type d)

#查找所有目录下所有cpp文件
sources := $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp)

#打印变量值
$(info( $(sources))

执行结果能够看出,此makefile 已经能找到src目录下3级文件夹的cpp文件。

notdir 去文件路径

这个是文件名处理函数,去除查到源文件的路径,取文件名,src/main.cpp ------>main.cpp

#定义代码目录
SRC_DIR = src

#查找代码目录下递归文件夹下的文件夹,最多查到src文件夹下三级文件夹
DIRS := $(shell find $(SRC_DIR) -maxdepth 3 -type d)

#查找所有目录下所有cpp文件,包含路径
sources := $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp)

#取出文件名,不包含文件路径
sources_name := $(notdir $(sources))

#打印变量值
$(info($(sources_name)))

 patsubst 模式替换

这个是文本处理函数,模式替换函数

$(patsubst pattern,replacement,text),将 text中 符合模式pattern的替换为replacement;其中%表示一个单词含任意个字符

继续完善前文中的例子,由.cpp文件生成.o文件:

#定义代码目录
SRC_DIR = src

#查找代码目录下递归文件夹下的文件夹,最多查到src文件夹下三级文件夹
DIRS := $(shell find $(SRC_DIR) -maxdepth 3 -type d)

#查找所有目录下所有cpp文件,包含路径
sources := $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp)

#取出文件名,不包含文件路径
sources_name := $(notdir $(sources))

#由cpp得到.o文件
OBJS = $(patsubst %.cpp, %.o, $(notdir $(sources))

#打印变量值
$(info($(OBJS)))

addprefix 加前缀函数

这个是文件名处理函数

$(addprefix PREFIX,NAMES…)::为“NAMES…”中的每一个文件名添加前缀“PREFIX”。参数“NAMES…”是空格分割的文件名序列,将“SUFFIX”添加到此序列的每一个文件名之前。

$(addprefix src/,foo bar)


返回值为“src/foo src/bar”。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值