【问题标题】:make: Circular b <- b dependency droppedmake: Circular b <- b 依赖被删除
【发布时间】:2019-09-19 12:22:50
【问题描述】:

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

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

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

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

    Make 变量是直接替换。您假设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):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2015-08-08
      • 2022-01-19
      • 1970-01-01
      • 2014-09-14
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多