【问题标题】:How to set a Makefile target depend on pattern prerequisites?如何设置 Makefile 目标取决于模式先决条件?
【发布时间】:2016-10-03 10:19:34
【问题描述】:

我在 makefile 中有一系列模式依赖项,最后它们应该放在一个文件中,例如:*.x -> *.y -> onefile.z

所以我制作了这样的文件:

$ touch a.x b.x

和规则:

%.y: %.x some-other-script
    touch $@

onefile.z: %.y second-other-script
    touch $@

这条规则不起作用:

$ make onefile.z
make: *** No rule to make target '%.y', needed by 'onefile.z'.  Stop.

使用通配符:

%.y: %.x some-other-script
    touch $@

z: $(wildcard *.y) second-other-script
    touch $@

这也不起作用:它看到没有*.y 文件并继续使onefile.z 跳过第一条规则。

$ make onefile.z
touch onefile.z

$ ls
a.x b.x onefile.z Makefile

我可能可以将两条规则合二为一,但在实际应用中,步骤较多,有些是通过 HTTP 发出请求,耗时较长,实际上不应无故重复。

有没有办法建立这样的依赖关系?

【问题讨论】:

    标签: makefile


    【解决方案1】:

    onefile.z: %.y second-other-script 是常规规则,不是模式规则或静态模式规则,因此% 是按字面解释的。即使是模式规则,make 应该如何推断词干应该匹配的内容?

    $(wildcard *.y) 告诉 make 查找所有匹配 *.y 的文件,但当然还没有,所以它返回一个空字符串。

    如果我正确理解了您的问题,以下应该可以工作:

    xfiles := $(wildcard *.x)
    yfiles := $(xfiles:.x=.y)
    
    %.y: %.x some-other-script
        touch $@
    
    onefile.z: $(yfiles) second-other-script
        touch $@
    

    查看 Gnu Make 文档

    【讨论】:

    • 确实有效,非常感谢! (虽然 SO 将换行符变成了破坏格式的东西,让我困惑了一段时间)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-06-11
    • 1970-01-01
    • 2020-01-08
    • 2016-08-18
    相关资源
    最近更新 更多