make 备忘清单 & make cheatsheet & 速查表
字符串处理函数 - 替换函数(subst)
把字串 <text> 中的 <from> 字符串替换成 <to> 。
$(subst <from>,<to>,<text>)
示例
$(subst ee,EE,feet on the street)
字符串处理函数 - 模式字符串替换函数(patsubst)
查找 <text> 中的单词(单词以空格、Tab或回车换行分隔)是否符合模式 <pattern>。匹配,则以 <replacement> 替换。
$(patsubst <pattern>,<replacement>,<text>)
- 示例
$(patsubst %.c,%.o,x.c.c bar.c)
把字串 x.c.c bar.c 符合模式 %.c 的单词替换成 %.o ,返回结果是 x.c.o bar.o
字符串处理函数 - 去空格函数(strip)
去掉 字串中开头和结尾的空字符。
$(strip <string>)
示例
$(strip a b c )
把字串 a b c 去掉开头和结尾的空格,结果是 a b c。
字符串处理函数 - 查找字符串函数(findstring)
在字串 <in> 中查找 <find> 字串。
$(findstring <find>,<in>)
示例:
$(findstring a,a b c)
$(findstring a,b c)
第一个函数返回 a 字符串,第二个返回空字符串
字符串处理函数 - 过滤函数(filter)
以 <pattern> 模式过滤 <text> 字符串中的单词,保留符合模式 <pattern> 的单词。可以有多个模式。
$(filter <pattern...>,<text>)
示例
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
$(filter %.c %.s,$(sources))
# 返回的值是 foo.c bar.c baz.s
字符串处理函数 - 反过滤函数(filter-out)
以 <pattern> 模式过滤 <text> 字符串中的单词,去除符合模式 <pattern> 的单词。可以有多个模式。
$(filter-out <pattern...>,<text>)
示例:
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
$(filter-out $(mains),$(objects))
# 返回值是 foo.o bar.o 。
字符串处理函数 - 取单词函数(word)
取字符串 <text> 中第 <n> 个单词。(从一开始)
$(word <n>,<text>)
示例:$(word 2, foo bar baz) 返回值是 bar
字符串处理函数 - 取单词串函数(wordlist)
- 从字符串 <text> 中取从 <s> 开始到 <e> 的单词串。<s> 和 <e> 是一个数字。
$(wordlist <ss>,<e>,<text>)
示例:$(wordlist 2, 3, foo bar baz) 返回值是 bar baz。
字符串处理函数 - 单词个数统计函数(words)
- 统计 <text> 中字符串中的单词个数。
$(words <text>)
- 示例:
$(words, foo bar baz)返回值是 3。
字符串处理函数 - 首单词函数(firstword)
- 取字符串 <text> 中的第一个单词。
$(firstword <text>)
- 示例:
$(firstword foo bar)返回值是foo
文件名操作函数
取目录函数(dir)
从文件名序列 <names> 中取出目录部分。目录部分是指最后一个反斜杠(/)之前的部分。如果没有反斜杠,那么返回 ./。
$(dir <names...>)
$(dir src/foo.c hacks)
#返回值是 src/ ./
取文件函数(notdir)
从文件名序列 <names> 中取出非目录部分。非目录部分是指最後一个反斜杠(/)之后的部分。
$(notdir <names...>)
$(notdir src/foo.c hacks)
# 返回值是 foo.c hacks
取后缀函数(suffix)
从文件名序列 <names> 中取出各个文件名的后缀
$(suffix <names...>)
$(suffix src/foo.c src-1.0/bar.c hacks)
# 返回值是 .c .c
取前缀函数(basename)
从文件名序列 <names> 中取出各个文件名的前缀部分。
$(basename <names...>)
$(basename src/foo.c src-1.0/bar.c hacks)
# 返回值是 src/foo src-1.0/bar hacks
加后缀函数(addsuffix)
把后缀 <suffix> 加到 <names> 中的每个单词后面
$(addsuffix <suffix>,<names...>)
$(addsuffix .c,foo bar)
# 返回值是 foo.c bar.c
加前缀函数(addprefix)
把前缀 <prefix> 加到 <names> 中的每个单词前面。
$(addprefix <prefix>,<names...>)
$(addprefix src/,foo bar)
# 返回值是 src/foo src/bar 。
连接函数(join)
把 <list2> 中的单词对应地加到 <list1> 的单词后面。
$(join <list1>,<list2>)
$(join aaa bbb , 111 222 333)
# 返回值是 aaa111 bbb222 333 。
其它函数
foreach 函数
$(foreach <var>,<list>,<text>)
# $(name) 中的单词会被挨个取出,并存到变量 n 中,
# $(n).o 每次根据 $(n) 计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回
names := a b c d
files := $(foreach n,$(names),$(n).o)
run:
echo $(files)
if 函数
与之前的条件语句——ifeq 类似
$(if <condition>,<then-part>)
# 或者
$(if <condition>,<then-part>,<else-part>)
call 函数
call 函数是唯一一个可以用来创建新的参数化的函数。
$(call <expression>,<parm1>,<parm2>,...,<parmn>)
reverse = $(2) $(1)
foo = $(call reverse,a,b)
run:
echo $(foo)
# b a
shell 函数
使用操作系统 Shell 的命令
contents := $(shell cat foo)
files := $(shell echo *.c)
控制 make 的函数
$(error <text ...>)
# and
$(warning <text ...>)
origin 函数
$(origin <variable>)
origin 函数用于告诉这个变量的从何而来
| :- | :- |
|---|---|
undefined | 如果 <variable> 未定义,返回 undefined |
default | 如果 <variable> 是默认的,如 CC |
environment | 如果 <variable> 是环境变量,并且当 Makefile 执行时,-e 参数没有被打开 |
file | 如果 <variable> 这个变量被定义在 Makefile 中。 |
command line | 如果 <variable> 这个变量是被命令行定义的。 |
override | 如果 <variable> 是被 override 指示符重新定义的。 |
automatic | 如果 <variable> 是一个命令运行中的自动化变量 |