make: Circular b <- b 依赖被删除

make: Circular b <- b dependency dropped

对于下面的示例 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

我不确定是什么原因造成的

  1. 循环依赖。它对我来说看起来是线性的。
  2. 打印 b、c、d 而不是 x/x_b、x/x_c、x/x_d

这些行并不像您认为的那样:

$(letters):x/x_$(letters)
x/x_$(letters):

使变量直接代入。您假设 x/x_$(letters) 将对 $(letters) 中的每个单词应用前缀 x/x_,但事实并非如此。这是简单的文本替换,所以它的扩展是 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):