目录
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”。