Makefile规则(四):函数

来源:互联网 发布:nginx下载 编辑:程序博客网 时间:2024/05/16 16:42

介绍函数前,先将条件判断简单的描述下,语法:
ifeq/ifneq/ifdef/ifndef <condition>
<text-if-true>
endif


ifeq/ifneq/ifdef/ifndef <condition>
<text-if-true>
else
<text-if-false>
endif


ifeq/ifneq (<arg1>,<arg2>)
ifeq/ifneq ($(strip $(foo)),)


ifeq/ifneq:分别表示,ifeq若strip函数的返回值是空,则<condition>成立,执行<text-if-true>;ifneq 则反之。即ifeq表示arg1和arg2的值是否相同ifneq表示arg1和arg2的值是否不同

ifdef/ifndef <variable-name>
ifdef/ifndef:分别表示,var是否已定义,var是否没定义。

对于条件判断有几点注意的,就是条件判断不是命令,故不能以Table键开始。还有不要把自动化变量$@等,放入条件表达式中。


函数:函数调用后,返回值可当作变量用。
$(<function> <arguments>)

${<function> <arguments>}

一、 字符串处理函数
1、 subst:字符串替换函数
$(subst <from>,<to>,<text>)
功能:把字串<text>中的<from>字符串替换成<to>.
返回:函数返回被替换后的字符串

$(subst ee,EE,feet on the street)àfEEt on the street

2、 patsubst:模式字符串替换函数
$(patsubst <pattern>,<replacement>,<text>)
功能:查找<text>中符合模式<pattern>的字串,并将符合模式的字串用<replacement>替换。
返回:函数返回替换后的字符串。

$(patsubst %.c,%.o,x.c.c bar.c)àx.c.o bar.o

3、 strip:去空格函数
$(strip <string>)
功能:去掉<string>字符串开头和结尾的空字符
返回:返回去掉空格后的字符串

$(strip a b c)àa b c

4、 findstring:查找字符串函数
$(findstring <find>,<in>)
功能:在字串<in>中查找<find>字串
返回:若找到,返回<find>,否则,返回空字符串

$(findstring a, a b c)àa
$(findstring a, b c)à空字符串

5、 filter:过滤函数
$(filter <pattern…>,<text>)
功能:<pattern…>是表示可以有多个模式,如:%.c %.s,以<pattern…>模式过滤<text>字串中的单词
返回:返回符合模式<pattern…>的字串

sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) –o foo
$(filter %.c %.s,$(sources))àfoo.c bar.c baz.s

6、 filter-out:反过滤函数
$(filter-out <pattern…>,<text>)
功能:与filter相反,去掉符合模式<pattern…>的字符串
返回:返回不符合模式<pattern…>的字符串

objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
$(filter-out $(mains),$(objects))àfoo.o bar.o

7、 sort:排序函数
$(sort <list>)
功能:给字符串<list>中的单词排序(升序)
返回:返回排序后的字符串
$(sort foo bar lose)àbar foo lose,sort会去掉<list>中相同的单词。

8、 word:取单词函数
$(word <n>,<text>)
功能:取字符串<text>中第n个单词,从1开始计数。
返回:返回第n个单词,如果n大于<text>的单词个数,则返回空字符串。

$(word 2, foo bar baz)àbar

9、 wordlist:取单词串函数
$(wordlist <s>,<e>,<text>)
功能:从字符串<text>中取从s个开始到e个的单词串,就是取一段范围的单词串。
返回:若s大于<text>单词个数,返回空字符串;若e大于<text>的单词个数,则返回从s个单词开始到结尾的单词串。

$(wordlist 2,3, foo bar baz)àbar baz

10、words:单词个数统计函数
$(words <text>)
功能:统计<text>的单词个数
返回:返回<text>中的单词数

$(words, foo bar baz)à3
若要取<text>中的最后一个单词,$(word $(words <text>),<text>)

11、firstword:首单词函数
 $(firstword <text>)
 功能:取字符串<text>的第一个单词
 返回:返回字符串<text>的第一个单词。

 $(firstword foo bar)àfoo
 ó$(word 1,<text>)
12、示例:
 VPATH=src:../headers
 override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))è
 $(patsubst %,-I%,$(subst :, ,$(VPATH)))à-Isrc –I../headers.
 

二、 文件名操作函数

1、 dir:取目录函数
$(dir <names…>)
功能:从文件名序列<names>中取出目录部分。目录部分指最后一个斜杠之前的部分,若没有斜杠,则返回./
返回:返回文件名序列<names…>的目录部分

$(dir src/foo.c hacks)àsrc/ ./

2、 notdir:取文件函数
$(notdir <names…>)
功能:从文件名序列<names…>中取出非目录部分。非目录部分指最后一个斜杠/之后的部分
返回:返回文件名序列<names…>的非目录部分

