内嵌函数表格
函数 | 描述 | 示例 |
---|---|---|
文本处理函数 | ||
$(subst FROM,TO,TEXT) | 将 TEXT 中的 FROM 替换为 TO 。 | $(subst .c,.o,main.c) → main.o |
$(patsubst PATTERN,REPLACEMENT,TEXT) | 将 TEXT 中符合 PATTERN 的部分替换为 REPLACEMENT 。 | $(patsubst %.c,%.o,main.c utils.c) → main.o utils.o |
$(strip TEXT) | 去除 TEXT 开头和结尾的空格,并将中间多个空格合并为一个。 | $(strip hello world ) → hello world |
$(findstring FIND,TEXT) | 在 TEXT 中查找 FIND ,如果找到则返回 FIND ,否则返回空。 | $(findstring foo,foobar) → foo |
$(filter PATTERN...,TEXT) | 返回 TEXT 中符合 PATTERN 的部分。 | $(filter %.c,main.c utils.o) → main.c |
$(filter-out PATTERN...,TEXT) | 返回 TEXT 中不符合 PATTERN 的部分。 | $(filter-out %.c,main.c utils.o) → utils.o |
$(sort LIST) | 对 LIST 中的单词进行排序并去重。 | $(sort foo bar foo) → bar foo |
文件名处理函数 | ||
$(dir NAMES...) | 提取 NAMES 中的目录部分。 | $(dir src/main.c) → src/ |
$(notdir NAMES...) | 提取 NAMES 中的文件名部分(去掉目录)。 | $(notdir src/main.c) → main.c |
$(suffix NAMES...) | 提取 NAMES 中的后缀部分。 | $(suffix main.c utils.o) → .c .o |
$(basename NAMES...) | 提取 NAMES 中的主文件名部分(去掉后缀)。 | $(basename main.c utils.o) → main utils |
$(addsuffix SUFFIX,NAMES...) | 为 NAMES 中的每个文件名添加 SUFFIX 。 | $(addsuffix .o,main utils) → main.o utils.o |
$(addprefix PREFIX,NAMES...) | 为 NAMES 中的每个文件名添加 PREFIX 。 | $(addprefix src/,main.c utils.c) → src/main.c src/utils.c |
$(wildcard PATTERN) | 匹配当前目录下符合 PATTERN 的文件。 | $(wildcard *.c) → main.c utils.c |
条件判断函数 | ||
$(if CONDITION,THEN-PART[,ELSE-PART]) | 如果 CONDITION 非空,则返回 THEN-PART ,否则返回 ELSE-PART 。 | $(if foo,bar,baz) → bar |
$(or COND1,COND2,...) | 返回第一个非空的参数。 | $(or ,,foo) → foo |
$(and COND1,COND2,...) | 如果所有参数都非空,则返回最后一个参数,否则返回空。 | $(and foo,bar) → bar |
其他函数 | ||
$(foreach VAR,LIST,TEXT) | 遍历 LIST ,将每个值赋给 VAR ,并展开 TEXT 。 | $(foreach f,main.c utils.c,src/$f) → src/main.c src/utils.c |
$(shell COMMAND) | 执行 shell 命令并返回结果。 | $(shell ls) → 当前目录下的文件列表。 |
$(error TEXT) | 输出错误信息并停止执行。 | $(error Something went wrong) → 输出错误并停止。 |
$(warning TEXT) | 输出警告信息,但继续执行。 | $(warning This is a warning) → 输出警告但继续执行。 |
详细说明
1. 文本处理函数
-
$(subst FROM,TO,TEXT)
:-
将
TEXT
中的FROM
替换为TO
。 -
示例:
$(subst .c,.o,main.c utils.c) # 返回 main.o utils.o
-
-
$(patsubst PATTERN,REPLACEMENT,TEXT)
:-
将
TEXT
中符合PATTERN
的部分替换为REPLACEMENT
。 -
示例:
$(patsubst %.c,%.o,main.c utils.c) # 返回 main.o utils.o
-
-
$(strip TEXT)
:-
去除
TEXT
开头和结尾的空格,并将中间多个空格合并为一个。 -
示例:
$(strip hello world ) # 返回 hello world
-
2. 文件名处理函数
-
$(wildcard PATTERN)
:-
匹配当前目录下符合
PATTERN
的文件。 -
示例:
$(wildcard *.c) # 返回所有 .c 文件
-
-
$(addprefix PREFIX,NAMES...)
:-
为
NAMES
中的每个文件名添加PREFIX
。 -
示例:
$(addprefix src/,main.c utils.c) # 返回 src/main.c src/utils.c
-
3. 条件判断函数
-
$(if CONDITION,THEN-PART[,ELSE-PART])
:-
如果
CONDITION
非空,则返回THEN-PART
,否则返回ELSE-PART
。 -
示例:
$(if foo,bar,baz) # 返回 bar
-
4. 其他函数
-
$(foreach VAR,LIST,TEXT)
:-
遍历
LIST
,将每个值赋给VAR
,并展开TEXT
。 -
示例:
$(foreach f,main.c utils.c,src/$f) # 返回 src/main.c src/utils.c
-
-
$(shell COMMAND)
:-
执行 shell 命令并返回结果。
-
示例:
$(shell ls) # 返回当前目录下的文件列表
-
示例:综合使用内嵌函数
以下是一个完整的 Makefile 示例,展示了如何使用内嵌函数:
# 源文件
SRCS = main.c utils.c
# 目标文件
OBJS = $(patsubst %.c,%.o,$(SRCS))
# 默认目标
all: program
# 链接目标
program: $(OBJS)
$(CC) -o $@ $^
# 编译规则
%.o: %.c
$(CC) -c $< -o $@
# 清理规则
clean:
rm -f $(OBJS) program
关键点
-
$(patsubst)
:用于将.c
文件替换为.o
文件。 -
$(wildcard)
:用于匹配文件。 -
$(foreach)
:用于遍历列表并生成新的列表。