将隐式规则定义的目标标记为 .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 $< > $@
对于我的项目,有必要使用 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
将不起作用。那么,我该怎么做呢?
明确所有构建步骤。利用单个配方可用于构建多个目标这一事实,并使用所需文件列表而不是 %.
指定您的 metatargetsOBJECTS = 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 $< > $@