Пример: допустим, у меня есть bar.c
и baz.c
, я хочу произвести foo.a
. Итак:
foo.a: bar.o baz.o
ar -rc [email protected] $?
Теперь я решаю всегда хочу bar.o
быть обновлен. Я решил сделать его финишной целью. Это также требует явного рецепта для него, так как неявные правила не ищут финских целей. Итак:
.PHONY: bar.o
bar.o: bar.c
cc -c -o [email protected] $<
foo.a: bar.o baz.o
ar -rc [email protected] $?
Теперь, когда я бегу make foo.a
, bar.c
всегда компилируется. С момента обновления bar.o
рецепт foo.a
всегда запускается.
Но: $?
имеет пустое значение, поэтому foo.a
не может быть изменено. Зачем?
Сделать, очевидно, не запрещает это, но в руководстве говорится: «Фальшивая цель не должна быть обязательным условием реального файла цели». Поскольку фальшивые цели всегда выполняются, имеет смысл, что они будут считаться всегда старше, чем что-либо еще внутри. – user657267
@ user657267 Всегда выполняемый будет отображать более новую версию, чем старше, так как рецепт * обычно * обновляет свою цель при ее запуске. Тем не менее, «не следует», потому что цель, которая перечисляет фальшивое предварительное условие, сама будет работать, потому что фальшивая цель будет считаться более новой. –
@ EtanReisner, вы правы, мои времена были смущены. Возможно, у внутренних фальшивых файлов есть специальное значение даты, которое не является ни новым, ни более старым. – user657267