2015-12-20 2 views
1

Вот мой 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 

тогда все работает даже с включаемым на месте.

Может кто-нибудь объяснить, что здесь происходит?

ответ

0

shoe.d создаются в результате сделать remaking the makefiles перед принятием целей, а не в результате рассмотрения зависимостей shoe, поэтому рецепты shoe.d во время этого предварительного вызова не наследуют shoe «s переменных целевого конкретным (т. е. как будто вы вызвали make shoe.d).

Марка не будет знать, что shoe.d является Makefile в том случае, если 1) и не будет пытаться переделать его до рассмотрения целей, так как он создается в результате потока нормальной зависимости и наследует DEPS от shoe, для 2), с другой стороны, значение DEPS 'задано для всего файла makefile.