对于下面的示例Makefile,我期望并输出
预期输出:
x/x_a
x/x_b
x/x_c
x/x_d
代码:
letters= a b c d
default:$(letters)
$(letters):x/x_$(letters)
x/x_$(letters):
echo $@
但是我得到的是
echo x/x_a
x/x_a
make: Circular b <- b dependency dropped.
make: Circular c <- b dependency dropped.
make: Circular c <- c dependency dropped.
make: Circular d <- b dependency dropped.
make: Circular d <- c dependency dropped.
make: Circular d <- d dependency dropped.
echo d
d
echo c
c
echo b
b
我不确定是什么原因造成
答案 0 :(得分:1)
这些行不像您认为的那样起作用:
$(letters):x/x_$(letters)
x/x_$(letters):
使变量为直接替换。您假设x/x_$(letters)
将x/x_
的前缀应用于$(letters)
中的每个单词,但这是不正确的。这是简单的文本替换,因此扩展为x/x_a b c d
,因此上述几行是:
a b c d:x/x_a b c d
x/x_a b c d:
解释了您看到的行为。如果要将前缀应用于每个单词,则需要一个函数(因为使用的是GNU make):
letters := a b c d
xletters := $(addprefix x/x_,$(letters))
$(letters): $(xletters)
$(xletters):