Makefile:如何编写有先决条件而没有后缀的模式规则

标签 makefile

在嵌入式项目中,您通常使用 objcopy 将 GCC 的 ELF 输出转换为原始二进制形式。我尝试为此编写一个模式规则: %.bin: % (gcc 的可执行输出没有后缀,至少在 Linux 上是这样)。失败,并显示 make: *** Norule to make target ...

这是一个完整的测试用例:

测试.c:

int main(int argc, char *argv[]) {
    return 0;
}

生成文件:

%.bin: %
    objcopy -O binary $< $@

这通过说 make test test.bin 来工作,也就是说,通过明确要求它首先构建 test 可执行文件。说make test.bin是行不通的。不知何故,在这种情况下,make 没有意识到它可以使用内置规则来创建先决条件。

我知道我可以通过将规则编写为 test.bin: test 来解决此问题,但我想知道为什么此模式规则不起作用以及我能否让它以某种方式起作用。

此外,我认为让它发挥作用的明显而实用的方法打破了漂亮而优雅的内置规则系统。如果我可以选择例如,它可以被拯救LDFLAGS 使链接器输出带有某些后缀的可执行文件,例如.elf (我还需要重写内置的链接规则吗?哦,好吧...)。

我承认,这纯粹是迂腐思想中产生的学术问题。

最佳答案

你的想法是正确的,但是你遇到了 make 的警告 -- make 不会将纯 % 目标与其他隐式规则链接起来 --

https://www.gnu.org/software/make/manual/html_node/Chained-Rules.html#Chained-Rules

... for performance reasons make will not consider non-terminal match-anything rules (i.e., ‘%:’) when searching for a rule to build a prerequisite of an implicit rule (see Match-Anything Rules).

关于Makefile:如何编写有先决条件而没有后缀的模式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67969001/

相关文章:

c - 更改configure.ac后如何重建openssh 5.2p1

c++ - 维基准备实用程序。无法构建 Splitwiki

c++ - crt1.o函数_start中未定义对 'main'错误的引用

makefile - make 每次都会重新编译所有内容,为什么?

linux - 在 Unix 中,我可以在一个目录中运行 'make' 而不先 cd'ing 到那个目录吗?

c - 将目录依赖项指定为百分比规则时,Linux 上的 Make 行为非常奇怪

c++ - 将一个用户的 GNU makefile 转换为另一个用户

c++ - 如何使用 GoogleTest 避免混合测试和生产代码?

c++ - 初学者问题 makefile 将无法工作

makefile - 大型项目的 FORTRAN Makefile