代码之家  ›  专栏  ›  技术社区  ›  Brian Malehorn

$(通配符)中的“%”未展开?

  •  0
  • Brian Malehorn  · 技术社区  · 10 年前

    我想对规则进行编码 <name>.done ,您需要模式的所有文件 <name>.needed.* 。我尝试使用此Makefile写入此内容:

    %.done: $(wildcard %.needed.*)
        cat $^ > $@
    

    然而当我跑步时 touch foo.needed.bar && make foo.done ,我得到的只是

    cat  > foo.done
    

    似乎是 % 在…内 $(wildcard) 被解释为文字“%”。如何将其扩展到正确的值(本例中为“foo”)?

    1 回复  |  直到 10 年前
        1
  •  3
  •   Kusalananda    10 年前

    这个 % 只是模式匹配中“任意字符串”的占位符。它在 wildcard 功能,并按字面解释。

    您可以尝试使用 $*

    %.done: $(wildcard $*.needed.*)
    

    它不起作用的原因是 自动变量 ( $* 是其中之一)不能在依赖项列表中使用。

    解决方法是请求 secondary expansion 对于目标:

    .SECONDEXPANSION:
    %.done: $$(wildcard $$*.needed.*)
    

    这将提示GNUMake在像往常一样处理Makefile之后再次检查规则,展开第一次未展开的任何转义变量。第二次,自动变量具有相应的值。