我真的不知道以下部分的功能:
ifneq ($(MAKECMDGOALS),clean)
-include $(DFILES)
endif
以下是我从GNU制作手册中得到的可能解释:
避免在清理规则中包含'.d'文件,因此make不会创建 他们只是立即再次删除它们:
但我并不完全明白“不会创造它们只是为了立即再删除它们。”
以下是来自http://www.dirac.org/linux/gdb/03-Initialization,_Listing,_And_Running.php#wherearewegoingtogo的 derivative.tar.bz2 的Makefile:
TARGET = driver
# CC = colorgcc
CC = gcc
CFILES = $(wildcard *.c)
OFILES = $(patsubst %.c, %.o, $(CFILES))
DFILES = $(patsubst %.c, .deps/%.d, $(CFILES))
WARN = -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return \
-Wpointer-arith -Wcast-qual -Wcast-align -Wmissing-declarations -pedantic \
-Wnested-externs -Wredundant-decls -Wwrite-strings -Winline -Werror
CFLAGS = -std=c99 $(WARN) -g3
LDLIBS = -lm
all: $(TARGET)
ctags *.c *.h
$(TARGET): $(OFILES)
$(CC) -o $(TARGET) $(OFILES) $(LDLIBS)
.deps/%.d: %.c
@mkdir -p .deps
@$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; $(RM) -rf $@.$$$$
ifneq ($(MAKECMDGOALS),clean)
-include $(DFILES)
endif
.PHONY: clean nuke
clean:
$(RM) -rf $(TARGET) *.o core .deps tags
答案 0 :(得分:3)
假设您只是解压缩了存档,并且无论出于何种原因,您希望在其他任何事情之前运行make clean
。据推测,它已经很干净了。现在,如果没有ifneq
,make就会:
执行include $(DFILES)
行。在做include
之前,它会......
运行.deps/%.d: %.c
的配方,因为$(DFILES)
变量包含名称与.deps/%.d
匹配的文件。这意味着运行$(CC)
(默认情况下为gcc
),这是一项相当昂贵的操作。一旦配方运行的次数与要生成的.d
个文件一样多,那么......
运行clean
。
2中完成的所有工作都没有意义,因为在第3步它将被删除。存在的原因2是当您包含文件时,首先检查它是否具有生成要包含的文件的配方,如果文件不存在或已过期,则运行配方。
如果目标是ifneq
,clean
位允许Makefile避免在步骤2中执行工作。