dir := /foo/bar # directory to put the frobs in
dir这个变量的是“/foo/bar”,后面还跟了4个空,如果我们这样使用这样变量来指定别的目录——“$(dir)/file”那么就完蛋了。
还有一个比较有用的操作符是“?=”,先看示例:
FOO ?= bar
其含义是,如果FOO没有被定义过,那么变量FOO的就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
这里介绍两种变量的高级使用方法,第一种是变量的替换。
我们可以替换变量中的共有的部分,其式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空”或是“结束符”。
还是看一个示例吧:
foo := a.o b.o c.o
bar := $(foo:.o=.c)
这个示例中,我们先定义了一个“$(foo)”变量,而第二行的意思是把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”的就是“a.c b.c c.c”。
另外一种变量替换的技术是以“静态模式”(参见前面章节)定义的,如:
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
这依赖于被替换字串中的有相同的模式,模式中必须包含一个“%”字符,这个例子同样让$(bar)变量的为“a.c b.c c.c”。
第二种高级用法是——“把变量的再当成变量”。先看一个例子:
x = y
y = z
a := $($(x))
在这个例子中,$(x)的是“y”,所以$($(x))就是$(y),于是$(a)的就是“z”。(注意,是“x=y”,而不是“x=$(y)”)
我们还可以使用更多的层次:
x = y
y = z
z = u
a := $($($(x)))
这里的$(a)的是“u”,相关的推导留给读者自己去做吧。
让我们再复杂一点,使用上“在变量定义中使用变量”的第一个方式,来看一个例子:
x = $(y)
y = z
z = Hello
a := $($(x))
这里的$($(x))被替换成了$($(y)),因为$(y)是“z”,所以,最终结果是:a:=$(z),也就是“Hello”。
再复杂一点,我们再加上函数:
x = variable1
variable2 := Hello
y = $(subst 1,2,$(x))
z = y
a := $($($(z)))
这个例子中,“$($($(z)))”扩展为“$($(y))”,而其再次被扩展为“$($(subst 1,2,$(x)))”。$(x)的是“variable1”,subst函数把“variable1”中的所有“1”字串替换成“2”字串,于是,“variable1”变成“variable2”,再取其,所以,最终,$(a)的就是$(variable2)的—— “Hello”。(喔,好不容易)
在这种方式中,或要可以使用多个变量来组成一个变量的名字,然后再取其:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-40627-17.html
买到仿制假冒的了
抗日得时候多少人抵制日货又能怎么样