【问题标题】:GNU make: stem matching and multiple dependenciesGNU make:词干匹配和多重依赖
【发布时间】:2024-01-10 14:29:01
【问题描述】:

我有 2 个文件,filea 和 fileb,想生成 filec。

我的 Makefile 看起来像这样

f%ec: f%eb

f%ec: f%ea
    cat $^ > $@

然而,输入make的效果只有:

cat filea > filec

也就是说,fileb 不是 filec 的先决条件。当不使用 % 符号时,即 Makefile 是时

filec: fileb

filec: filea
    cat $^ > $@

产生的动作是

cat filea fileb > filec

为什么?以及如何修改第一个 Makefile 以获得预期的结果?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    在第二个makefile中:

    filec: fileb
    
    filec: filea
        cat $^ > $@
    

    filec 有两条规则,其中只有一条有命令,所以 Make 结合 prereqs 的列表并运行带有命令的一条。在第一个makefile中:

    f%ec: f%eb
    
    f%ec: f%ea
        cat $^ > $@
    

    有两种不同的模式规则可以匹配filec,所以 Make 必须选择一个(它没有意识到它可以同时应用两者,原则上它们都可以有命令)。由于一个缺少命令,它选择另一个。获得所需行为的最简单方法是组合规则:

    f%ec: f%ea f%eb
        cat $^ > $@
    

    【讨论】: