Как пересылать макросы между вызовами nmake?

Как я могу пересылать макросы между вызовами nmake?

скажем, у нас есть

--- a.mak ---

some_variable = value

all:
   nmake -f b.mak

--- END ---

--- b.mak ---

all:
   @echo some_variable = WHAT TO PUT HERE TO GET VALUE OF some_variable?

--- END ---

Я пробовал разные вещи, такие как использование команд set и setx, но значение переменной, установленной в родительском make-файле, не отображается в make-файлах, вызываемых из него.


person Piotr Dobrogost    schedule 28.04.2009    source источник


Ответы (2)


Вот информация из MSDN о рекурсивном вызове nmake:

Используйте макросы рекурсии для рекурсивного вызова NMAKE. Рекурсивные сеансы наследуют макросы командной строки и переменных среды, а также информацию Tools.ini. Они не наследуют определенные в make-файле правила вывода или спецификации .SUFFIXES и .PRECIOUS. Чтобы передать макросы рекурсивному сеансу NMAKE, либо установите переменную среды с помощью SET перед рекурсивным вызовом, либо определите макрос в команде для рекурсивного вызова, либо определите макрос в Tools.ini.

Итак, вы можете сделать a.mak похожим на:

# ---- a.mak ----
some_variable = value

all:   
    nmake -f b.mak some_variable=$(some_variable)
#--- END ---

Кроме того, обратите внимание, что использование команды set для помещения переменной в среду также будет работать, но nmake автоматически делает имена переменных среды заглавными (даже для странных, таких как «windir», которые по какой-то причине используются в системе в нижнем регистре), и регистр -чувствительный, поэтому, чтобы использовать переменную окружения, вы должны использовать переменную в верхнем регистре.

Из MSDN:

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

Итак, вот как должен выглядеть ваш b.mak, если вы собираетесь передавать переменную, используя среду, а не явно в командной строке:

#--- b.mak ---
all:
   @echo some_variable is: $(SOME_VARIABLE)
#--- end ---

Из-за этого, вероятно, неплохая идея стандартизировать соглашение об именах с заглавными буквами для имен макросов nmake.

person Michael Burr    schedule 28.04.2009

Возможно, вам следует подумать о том, чтобы не вызывать make рекурсивно, см. статью Рекурсивный вызов Make считается вредным. Вы по-прежнему можете иметь модульные файлы, подобные уже имеющимся make-файлам (включенным make), только правила определяются только в одном make-файле верхнего уровня.

person hlovdal    schedule 29.04.2009