Makefile - актуальное правило, которое не является файлом
Учитывая этот (очень) простой Makefile,
all: a b
@echo done
a:
touch $@
b:
touch $@
Я не получил поведение, которое я ожидал.
На самом деле, я хочу, чтобы мое правило "все" выполнялось только в том случае, если одна из его зависимостей не устарела.
Однако на первом $ make я получаю
touch a
touch b
done
И на других
done
Я понимаю, что "обновление" обычно определяет файл, но... Есть ли способ, чтобы правило "все" считалось актуальным, когда все его зависимости являются?
Большое спасибо,
ps: я знаю трюк $ touch all, но не в этом суть
1 ответ
Нет. Если цель не существует, make всегда запускает рецепт.
Есть хакерские способы, которыми ваш all
Рецепт может проверить, были ли построены какие-либо предпосылки, и вести себя иначе, если это так. По крайней мере, если вы используете GNU make.
ETA:
Одним из способов было бы добавить $(eval BUILT = 1)
к каждой цели, то в all
цель, которую вы можете увидеть, если BUILT
установлено. Это требует умеренно свежей версии GNU make:
BUILT =
all: a b
@[ -n '$(BUILT)' ] && echo done
a:
touch $@ $(eval BUILT = 1)
b:
touch $@ $(eval BUILT = 1)