" ifneq的功能($(MAKECMDGOALS),清洁)"部分在Makefile中

时间:2015-03-06 09:07:19

标签: makefile

我真的不知道以下部分的功能:

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

1 个答案:

答案 0 :(得分:3)

假设您只是解压缩了存档,并且无论出于何种原因,您希望在其他任何事情之前运行make clean。据推测,它已经很干净了。现在,如果没有ifneq,make就会:

  1. 执行include $(DFILES)行。在做include之前,它会......

  2. 运行.deps/%.d: %.c的配方,因为$(DFILES)变量包含名称与.deps/%.d匹配的文件。这意味着运行$(CC)(默认情况下为gcc),这是一项相当昂贵的操作。一旦配方运行的次数与要生成的.d个文件一样多,那么......

  3. 运行clean

  4. 的配方

    2中完成的所有工作都没有意义,因为在第3步它将被删除。存在的原因2是当您包含文件时,首先检查它是否具有生成要包含的文件的配方,如果文件不存在或已过期,则运行配方。

    如果目标是ifneqclean位允许Makefile避免在步骤2中执行工作。