makefile的内嵌函数

内嵌函数表格

函数描述示例
文本处理函数
$(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

关键点

  1. $(patsubst):用于将 .c 文件替换为 .o 文件。

  2. $(wildcard):用于匹配文件。

  3. $(foreach):用于遍历列表并生成新的列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值