2015-02-04 3 views
0

У меня есть некоторые правила в моей корневой Makefile, которые выглядят примерно так:задержка Makefile расширение переменного

DEPS += a 
DEPS += b 
... 

$(THE_BINARY) : $(DEPS) 

Индивидуального приложение MAKEFILES include этого корень Makefile после предоставления некоторых необходимых переменных. Я хочу сделать это так, чтобы приложения могли добавлять к переменной DEPS тоже. Это работает:

DEPS += some_other_dep 
include root.make 

, но это не делает:

include root.make 
DEPS += some_other_dep 

Является ли это потому, что ($DEPS) расширяется в точке, где назначается правило, а не в конце? Есть ли способ написать файл make-файла root таким образом, что и строки DEPS += ... делают то же самое?

+0

Правила назначаются на месте и расширяют любые переменные в этой точке. Есть волшебное ключевое слово, подобное '.SECONDEXPANSION', но, честно говоря, я понятия не имею, что он делает, несмотря на попытку выяснить его несколько раз. – Suedocode

ответ

1

Комментарий Aggieboy является правильным в отношении проблемы: если вы включаете make-файл сначала, то правило, использующее $(DEPS), уже расширено, прежде чем добавлять к нему лишние вещи, поэтому он не видит дополнительных вещей. Мой совет для людей, пишущих эту среду makefile с общими файлами include, заключается в том, что включенные файлы, которые определяют любые правила, всегда должны быть в конце.

Это правда, что .SECONDEXPANSION решит эту проблему, если вы хотите пойти таким образом, и на самом деле это трудно понять. Если description in the manual слишком сложно прочитать, может быть полезно посмотреть на this discussion of expansion in GNU make, в частности на secondary expansion.

Я обычно не рекомендую это, потому что, хотя он решит , эта проблема, вы попадете в ту же проблему со следующим правилом ... вам в основном придется использовать вторичное расширение для всех ваших правил, если вы хотите разрешить include файлы в любом порядке назначения переменных WRT. И вторичное расширение работает только для переменных, используемых в предварительных списках. Вам не повезло, если вы хотите отложить расширение переменных, используемых в/в качестве целей.

Смежные вопросы