2015-03-06 3 views
1

Я действительно не знаю функцию следующей части:

ifneq ($(MAKECMDGOALS),clean) 
-include $(DFILES) 
endif 

Вот возможное объяснение я получаю от руководство по GNU Make:

, чтобы избежать включения файлов «.D» во время чистых правил, так что не будет создавать их только немедленно удалить их снова:

Но я не совсем понимаю, «не создадут их, чтобы сразу удалить их снова».

Вот Makefile из derivative.tar.bz2 из http://www.dirac.org/linux/gdb/03-Initialization,_Listing,_And_Running.php#wherearewegoingtogo:

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) $< > [email protected]$$$$; \ 
    sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; $(RM) -rf [email protected]$$$$ 


ifneq ($(MAKECMDGOALS),clean) 
-include $(DFILES) 
endif 



.PHONY: clean nuke 

clean: 
    $(RM) -rf $(TARGET) *.o core .deps tags 

ответ

3

Давайте предположим, что вы только untarred архив, и по какой-либо причине вы хотите запустить make clean прежде всего. Предположительно, он уже чист. Теперь, без ifneq, сделать бы:

  1. Выполнить include $(DFILES) линию. Перед тем, как include собственно, было бы ...

  2. Выполнить рецепт .deps/%.d: %.c, поскольку переменная $(DFILES) содержит файлы с именами, которые соответствуют .deps/%.d. Это означает, что вы используете $(CC) (это по умолчанию gcc), что является довольно дорогостоящей операцией. Как только рецепт выполняется столько раз, сколько есть .d файлов для генерации, то ...

  3. Запустить рецепт для clean.

Вся работа, выполненная в 2, бессмысленна, поскольку на шаге 3 она будет удалена. Причина 2 заключается в том, что когда вы включаете файл, сначала проверяйте, есть ли у него рецепт для создания файла, который должен быть включен, он запускает рецепт, если файл не существует или устарел.

бит ifneq позволяет Makefile избегать выполнения работы на шаге 2, если цель clean.

Смежные вопросы