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 bg q c),调用的就是strip函数。
当然,“把变量的再当成变量”这种技术,同样可以用在操作符的左边:
dir = foo
$(dir)_sources := $(wildcard $(dir)/*.c)
define $(dir)_print
lpr $($(dir)_sources)
endef
这个例子中定义了三个变量:“dir”,“foo_sources”和“foo_print”。
我们可以使用“=”操作符给变量追加,如:
objects = main.o foo.o bar.o utils.o
objects = another.o
于是,我们的$(objects)变成:“main.o foo.o bar.o utils.o another.o”(another.o被追加进去了)
使用“=”操作符,可以模拟为下面的这种例子:
objects = main.o foo.o bar.o utils.o
objects := $(objects) another.o
所不同的是,用“=”更为简洁。
如果变量之前没有定义过,那么,“=”会自动变成“=”,如果前面有变量定义,那么“=”会继承于前次操作的赋符。如果前一次的是“:=”,那么“=”会以“:=”作为其赋符,如:
variable := value
variable = more
等价于:
variable := value
variable := $(variable) more
但如果是这种情况:
variable = value
variable = more
由于前次的赋符是“=”,所以“=”也会以“=”来做为赋,那么岂不会发生变量的递补归定义,这是很不好的,所以make会自动为我们解决这个问题,我们不必担心这个问题。
如果有变量是通常make的命令行参数设置的,那么Makefile中对这个变量的赋会被忽略。如果你想在Makefile中设置这类参数的,那么,你可以使用“override”指示符。其语法是:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-40627-18.html
我们照样打
好看
完全干燥那种