第二种高级用法是——“把变量的再当成变量”。先看一个例子:
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”。(喔,好不容易)
在这种方式中,或要可以使用多个变量来组成一个变量的名字,然后再取其:
first_second = Hello
a = first
b = second
all = $($a_$b)
这里的“$a_$b”组成了“first_second”,于是,$(all)的就是“Hello”。
再来看看结合第一种技术的例子:
a_objects := a.o b.o c.o
1_objects := 1.o 2.o 3.o
sources := $($(a1)_objects:.o=.c)
这个例子中,如果$(a1)的是“a”的话,那么,$(sources)的就是“a.c b.c c.c”;如果$(a1)的是“1”,那么$(sources)的是“1.c 2.c 3.c”。
再来看一个这种技术和“函数”与“条件语句”一同使用的例子:
ifdef do_sort
func := sort
else
func := strip
endif
bar := a d b g q c
foo := $($(func) $(bar))
这个示例中,如果定义了“do_sort”,那么:foo := $(sort a d b g q c),于是$(foo)的就是“a b c d g q”,而如果没有定义“do_sort”,那么:foo := $(sort a d b g q c),调用的就是strip函数。
当然,“把变量的再当成变量”这种技术,同样可以用在操作符的左边:
dir = foo
$(dir)_sources := $(wildcard $(dir)/*.c)
define $(dir)_print
lpr $($(dir)_sources)
endef
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40629-18.html
台湾早被日本占领不还了
现在呢
的确