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自然就熟悉了
- Makefile规则(四):函数
- Makefile (四) 书写规则
- makefile详解 (四) 书写规则
- makefile(四):makefile规则中的命令
- makefile: 规则、函数、符号说明
- make(四)makefile中命令规则
- Makefile规则
- makefile 规则
- Makefile 规则
- makefile规则
- Makefile 规则
- makefile规则
- makefile规则
- makefile规则
- makefile规则
- Makefile规则
- makefile规则
- makefile规则
- Java NIO socket编程实例
- Android监听键盘上的确定键等
- 浏览器[IE] Ajax Struts Json返回json字符串,解析不了 提示保存或下载 解决方式
- hdu-4453-Looploop-splay
- linux下IPTABLES配置详解
- Makefile规则(四):函数
- 高级PHP应用程序漏洞审核技术
- UVa 10474 Where is the Marble?
- Ubuntu打开终端的方法
- 股市24基础指标、ma均线详解、双价托
- [乐意黎原创] eclipse Kepler Selected SVN connector library is not available or cannot be loaded
- 配电板是什么?
- 文件上传利器SWFUpload入门简易教程
- 黑马程序员_java基础--多线程