makefile 语法_makefile %_nis makefile 语法(18)

电脑杂谈  发布时间:2017-04-11 03:08:47  来源:网络整理

第二种高级用法是——“把变量的再当成变量”。先看一个例子:

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...