什么隐式规则导致 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 clean
ing 时删除它们。 (我开始有点担心所有隐含的规则......)
这是 Ubuntu GNOME 14.10 上的 GNU make 4.0。
谢谢。
make
默认删除中间构建产品。如果你想保留它们,你需要将你的 z%.h
目标标记为珍贵:
.PRECIOUS: z%.h
查看手册中的Chains of Implicit Rules。
给定 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 clean
ing 时删除它们。 (我开始有点担心所有隐含的规则......)
这是 Ubuntu GNOME 14.10 上的 GNU make 4.0。
谢谢。
make
默认删除中间构建产品。如果你想保留它们,你需要将你的 z%.h
目标标记为珍贵:
.PRECIOUS: z%.h
查看手册中的Chains of Implicit Rules。