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
我不确定是什么原因造成的
- 循环依赖。它对我来说看起来是线性的。
- 打印 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):
对于下面的示例 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
我不确定是什么原因造成的
- 循环依赖。它对我来说看起来是线性的。
- 打印 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):