博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
makefile 常用函数
阅读量:6998 次
发布时间:2019-06-27

本文共 3477 字,大约阅读时间需要 11 分钟。

hot3.png

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。今天我们来学习下makefile的常用函数。

《GNU make》

1. 绝对路径 abspath 函数

abspath 函数被用于将 names列表 中的各路径名转换成绝对路径,并将转换后的结果返回。 其形式是:

$(abspath names…)

示例:

.PHONY: allROOT := $(abspath /usr/../lib /etc/init.d/../)all: 	@echo $(ROOT)

执行结果

$ make/lib /etc

2. 增加前缀 addprefix 函数

addprefix 函数被用于给名字列表 names 中的每一个name增加前缀prefix, 并将增加了前缀的名字列表返回。 其形式是:

$(addprefix prefix,names…)

示例:

.PHONY: allwithout_dir = foo.c bar.c main.owith_dir := $(addprefix src/, $(without_dir))all:	@echo $(with_dir)

执行结果

$ make -f makefile-addprefix src/foo.c src/bar.c src/main.o

3. 增加后缀 addsuffix 函数

addsuffix 函数被用于给名字列表 names... 中的每一个名字增加后缀 suffix, 并将增加了后缀suffix的名字列表返回。 其形式是:

$(addsuffix suffix,names…)

示例:

.PHONY: allwithout_suffix = foo bar mainwith_suffix = $(addsuffix .c, $(without_suffix))all:	@echo $(with_suffix)

执行结果

$ make foo.c bar.c main.c

4. 创建定制化参数函数 call 函数

call 函数用来构造新的带参函数,其语法类似于C语言的 printf 函数。 其形式是:

$(call variable,param,param,…)

示例:

.PHONY: allreverse = $(2)$(1)foo = $(call reverse, a, b)all:	@echo $(foo)

执行结果

$ makeb a

5. 非展开取值 value 函数

函数 "value" 提供了一种在不对变量进行展开的情况下获取变量值的方法 其形式是:

$(value variable)

示例:

.PHONY: allP = barfoo = $PATH  # $P 会被展开为barall:	@echo $(foo)	@echo $(value foo)

执行结果

$ make barATH/home/jerry/bin:/home/jerry/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/go/bin

6. eval 函数

eval 函数的存在使得 Makefile 具有动态语言的特性。eval 函数使得 make 将再一次解析 text 语句。eval 函数的返回值为空字符串。 其形式是:

$(eval text)

示例:

pointer := pointer_valuedefine foo	arg := $1	$$($1) := ooooendefbefore:	$(info $(call foo,pointer))	@echo arg = $(arg) pointer_value = $(pointer_value)end: 	$(eval $(call foo,pointer))	@echo arg = $(arg) pointer_value = $(pointer_value)

执行结果

$ make before -f makefile-eval 	arg := pointer	$(pointer) := ooooarg = pointer_value =$ make end -f makefile-eval arg = pointer pointer_value = oooojerry@ubuntu:~/makefile/file/demo4$

由于在before中,函数foo并未执行,所以变量 arg 和 pointer_value 未被定义过,因此其值为空。

7. 过滤 filter 函数

filter 函数返回 text 中匹配任意一条 pattern 规则的单词 其形式是:

$(filter pattern…,text)

示例:

.PHONY: allsrc = foo.c foo.h bar.c bar.h baz.ssrc := $(filter %.c %.s, $(src))all:	@echo $(src)

执行结果

$ makefoo.c bar.c baz.s

8. 过滤后 filter-out 函数

filter-out 函数返回 text中被 pattern 过滤后剩下的单词 其形式是:

$(filter-out pattern…,text)

示例:

.PHONY: allsrc = foo.c foo.h bar.c bar.h baz.ssrc := $(filter-out %.c %.s, $(src))all:	@echo $(src)

执行结果

$ makefoo.h bar.h

9. 去路径 notdir 函数

notdir 函数被用来从路径 names... 中抽取文件名并返回。 其形式是:

$(notdir names...)

示例:

.PHONY: allfile_name := $(notdir code/foo/src/foo.c code/bar/src/bar.c baz.s)all:	@echo $(file_name)

执行结果

$ makefoo.c bar.c baz.s

10. 匹配替换 patsubst 函数

patsubst 函数被用来将名字 text 中符合 pattern 模式的名字替换为 replacement,并将替换后的名字列表返回。 其形式是:

$(patsubst pattern,replacement,text)

示例:

.PHONY: allsrc = foo.c bar.c baz.cobj = $(patsubst %.c, %.o, $(src))all:	@echo $(obj)

执行结果

$ makefoo.o bar.o baz.o

11. 真实路径 realpath 函数

realpath函数被用于获取 names... 所对应的真实路径名。 其形式是:

$(realpath names…)

示例:

.PHONY: allROOT := $(realpath ./.. ./../..)all:	@echo $(ROOT)

执行结果

make/home/jerry/makefile/file /home/jerry/makefile

12. 去空格 strip 函数

strip 去掉string中的多余空格并返回 其形式是:

$(strip string)

示例:

.PHONY: allstring = 12 3   4    5str_strip = $(strip $(string))all:	@echo $(str_strip)

执行结果

$ make12 3 4 5

13. 通配符函数 wildcard 函数

其形式是:

$(wildcard pattern)

示例:

.PHONY: allSRC = $(wildcard *.c)all:    @echo $(SRC)

执行结果

$ lsfoo.c foo.h bar.c bar.h$ makefoo.c bar.c

转载于:https://my.oschina.net/u/3045933/blog/2989070

你可能感兴趣的文章