make:循环b <-b依赖性下降

时间:2019-09-19 12:22:50

标签: makefile gnu-make

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

1 个答案:

答案 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):