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)
Другие вопросы по тегам