@cyysu
2017-10-17T06:41:06.000000Z
字数 2109
阅读 851
- 时间:2017年10月16日
- 作者:Kali
- 邮箱:cyysu.github.io@gmail.com
- 版本:3.0
- 描述:Makefile-基础五,为Linux 4.4 Makefile中所遇到的知识点汇总
Makefile系列教程
# Makefile call函数例子
# call 函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式, 这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。其语法是:
$(call <expression>,<parm1>,<parm2>,<parm3>...)
# 当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参 数<parm1>,<parm2>,<parm3>依次取代。而<expression>的返回值就是call函数的返回值。
下面举个例子来说明
mj@DZ:~/桌面$ cat Makefile
SIGNAL = $(shell printf "\033[34;1m★\033[0m")
reverse = $2 $1
foo = $(call reverse, jhello,dawdad)
_all:
@echo $(foo)
mj@DZ:~/桌面$ make
dawdad jhello
# makefile patsubst函数
patsubst是patten substitude的缩写,匹配替代的意思。下面看一个例子
mj@DZ:~/桌面$ cat Makefile
SIGNAL = $(shell printf "\033[34;1m★\033[0m")
reverse = $2 $1
SRC = a.c b.c m.c.c
all:
@echo $(patsubst %.c,%.s,${SRC})
@echo $(patsubst %.c,%,${SRC})
@echo $(subst .c,.s, ${SRC})
# 执行结果
mj@DZ:~/桌面$ make
a.s b.s m.c.s
a b m.c
a.s b.s m.s.s
# 如果我们没有匹配上,那么会输出原字符串
mj@DZ:~/桌面$ cat Makefile
SIGNAL = $(shell printf "\033[34;1m★\033[0m")
reverse = $2 $1
SRC = a.c b.c m.c.c
all:
@echo $(patsubst "%.c","%.s",${SRC})
@echo $(patsubst %.c,%.s,${SRC})
@echo $(patsubst %.c,%,${SRC})
@echo $(subst .c,.s, ${SRC})
# 执行结果
mj@DZ:~/桌面$ make
a.c b.c m.c.c
a.s b.s m.c.s
a b m.c
a.s b.s m.s.s
# makefile notdir函数
功能: 从文件名序列 <names> 中取出非目录部分
# 下面来看一个例子
mj@DZ:~/桌面$ cat Makefile
SIGNAL = $(shell printf "\033[34;1m★\033[0m")
reverse = $2 $1
SRC = a.c b.c m.c.c
DD=$(notdir /home/a.c ./bb.c ../c.c d.c)
all1:
@echo $(DD)
mj@DZ:~/桌面$ make
a.c bb.c c.c d.c
########下面还有几个函数,大家可以自己去练习
取目录函数: $(dir <names...>)
功能: 从文件名序列 <names> 中取出目录部分
返回: 文件名序列 <names> 中的目录部分
# Makefile 内容
all:
@echo $(dir /home/a.c ./bb.c ../c.c d.c)
$ make
/home/ ./ ../ ./
取后缀函数: $(suffix <names...>)
功能: 从文件名序列 <names> 中取出各个文件名的后缀
返回: 文件名序列 <names> 中各个文件名的后缀, 没有后缀则返回空字符串
# Makefile 内容
all:
@echo $(suffix /home/a.c ./b.o ../c.a d)
$ make
.c .o .a
取前缀函数: $(basename <names...>)
功能: 从文件名序列 <names> 中取出各个文件名的前缀
返回: 文件名序列 <names> 中各个文件名的前缀, 没有前缀则返回空字符串
# Makefile 内容
all:
@echo $(basename /home/a.c ./b.o ../c.a /home/.d .e)
$ make
/home/a ./b ../c /home/
# foreach函数,直接用例子来说
mj@DZ:~/桌面$ cat Makefile
# Makefile 内容
targets := a b c d
objects := $(foreach i,$(targets),$(i).o)
all:
@echo $(targets)
@echo $(objects)
# 运行结果
mj@DZ:~/桌面$ make
a b c d
a.o b.o c.o d.o
上面的例子我是摘自下面这篇文章,书写格式也很悦目,大家可以查看一下
http://www.cnblogs.com/wang_yb/p/3990952.html
支付宝 微信