$(notdir src/foo.c hacks)àfoo.c hacks

3、 suffix:取后缀函数
$(suffix <names…>)
功能:从文件名序列<names…>中取出各个文件名的后缀
返回:返回文件名序列<names…>的后缀序列,若文件没有后缀,则返回空字符串

$(suffix src/foo.c src-1.0/bar.c hacks)à.c .c

4、 basename:取前缀函数
$(basename <names…>)
功能:从文件名序列<names…>中取出各个文件名的前缀部分
返回:返回文件名序列<names…>的前缀序列,如果文件没有前缀,则返回空字串

$(basename src/foo.c src-1.0/bar.c hacks)àsrc/foo src-1.0/bar hacks

5、 addsuffix:加后缀函数
$(addsuffix <suffix>,<names…>)
功能:把后缀<suffix>加到<names>中的每个单词的后面
返回:返回加过后缀的文件名序列

$(addsuffix .c,foo bar)àfoo.c bar.c

6、 addprefix:加前缀函数
$(addpreifx <prefix>,<names…>)
功能:把前缀<prefix>加到<names…>中的每个单词的前面
返回:返回加过前缀的文件名序列

$(addprefix src/,foo bar)àsrc/foo src/bar

7、 join:连接函数
$(join <list1>,<list2>)
功能:把<list2>中的单词一一对应次序加入到<list1>的单词后面,若<list1>长于<list2>,则<list1>多余出来的单词保持原样;若<list2>长于<list1>,则将list2的多余单词复制过来
返回:返回连接后的字符串

$(join aaa bbb,111 222 333)àaaa111 bbb222 333


三、 foreach:循环函数
$(foreach <var>,<list>,<text>)
功能:把<list>中的单词逐一取出放入参数<var>中,再执行<text>。每一次<text>会返回一个字符串,循环过程中,返回的每个字符串以空格分隔。

name := a b c d
files := $(foreach n,$(names),$(n).o)àa.o b.o c.o d.o

四、 if函数
$(if <condition>,<then-part>)

$(if <condition>,<then-part>,<else-part>)

若<condition>返回非空,则执行<then-part>,否则执行<else-part>,返回值为<then-part>或<else-part>。若<condition>不成立,<else-part>没定义,则返回空字符串。

五、 call函数
$(call <expression>,<parm1>,<parm2>,<parm3>…)
功能:用于创建新的参数化的函数,执行时,<expression>中的变量$(1),$(2),$(3)会依次被<parm1>,<parm2>,<parm3>取代,而<expression>的返回值就是call函数的返回值。

reverse = $(1) $(2)
foo = $(call reverse,a,b)àa b

reverse = $(2) $(1)
foo = $(call reverse,b,a)àb a
次序可自定义,不一定是顺序的。

六、 origin函数
$(origin <variable>)
功能:告诉变量<variable>的来源,不要在<variable>中使用字符”$”
返回:
1、 undefined:
若<variable>没有定义过,则返回undefined

2、 default:
若是个默认的定义,如”CC”,若是一个环境变量,则是返回environment

3、 file
若<variable>被定义在makefile中

4、 command line
若<variable>被命令行定义

5、 override
若<variable>被override指示符重新定义

6、 automatic
若<variable>是命令运行中的自动化变量

示例:
若一个makefile中包含了一个定义文件make.def,在make.def定义了一个变量bletch,而环境变量也有一个bletch

ifdef bletch
ifeq “$(origin bletch)” “environment”
bletch = barf, gag, etc.
endif
endif

表示:如果变量来源于环境,则重新定义bletch,否则不重新定义。
这样写的好处在于只是针对于环境变量中的,可以细分的定义出来,而不像使用override时会把环境变量和命令行定义的变量都覆盖掉。

七、 shell函数
$(shell <os-command>)
功能:shell函数的参数是操作系统的shell命令,和Tab键上面的那个” ` ”符号是相同功能的。
返回:shell函数把执行OS命令后的输出作为返回值。

contents := $(shell cat foo)
files := $(shell echo *.c)

八、 控制make的函数
1、 error:错误信息函数
$(error <text…>)
功能:产生一个致命的错误信息<text…>,error函数不会在一被调用就会产生错误信息,故把其定义在某个变量中,并在后续的脚本中使用此变量都是可以的。

ifdef ERROR_001
$(error error is $(ERROR_001))
Endif

2、 warning:报警函数
$(warning <text…>)
功能:输出一段警告信息,而make继续执行,跟error类似。


后面应该是介绍automake的学习了,对于后面的内容实在是恶心到我了,了解一下,然后多写写makefile自然就熟悉了


0 0
原创粉丝点击