Makefile:具有非显式输出文件名的隐式规则破坏了规则匹配

非芯片

我处于一种情况,我希望所有文件类型都经过预处理(如果它们的名称指示)。

例如:

main.c              # gets compiled normally by %.c rule
somethingelse.c.m4  # gets preprocessed, then dealt with by %.c rule
somethingother.h.m4 # gets preprocessed (then included by .c files)

我试过的

%: %.m4
  m4 "$<" > "$@"

但是我收到了错误消息:

make: *** No rule to make target 'somethingelse.o', needed by 'a.out'.  Stop.

正如你所看到的,这个失败的规则之后m4一个。

可以肯定地说,它无法弄清楚是否存在.c根据该隐式规则生成文件,因此无法匹配该文件%.o: %.c

这当然起作用:

%.c: %.c.m4
  m4 "$<" > "$@"
%.h: %.h.m4
  m4 "$<" > "$@"

但是添加案例时,它变得相当重复且很快。

有什么方法可以使它与匹配那些文件的单个规则一起工作?

在任何人告诉我有关C预处理器之前这里.c/.h文件只是一个“众所周知的” /“最小”示例,实际上我正在处理各种自定义文件格式,但是逻辑和“隐式规则链”的情况完全相同适用。

约翰·布林格

可以肯定地说,它无法弄清楚是否存在从该隐式规则生成的.c文件,因此无法匹配%.o:%.c。

不,我认为答案更简单。根据手册

出于性能原因make,在搜索规则以构建隐式规则的先决条件时,不会考虑非末尾匹配规则(即'%:')

那正是你的情况。somethingelse.c文件未明确命名为任何规则的目标或前提条件;它仅被视为隐式规则的先决条件。您的任何匹配规则都不是终端规则,因此甚至不考虑构建该文件。

该手册有更多谈谈终端VS非终结匹配规则,但此处涉及的关键点是:

  • 通过使用双冒号而不是使用单个冒号将目标与先决条件区分开来,将无条件匹配的最终规则与非最终匹配规则区分开来;以及
  • 终端规则仅在其所有先决条件都存在的情况下适用。

对于该问题中提出的情况,所有先决条件都存在的要求不是问题,我发现切换到任何终端匹配规则都可以解决问题。例如,此完整的Makefile ...

OBJECTS = main.o somethingelse.o

foo: $(OBJECTS)
        $(CC) -o $@ $^

%:: %.m4
        m4 $< > $@

......对我的作品建立foo从合适的main.csomethingelse.c.m4

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Makefile隐式规则匹配-前缀长度不影响匹配

来自分类Dev

Makefile不对文件使用隐式规则

来自分类Dev

目标文件目标与模式不匹配隐式规则

来自分类Dev

MakeFile使用隐式规则错误

来自分类Dev

Makefile覆盖默认隐式规则

来自分类Dev

Makefile 中的隐式规则取消

来自分类Dev

覆盖Makefile中的显式规则

来自分类Dev

共享命令但与隐式规则冲突的目标/依赖关系的Makefile对

来自分类Dev

Angular Dart:路由路径的匹配规则-隐式后缀通配符?

来自分类Dev

为不同目录中的文件制作隐式规则

来自分类Dev

避免从具有有效URI的本地资源下载。具有隐式或显式文件路径的URI

来自分类Dev

具有函数curring的reduc vs非隐式方法中的scala隐式类方法类型不匹配

来自分类Dev

Linux Shell上具有文件输入和输出文件名的平行卷曲

来自分类Dev

文件名中具有可变部分的生成文件的规则

来自分类Dev

MySQL隐式强制错误排序规则

来自分类Dev

为什么仍在处理隐式规则?

来自分类Dev

MySQL隐式强制错误排序规则

来自分类Dev

GNU make忽略隐式规则

来自分类Dev

输出文件名与R中具有附加名称的输入相同

来自分类Dev

显式类型转换与使用类型规则

来自分类Dev

具有类似于文件名的表达式的.htaccess规则占用404页

来自分类Dev

错误:我的Makefile中出现“混合的隐式和静态模式规则”

来自分类Dev

具有任务依赖性的耙式规则

来自分类Dev

MISRA 2004要求的规则10.1,禁止隐式转换:函数的非恒定参数

来自分类Dev

循环以根据名称与行内容相同的条件创建具有特定文件名和内容的输出文件

来自分类Dev

Delphi:TOpenDialog + VCL样式破坏了带有大量文件的文件名

来自分类Dev

Delphi:TOpenDialog + VCL样式破坏了带有大量文件的文件名

来自分类Dev

具有显式文件类型扩展名和POST的AngularJS资源

来自分类Dev

具有显式文件类型扩展名和POST的AngularJS资源

Related 相关文章

  1. 1

    Makefile隐式规则匹配-前缀长度不影响匹配

  2. 2

    Makefile不对文件使用隐式规则

  3. 3

    目标文件目标与模式不匹配隐式规则

  4. 4

    MakeFile使用隐式规则错误

  5. 5

    Makefile覆盖默认隐式规则

  6. 6

    Makefile 中的隐式规则取消

  7. 7

    覆盖Makefile中的显式规则

  8. 8

    共享命令但与隐式规则冲突的目标/依赖关系的Makefile对

  9. 9

    Angular Dart:路由路径的匹配规则-隐式后缀通配符?

  10. 10

    为不同目录中的文件制作隐式规则

  11. 11

    避免从具有有效URI的本地资源下载。具有隐式或显式文件路径的URI

  12. 12

    具有函数curring的reduc vs非隐式方法中的scala隐式类方法类型不匹配

  13. 13

    Linux Shell上具有文件输入和输出文件名的平行卷曲

  14. 14

    文件名中具有可变部分的生成文件的规则

  15. 15

    MySQL隐式强制错误排序规则

  16. 16

    为什么仍在处理隐式规则?

  17. 17

    MySQL隐式强制错误排序规则

  18. 18

    GNU make忽略隐式规则

  19. 19

    输出文件名与R中具有附加名称的输入相同

  20. 20

    显式类型转换与使用类型规则

  21. 21

    具有类似于文件名的表达式的.htaccess规则占用404页

  22. 22

    错误:我的Makefile中出现“混合的隐式和静态模式规则”

  23. 23

    具有任务依赖性的耙式规则

  24. 24

    MISRA 2004要求的规则10.1,禁止隐式转换:函数的非恒定参数

  25. 25

    循环以根据名称与行内容相同的条件创建具有特定文件名和内容的输出文件

  26. 26

    Delphi:TOpenDialog + VCL样式破坏了带有大量文件的文件名

  27. 27

    Delphi:TOpenDialog + VCL样式破坏了带有大量文件的文件名

  28. 28

    具有显式文件类型扩展名和POST的AngularJS资源

  29. 29

    具有显式文件类型扩展名和POST的AngularJS资源

热门标签

归档