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> 是一个命令运行中的自动化变量