Вот мой Makefile, по существу, пытаясь обойти тот факт, что целевые конкретные переменные не доступны в PreReqs:Взаимодействие включают команды и целевые конкретные переменные марки
horse: shoe
$(info Making horse)
clean:
@rm -f horse nail shoe shoe.d
# Target-specific variable
shoe: DEPS := nail
shoe: shoe.d
$(info Making shoe)
@touch shoe
shoe.d:
$(info Making shoe.d)
@echo shoe: $(DEPS) > shoe.d
nail:
$(info Making nail)
@touch nail
-include shoe.d
Если я запускаю это:
$ make
Making shoe.d
Making shoe
Making horse
Это забыли подкова! Оказывается, что shoe.d была создана, как если бы $ DEPS не был установлен, когда правило проводили
$ cat shoe.d
shoe:
Я нашел две различные хитрости, которые делают вещи работают (уничтожая точки), доказывающие я действительно не понять, что происходит.
1) Если я отредактировать Makefile, чтобы удалить последний (в том числе) линии она по-прежнему забывает гвоздь, конечно, но теперь shoe.d создан правильно:
$ make clean
$ make
Making shoe.d
Making shoe
Making horse
$ cat shoe.d
shoe: nail
Ввод включаемые линии назад и опираясь на содержание shoe.d от последнего вызова все то работает, как ожидалось:
$ make
Making nail
Making shoe
Making horse
Точно так же, если я заменю включить строку с правилом выписанного в явном виде, то всегда работает, как ожидалось.
2) Если удалить целевой конкретный характер DEPS переменного, т.е. просто написать
DEPS := nail
тогда все работает даже с включаемым на месте.
Может кто-нибудь объяснить, что здесь происходит?