Чтобы автоматически создать каталог $(BINDIR)
до того, как он действительно понадобится, вы должны объявить его как условие (зависимость) любой цели, которая его использует.Но каждый раз, когда его содержание изменяется, его метка времени также изменяется.Таким образом, объявлять его как регулярное предварительное условие не лучшая вещь, потому что цели, зависящие от него, будут перестроены без реальной причины, просто потому, что изменилось содержимое $(BINDIR)
.
Вот почему make также поддерживает предварительные условия только для заказа (ООП):
$(BINDIR)/program_name: $(SRCDIR)/program_name.c | $(BINDIR)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
$(BINDIR):
mkdir -p $@
Обратите внимание на |
, который вводит список ООП.ООП создается, если он не существует, что приводит к (пере) построению целей в зависимости от него.Но если он существует, make даже не учитывает время его последней модификации.Даже если какая-то цель, в зависимости от нее, старше, она не перестраивается только из-за этого.
Примечание: я также использовал автоматические переменные $<
и $@
.В рецепте правила они расширяются как первая предпосылка ($(SRCDIR)/program_name.c
) и цель ($(BINDIR)/program_name
), соответственно.Настоятельно рекомендуется: меньше печатать, меньше подвержено ошибкам, более общие правила ... у них много хороших свойств.