什么隐式规则导致 GNU make 在构建结束时删除所有带有模式 z%.h 的文件?

What implicit rule is causing GNU make to remove all files with pattern z%.h at the end of a build?

给定 this Makefile,对于另一个项目:

OBJDIR = .objs
OUTFILE = simplesale

CFILES = \
    manager.c \
    zresources.c

UIFILES = \
    addremovemoney.ui \
    employeeeditor.ui \
    itemeditor.ui \
    logviewer.ui \
    manager.ui \
    othersettings.ui

HFILES = \
    simplesale.h \
    $(UIFILES:%.ui=z%.h)

OFILES = $(CFILES:%.c=$(OBJDIR)/%.o)
PKGS = gtk+-3.0

xCFLAGS = \
    --std=c99 \
    -Wall \
    -Wextra \
    -Wno-unused-parameter \
    `pkg-config --cflags $(PKGS)` \
    $(CFLAGS)

xLDFLAGS = \
    `pkg-config --libs $(PKGS)` \
    $(LDFLAGS)

$(OUTFILE): $(OFILES)
    $(CC) -g -o $(OUTFILE) $(OFILES) $(xLDFLAGS)

$(OBJDIR)/%.o: %.c $(HFILES) dirs
    $(CC) -g -o $@ -c $< $(xCFLAGS)

zresources.c: gresources.xml $(UIFILES)
    glib-compile-resources --target $@ --generate-source $<

z%.h: %.ui
    go run tools/ui2cdecl.go $< $@ /simplesale/$<

dirs:
    mkdir -p $(OBJDIR)

clean:
    rm -rf $(OBJDIR) z*

运行 make 不带参数

mkdir -p .objs
go run tools/ui2cdecl.go addremovemoney.ui zaddremovemoney.h /simplesale/addremovemoney.ui
go run tools/ui2cdecl.go employeeeditor.ui zemployeeeditor.h /simplesale/employeeeditor.ui
go run tools/ui2cdecl.go itemeditor.ui zitemeditor.h /simplesale/itemeditor.ui
go run tools/ui2cdecl.go logviewer.ui zlogviewer.h /simplesale/logviewer.ui
go run tools/ui2cdecl.go manager.ui zmanager.h /simplesale/manager.ui
go run tools/ui2cdecl.go othersettings.ui zothersettings.h /simplesale/othersettings.ui
cc -g -o .objs/manager.o -c manager.c --std=c99 -Wall -Wextra -Wno-unused-parameter `pkg-config --cflags gtk+-3.0` 
glib-compile-resources --target zresources.c --generate-source gresources.xml
cc -g -o .objs/zresources.o -c zresources.c --std=c99 -Wall -Wextra -Wno-unused-parameter `pkg-config --cflags gtk+-3.0` 
cc -g -o simplesale .objs/manager.o .objs/zresources.o `pkg-config --libs gtk+-3.0` 
rm zaddremovemoney.h zothersettings.h zemployeeeditor.h zmanager.h zitemeditor.h zlogviewer.h

请注意 GNU make 如何决定在我的 Makefile 中没有的末尾添加一条规则,以删除从各种 .ui 文件生成的 z%.h 文件(z%.h: %.ui 上面的规则)。

什么隐含规则导致了这一事件的发生?我尝试了 make -p -f/dev/null 但没有找到任何相关内容。我知道我的 clean 规则无论如何都会删除这些文件;我宁愿只在明确 make cleaning 时删除它们。 (我开始有点担心所有隐含的规则......)

这是 Ubuntu GNOME 14.10 上的 GNU make 4.0。

谢谢。

make 默认删除中间构建产品。如果你想保留它们,你需要将你的 z%.h 目标标记为珍贵:

.PRECIOUS: z%.h

查看手册中的Chains of Implicit Rules