【问题标题】:Makefile implicit rule matching - prefix length not affecting matchMakefile 隐式规则匹配 - 前缀长度不影响匹配
【发布时间】:2015-08-05 07:45:29
【问题描述】:

在我的 gnu-make-3.81 Makefile 中,我希望定义两个隐式规则,以便更具体的第一个优先于更一般的第二个:

src/%_bar.o : src/%_bar.c
    $(CC) -Wall -Wno-unused-but-set-variable -c $^ -o $@

src/%.o : src/%.c
    $(CC) -Wall -c $^ -o $@

我遇到的问题是 foo_bar.c 代表自动生成的代码,该代码会触发带有 -Wall 的警告,我希望禁止该代码,因此第一条规则旨在捕捉这种特殊情况。

根据make's manual

可能会有多个模式规则满足这些条件。在这种情况下,make 将选择具有最短词干的规则(即最具体匹配的模式)。

我认为对于src/foo_bar.o 的文件名,第一条规则将生成词干foo,第二条规则将生成foo_bar。前者是最短的,所以我希望它适用。然而,情况似乎并非如此,第二条规则由 make 选择并执行。运行 make -d 甚至不会显示与 foo 匹配的尝试 - 仅考虑 foo_bar

如果我进行以下更改,通过将前缀从 src/ 缩短为 sr 故意使第二条规则的词干更长,则仍然选择第二条规则:

src/%_bar.o : src/%_bar.c
    $(CC) -Wall -Wno-unused-but-set-variable -c $^ -o $@

sr%.o : sr%.c
    $(CC) -Wall -c $^ -o $@

我无法将其与 make 文档相协调。

另外,如果我完全去掉src/前缀,第二条规则被选中的:

src/%_bar.o : src/%_bar.c
    $(CC) -Wall -Wno-unused-but-set-variable -c $^ -o $@

%.o : %.c
    $(CC) -Wall -c $^ -o $@

虽然这解决了我的问题,但它实际上并不合适,因为它会覆盖/与我需要保留的当前目录上的另一个隐式规则进行交互:

%.o : %.c
    # do something else

我的问题是为什么make 在这种情况下会这样,这是否与文档一致?如果是这样,是否有更好的方法来指定更专业的隐式规则?

【问题讨论】:

    标签: makefile gnu-make gnu rule


    【解决方案1】:

    首先,请注意,模式匹配的“最短茎”方法是在 GNU make 3.82 中引入的。如果您使用的是 GNU make 3.81,那么您的 make 版本使用的是“第一次匹配”的旧方法。如果可能,最好阅读您的发行版附带的文档,而不是 Web 文档,因为 Web 文档适用于最新版本的 GNU make。 GNU make 3.81 是在 2006 年 4 月发布的……那已经很老了。

    但是,您提供的示例实际上确实按照您希望的方式工作:

    src/%_bar.o : src/%_bar.c ; @echo shorter: $*
    
    src/%.o : src/%.c ; @echo longer: $*
    
    all: src/foo_bar.o
    
    $ make-3.81
    shorter: foo
    
    $ make-3.82
    shorter: foo
    

    我怀疑当您在这里提出问题时,您使用的代码与您在真实环境中使用的代码不同。在那种环境中,您必须在较长的模式之后拥有较短的模式,如下所示:

    src/%.o : src/%.c ; @echo longer: $*
    
    src/%_bar.o : src/%_bar.c ; @echo shorter: $*
    
    all: src/foo_bar.o
    
    $ make-3.81
    longer: foo_bar
    
    $ make-3.82
    shorter: foo
    

    在提问时,确保问题中的简化示例准确反映真实情况非常重要。

    【讨论】:

    • 谢谢 - 我没有意识到 make 版本之间存在不匹配。我错误地认为我最近的 Linux 发行版使用的是与文档相同的版本。考虑到这一点,现在这确实是有道理的,因为我的另一个隐含规则在这些特殊情况之前,所以它首先被选中。我同意您的观点,即确保示例反映现实——在这种情况下,我过于简单化了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多