我有以下规则
define compile_c
$(ECHO) "CC $<"
$(Q)$(CC) $(CFLAGS) -c -MD -o $@ $<
@# The following fixes the dependency file.
@# See http://make.paulandlesley.org/autodep.html for details.
@# Regex adjusted from the above to play better with Windows paths, etc.
@$(CP) $(@:.o=.d) $(@:.o=.P); \
$(SED) -e 's/#.*//' -e 's/^.*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $(@:.o=.d) >> $(@:.o=.P); \
$(RM) -f $(@:.o=.d)
endef
vpath %.c . $(TOP)
$(BUILD)/%.o: %.c $(BUILD)/%.pp
$(call compile_c)
vpath %.c . $(TOP)
$(BUILD)/%.pp: %.c
$(ECHO) "PreProcess $<"
$(Q)$(CC) $(CFLAGS) -E -Wp,-C,-dD,-dI -o $@ $<
当构建完成后,GNU make 会说
Removing intermediate files...
并删除所有.pp
我做的文件NOT want.
它为什么要这样做?
我该如何阻止它?
由于您使用的是 GNU Make,因此您可以对 Makefile 进行以下调整:
.PRECIOUS: $(BUILD)/%.pp # ADD THIS LINE
$(BUILD)/%.pp: %.c
$(ECHO) "PreProcess $<"
$(Q)$(CC) $(CFLAGS) -E -Wp,-C,-dD,-dI -o $@ $<
The 文档 https://www.gnu.org/software/make/manual/html_node/Special-Targets.html有这个要说的.PRECIOUS
指令:
的目标.PRECIOUS
取决于 给予以下特殊处理:如果在执行其配方期间 make 被终止或中断,则目标不会被删除。
[...]
另外,如果目标是中间文件,则不再需要它后不会像通常那样将其删除。
[...]
您还可以列出隐式规则的目标模式(例如“%.o”)作为特殊目标的必备文件.PRECIOUS
保留由目标模式与该文件名匹配的规则创建的中间文件。
这样做的好处是不会创建不需要的附加规则。您想要做什么也更清楚:保留珍贵的中间文件,重新创建这些文件可能会很昂贵。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)