make-файл, устанавливающий переменную в условии if в цели - PullRequest
2 голосов
/ 21 октября 2011

У меня есть Makefile со следующим:

AVAR=""

all : 
    if [ -d ../old ]; then \
    (echo "$@ Ping!"; AVAR="../old"; echo $(AVAR)) \
    fi
    @echo $(AVAR)

Идея состоит в том, что в зависимости от наличия каталога "../old" у меня будет или не будет информации в AVAR (доступно для использования позже)Однако if оценивает значение true, а Ping!повторяется, но AVAR ничего не назначается ни внутри, ни вне оператора if.

Вывод выглядит следующим образом:

$ make all
if [ -d ../old ]; then \
        (echo "all Ping!"; AVAR="../old"; echo "") \
        fi
all Ping!

Любое понимание приветствуется.

Ответы [ 3 ]

0 голосов
/ 21 октября 2011

1) Каждая команда в рецепте make-файла выполняется в своей собственной подоболочке.Вы определяете AVAR в первой команде (оператор if), поэтому она не доступна для второй команды (@echo $(AVAR)).

2) В первой команде вы определяете AVAR,но вы не называете это правильно.Термин $(AVAR) является синтаксисом Make;Make расширяет его перед выполнением команды, и поскольку Make ничего не знает о такой переменной, она расширяется до нуля.Вы должны использовать оболочку для ее расширения, используя синтаксис оболочки: $AVAR.Но если вы попробуете это, Make расширит $A до нуля, и вы получите «VAR».Таким образом, вы «спасаетесь» от $ с другим $:

all : 
    if [ -d ../old ]; then \
    (echo "$@ Ping!"; AVAR="../old"; echo $$AVAR) \
    fi
0 голосов
/ 26 октября 2011

Проблема решена, неужели очень плохая рекурсивная опция make переопределила вещи и переосмыслила.

0 голосов
/ 21 октября 2011

Попробуйте

(echo "$@ Ping!"; AVAR="../old"; echo $$AVAR) \

вместо

(echo "$@ Ping!"; AVAR="../old"; echo $(AVAR)) \
...