Makefile 的常用函数#
函数调用,很像变量的使用,也是以 “$” 来标识的,其语法如下:
$(fn, arguments) or ${fn, arguments}
- fn: 函数名
- arguments: 函数参数,参数间以逗号
,
分隔,而函数名和参数之间以“空格”分隔
1 shell#
$(shell <command> <arguments>)
- 名称:shell 命令函数 —— shell
- 功能:调用 shell 命令 command
- 返回:函数返回 shell 命令 command 的执行结果
示例
# shell 指令,src 文件夹下找到 .cpp 文件 cpp_srcs := $(shell find src -name "*.cpp") # shell 指令, 获取计算机架构 HOST_ARCH := $(shell uname -m)
2 subst#
$(subst <from>,<to>,<text>)
- 名称:字符串替换函数——subst
- 功能:把字串 \
- 返回:函数返回被替换过后的字符串
示例:
cpp_srcs := $(shell find src -name "*.cpp") cpp_objs := $(subst src/,objs/,$(cpp_objs))
3 patsubst#
$(patsubst <pattern>,<replacement>,<text>)
- 名称:模式字符串替换函数 —— patsubst
- 功能:通配符
%
,表示任意长度的字串,从 text 中取出 patttern, 替换成 replacement- 返回:函数返回被替换过后的字符串
示例
cpp_srcs := $(shell find src -name "*.cpp") #shell指令,src文件夹下找到.cpp文件 cpp_objs := $(patsubst %.cpp,%.o,$(cpp_srcs)) #cpp_srcs变量下cpp文件替换成 .o文件
4 foreach#
$(foreach <var>,<list>,<text>)
- 名称:循环函数——foreach。
- 功能:把字串\
- 中的元素逐一取出来,执行\
- 返回:\
示例:
library_paths := /datav/shared/100_du/03.08/lean/protobuf-3.11.4/lib \ /usr/local/cuda-10.1/lib64 \ library_paths := $(foreach item,$(library_paths),-L$(item))
同等效果
I_flag := $(include_paths:%=-I%)
5 dir#
$(dir <names...>)
- 名称:取目录函数——dir。
- 功能:从文件名序列
的部分。如果没有反斜杠,那么返回“./”。
- 返回:返回文件名序列
- 示例:
$(dir src/foo.c hacks) # 返回值是“src/ ./”。
6 notdir#
$(notdir <names...>)
示例
libs := $(notdir $(shell find /usr/lib -name lib*))
7 filter#
$(filter <names...>)
libs := $(notdir $(shell find /usr/lib -name lib*))
a_libs := $(filter %.a,$(libs))
so_libs := $(filter %.so,$(libs))
8 basename#
$(basename <names...>)
libs := $(notdir $(shell find /usr/lib -name lib*))
a_libs := $(subst lib,,$(basename $(filter %.a,$(libs))))
so_libs := $(subst lib,,$(basename $(filter %.so,$(libs))))