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

时间:2015-03-24 01:43:58

标签: makefile gnu-make

给出这个 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中添加一条规则,以删除从各种z%.h文件生成的.ui文件({{1以上规则)。

导致这种情况发生的隐含规则是什么?我试过z%.h: %.ui,但没有发现任何相关内容。我知道我的make -p -f/dev/null规则会删除这些文件;我明确只在明确clean时删除它们。 (我开始对所有隐含的规则感到担忧......)

这是Ubuntu GNOME 14.10上的GNU make 4.0。

感谢。

1 个答案:

答案 0 :(得分:1)

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

.PRECIOUS: z%.h

查看手册中的Chains of Implicit Rules