跳转至

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))))