Makefile常用函数

1、过滤函数filter 和 filter-out

GOALS = install clean debug all

函数:filter
模板:$(filter pattern…,text)
功能:1)过滤掉字串“text”中所有不符合模式“pattern”的单词,保留所有符合此模式的单词。
2)存在多个模式时,模式表达式之间使用空格分割。
示例:gmake test
结果:Bad Target

ifeq ($(filter $(GOALS),$(MAKECMDGOALS)),)
	@echo "Bad Target"
endif

函数:filter-out
模板:$(filter-out pattern…,text)
功能:1)和“filter”函数实现的功能相反。过滤掉字串“text”中所有符合模式“pattern”的单词,保留所有不符合此模式的单词。
2)存在多个模式时,模式表达式之间使用空格分割。
示例:gmake test
结果:Bad Target

ifneq ($(filter-out $(GOALS),$(MAKECMDGOALS)),)
	@echo "Bad Target"
endif

2、字符串替换函数subst、patsubst、$(var:pattern=replacement)

函数:subst
模板:$(subst from,to,text)
功能:把字串“ text”中的“ from”字符替换为“ to”
示例:gmake
结果:a.o b.o.o

SRC = a.c b.c.c
OBJ = $(subst .c,.o,$(SRC))
Default:
	@echo $(OBJ)

函数:patsubst
模板:$(patsubst pattern,replacement,text)
功能:1)将字串“ text”中符合模式“pattern”的字符替换为“replacement”
2)pattern和replacement中使用%作为模式字符,匹配多个字符。
3)存在多个%时,第一个%作为模式字符,其余作为普通字符
示例:gmake
结果:a.o b.c.o

SRC = a.c b.c.c
OBJ = $(patsubst .c,.o,$(SRC))
Default:
	@echo $(OBJ)

函数:无
模板:$(var:pattern=replacement)
功能:将字串“ text”中符合模式“pattern”的字符替换为“replacement”
示例:gmake
结果:a.o b.c.o

SRC = a.c b.c.c
OBJ = $(SRC:.c=.o)
Default:
	@echo $(OBJ)

3、前缀后缀函数addsuffix、addprefix

函数:addprefix
模板:$(addprefix prefix,names…)
功能:为names列表各元素添加前缀prefix
示例:gmake
结果:../include/a.h ../include/b.h

SRC = a.h b.h 
INLCUDE = $(addprefix ../include/,$(SRC))
Default:
	@echo $(INCLUDE)

函数:addsuffix
模板:$(addsuffix suffix,names…)
功能:为names列表各元素添加后缀
示例:gmake
结果:a.c.ln

SRC = a.c
OBJ = $(addsuffix .ln,$(SRC))
Default:
	@echo $(OBJ)

4、文件匹配函数wildcard

函数:wildcard
模板:$(wildcard pattern…)
功能:列出当前目录下所有符合模式的 pattern格式的文件名
结果:输出当前目录所有.c和.h文件

SRC := $(wildcard *.c *.h)
Default:
	@echo $(SRC)

5、条件匹配函数if

函数:if
模板:$(if condition,then-part,else-part)
功能:if条件判断,true执行then-part,false执行else-part。
注意:虽然与ifeq功能一致,但ifeq属于Makefile关键字,不是函数。
结果:输出当前目录所有.h文件;若不存在,输出上一级目录所有.h文件

SRC := $(if $(wildcard .h),$1,../$1)
Default:
	@echo $(SRC)

6、函数调用call

函数:call
模板:$(call expression,parm1,parm2,parm3…)
功能:将parm1等作为参数,调用expression,获取返回值。
结果:==== a.c ====

SRC = a.c
log = "====" $1 "===="
Default:
	@echo $(call log,$(SRC))

7、控制函数error和warning

函数:error
模板:$(error text …)
功能:输出错误信息, 停止Makefile的运行。
结果:Makefile:2: *** this is error!. 中止.

Default:
	 $(error this is error!)
	 @echo "end"

函数:warning
模板:$(warning text …)
功能:输出警告信息, Makefile继续运行。
结果:Makefile:2: *** this is warning. end.

Default:
	 $(warning this is warning!)
	 @echo "end"

8、循环控制函数foreach

函数:foreach
模板:$(foreach var,list,command)
功能:循环对list元素进行command操作
结果:a a.o b b.o c c.o d d.o

SRC = a b c d
Default:
	 @echo $(foreach d,$(SRC),$d $d.o)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值