我处于一种情况,我希望所有文件类型都经过预处理(如果它们的名称指示)。
例如:
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.c
和somethingelse.c.m4
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句