Если вы действительно не хотите включать эти файлы без необходимости, у вас есть несколько вариантов:
Вы можете поставить условное обозначение, как предлагает Диего Севилья (но я бы рекомендовал использовать MAKECMDGOALS
, чтобывы можете написать более гибкую версию, специфичную для целей, например, вы включите foo.d
, если и только если вы делаете foo.o
).
Вы можете использовать make recursive (heresy!), вызывая$(MAKE)
для каждого целевого объекта, используя make-файл, который включает в себя зависимости этой цели.
Но на самом деле , включая , файл занимает незначительное время, это перестройка файла(автоматически для любого включенного файла, который устарел), который требует времени.Если вам нужно избегать ненужной перестройки, вы можете использовать очень умный трюк .Когда foo.d
должен быть восстановлен?Только когда что-то о foo
изменилось.Но в этом случае foo.o
также должен быть восстановлен.Поэтому не используйте отдельное правило для foo.d
, просто перестройте его как побочный эффект создания foo.o
.Таким образом, вы можете включить все файлы зависимостей и не тратить время на их восстановление, если они не нужны.
РЕДАКТИРОВАТЬ:
Я поражен, что просто , включая эти файлы могут добавить 2-3 секунды к make clean
.Мой последний абзац не подходит, поэтому позвольте мне расширить первые два параметра.
Если all
- единственная цель, для которой эти файлы должны быть включены, а вы make all
из командной строки (а не, например, make all tests tarball install kitchenSink
), тогда это будет сделано:
ifeq ($(MAKECMDGOALS),all)
-include $(DEPS_debug)
endif
Обратите внимание, что это будет не включать foo.d
, если вы make foo.o
.Вы можете написать более сложное условное выражение, например,
$(foreach targ,$(MAKECMDGOALS),$(eval $(call include_deps $(targ)))...
, но оно довольно продвинутое, поэтому давайте сначала поработаем с простой версией.
Если вы предпочитаете избегать условного выражения и использовать рекурсивныйMake, самый простой способ - разделить make-файл на две части:
make-файл:
all:
$(MAKE) -f makefile.all
clean:
rm whatever
...other rules
makefile.all:
DEPS_debug = $(patsubst %.cpp,build_debug/%.d,$(SRC))
OBJ_debug = $(patsubst %.cpp,build_debug/%.o,$(SRC))
-include $(DEPS_debug)
all: program_debug
program_debug: $(OBJ_debug)
$(CC) $(CFLAGS) $(OBJ_debug) -o $@