Я пытаюсь лениво оценить вариант конфигурации. Я хочу выпустить ошибку Make
, только если эта переменная фактически используется (заменена).Определение рекурсивно расширенной переменной с тем же именем, что и переменная среды
Рассмотрим следующий Makefile:
VAR = $(error "E")
NFS_DIR = NFS_DIR is $(VAR)
T = $(NFS_DIR) is 1
all:
echo Test
Если я запускаю его с моей средой (которая имеет /srv/nfs
значение), вывод следующий:
➜ ~ make
echo Test
Makefile:3: *** "E". Stop.
поэтому определение актов рекурсивных как простое определение ,
Если очистить окружающую среду, она работает, как ожидалось:
➜ ~ env -i make
echo Test
Test
я не мог найти ни одного упоминания, что рекурсивно-вычисляемой переменной, когда определяется с таким же именем, как переменной окружения, будет действовать как упрощенно переменная.
Так вопросы:
- Почему наблюдаемое поведение?
- Как реализовать желаемое поведение?
Обновление: уточнить - я не хочу использовать ?=
, поскольку параметры - это параметры конфигурации. Я хочу, чтобы они были строго из Makefile, а не из среды.
Извините, я не вижу, какая команда вызывает расширение '$ NFS_DIR'. Я не использую его ни в одной команде –
Я не сказал, что он использовался в команде. Я сказал, что это в вашей среде. Если вы запускаете «env | grep NFS_DIR» из приглашения командной оболочки, видите ли вы? Поэтому при запуске make он импортирует это значение в переменную make и помещает ее для экспорта в команды, выполняющие прогоны. Затем вы устанавливаете его в make-файле, но он по-прежнему помечен как экспортированный. Поэтому, когда make хочет запустить команду, сначала нужно получить среду для этой команды, и она расширяет все экспортированные переменные make. Вот когда вы это видите. Измените имя переменной make на то, что не является допустимой переменной окружения. – MadScientist
Вы сказали, что передача переменной в команду вызывает расширение переменной. О какой команде вы говорили? –