Переменные определены * и * не определены - PullRequest
6 голосов
/ 26 февраля 2011

Полагаю, это как-то имеет смысл, но я не могу понять, почему: в следующем коде я получаю оба предупреждения (обратите внимание, что исходный код был с отступом от табуляции):

define variable-definition
    ifndef $1
        $(warning $1 is undefined)
    else
        $(warning $1 is defined)
    endif
endef

PS: я хочу проверить, существует ли переменная с именем, переданным как $1, а не передана ли $1.

PPS: Отрицать все это не помогает.

Ответы [ 2 ]

9 голосов
/ 27 февраля 2011

Бета-анализ основной причины верен, вы не избегаете своего $ на $(warning) вызовах. Вот как бы это исправить:

define variable-def
  ifndef $1
    $$(warning $1 is undefined)
  else
    $$(warning $1 is defined)
  endif
endef
FOO=bar
$(eval $(call variable-def,FOO))

Обратите внимание, что я делаю отступы, а не табуляции. Если вы сделаете отступ для вкладок, вы получите эту ошибку: *** commands commence before first target. Stop.

Это использует GNUisms, но и ваш пример (я думаю).

1 голос
/ 26 февраля 2011

Причина, по которой вы получаете оба предупреждения, заключается в том, что когда вы вызываете эту функцию (т.е. расширяете эту переменную), Make расширяет переменные внутри нее, включая оба предупреждения.Это происходит раньше, если попытаться оценить ifndef (и, возможно, не удастся).Make просто не обрабатывает условия так, как вы хотите.

Вот способ сделать это, немного неуклюже, но эффективно.(Чтобы сделать это действительно гладко, как функция, вероятно, потребуется значительное количество черной магии).Напишите отдельный make-файл с именем variable-definition:

# In makefile variable-definition

ifndef $(FOO)
 $(warning $(FOO) is undefined)
else
 $(warning $(FOO) is defined)
endif

Затем в основном make-файле:

# In the main makefile

bar = something
FOO := bar

include variable-definition

FOO := baz

include variable-definition
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...