将隐式规则定义的目标标记为 .SECONDARY

Mark targets defined by implicit rules as .SECONDARY

对于我的项目,有必要使用 m4 自动生成 .c 源文件。对于我的构建过程,我使用 GNU make,用于 m4 调用和编译从这些生成的 .c 文件编译的目标文件。

%.c: %.c.in
        m4 -D OPNAME=$(OPNAME) -D ARGLEVEL=$(ARGLEVEL) -D SKELARGS="$(call TOM4LIST,$(SKELARGS))" -D SUBDIRS="$(call TOM4LIST,$(RSSUBDIRS))" $(BASEDIR)/op/common.m4 $< > $@

这工作正常,但是在编译相应的 .o 对象时,.c 文件会自动标记为 INTERMEDIATE 并在工作完成后被删除。

我不要这个。

记录在案的防止中间文件被删除的方法是将应该保留的目标添加到 .SECONDARY 目标的依赖列表中:

.SECONDARY: somefile.c

但是,由于显而易见的原因,

.SECONDARY: %.c

将不起作用。那么,我该怎么做呢?

明确所有构建步骤。利用单个配方可用于构建多个目标这一事实,并使用所需文件列表而不是 %.

指定您的 metatargets
OBJECTS = a.o b.o c.o
INTERMEDIARY = $(OBJECTS:.o=.c)

OBJECTS: $(@:.o=.c)
    // build command for .c to .o

INTERMEDIARY: $(@:.c=.c.in)
     m4 -D OPNAME=$(OPNAME) -D ARGLEVEL=$(ARGLEVEL) -D SKELARGS="$(call TOM4LIST,$(SKELARGS))" -D SUBDIRS="$(call TOM4LIST,$(RSSUBDIRS))" $(BASEDIR)/op/common.m4 $< > $@