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

时间:2016-06-10 16:42:50

标签: makefile gnu-make

对于我的项目,有必要使用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

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

1 个答案:

答案 0 :(得分:0)

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

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 $< > $@