Makefile "的功能,;ifneq($(MAKECMDGOALS),clean)";生成文件中的一部分

Makefile "的功能,;ifneq($(MAKECMDGOALS),clean)";生成文件中的一部分,makefile,Makefile,我真的不知道以下部分的功能: ifneq ($(MAKECMDGOALS),clean) -include $(DFILES) endif 以下是我从GNU make手册中得到的可能解释: 避免在清除规则期间包含“.d”文件,因此make不会创建 只需立即再次移除它们: 但我并不完全理解“创建它们并不是为了立即再次删除它们” 以下是派生.tar.bz2中的生成文件: TARGET=驱动程序 #CC=彩色GCC CC=gcc CFILES=$(通配符*.c) OFILES=$(patsubst%

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

ifneq ($(MAKECMDGOALS),clean)
-include $(DFILES)
endif
以下是我从GNU make手册中得到的可能解释:

避免在清除规则期间包含“.d”文件,因此make不会创建 只需立即再次移除它们:

但我并不完全理解“创建它们并不是为了立即再次删除它们”

以下是派生.tar.bz2中的生成文件:

TARGET=驱动程序
#CC=彩色GCC
CC=gcc
CFILES=$(通配符*.c)
OFILES=$(patsubst%.c、%.o、$(CFILES))
d文件=$(patsubst%.c、.deps/%.d、$(c文件))
WARN=-W-Wall-Wstrict原型-Wmissing原型-Waggregate返回\
-Wpointer arith-Wcast qual-Wcast align-Wmissing声明-pedantic\
-有主外部程序-Wrendundant decls-Wwrite字符串-Winline-Werror
CFLAGS=-std=c99$(警告)-g3
LDLIBS=-lm
全部:$(目标)
ctags*.c*.h
美元(目标):美元(共份)
$(CC)-o$(目标)$(文件)$(LDLIBS)
.deps/%.d:%.c
@mkdir-副总裁
@$(CC)-MM$(CPPFLAGS)$<>$@.$$$\
sed's,\($*\)\.o[:]*,\1.o$@:,g'<$@.$$>$@$(RM)-rf$@$$$$
ifneq($(MAKECMDGOALS),干净)
-包括$(d文件)
恩迪夫
.虚假:清洁核武器
清洁:
$(RM)-rf$(目标)*.o core.deps标记

让我们假设您刚刚解除了存档,并且出于任何原因,您希望在执行任何其他操作之前运行
清除
。想必它已经干净了。现在,如果没有
ifneq
,make将:

  • 执行
    include$(d文件)
    行。在正确执行
    include
    之前,它将

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

  • 运行
    clean
    的配方

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

    如果目标是
    clean
    ,则
    ifneq
    位允许Makefile避免执行步骤2中的工作

    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