Makefile - актуальное правило, которое не является файлом

Учитывая этот (очень) простой Makefile,

all: a b
    @echo done
a:
    touch $@
b:
    touch $@

Я не получил ожидаемого поведения.

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

Однако при первом $ make я получаю

touch a
touch b
done

И на других

done

Я понимаю, что «актуальный» обычно определяет файл, но... Есть ли способ, чтобы правило «все» считалось актуальным, когда все его зависимости?

Большое спасибо,

пс: знаю хитрость $ потрогать всех, но не в этом дело


person Chmool    schedule 10.10.2013    source источник


Ответы (1)


Нет. Если цель не существует, make всегда будет запускать рецепт.

Существуют хакерские способы, которыми ваш all рецепт может проверить, были ли созданы какие-либо предварительные условия, и вести себя по-разному, если это так. По крайней мере, если вы используете GNU make.

Расчетное время прибытия:

Одним из способов было бы добавить $(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)
person MadScientist    schedule 10.10.2013
comment
Какими могут быть эти хакерские способы? - person Chmool; 10.10.2013