Make: переменная не может быть назначена из вызова оболочки - PullRequest
0 голосов
/ 06 июня 2018
# makefile

SHELL:=/bin/bash
PATH:=/path/to/new/programs:$(PATH)


my_var:=$(shell which program)

rule:
    echo $(my_var)
    which program

#output
$: make rule

echo 

which program
/path/to/program

# prints nothing

Я перепробовал все, и на самом деле вспомнил, как это работало, так как я создавал make-файл ранее.Он превращается в болото - все, что мне нужно сделать, это проверить, существует ли exe, прежде чем я его установлю.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

ПЕРЕПИСАНО (Спасибо @MadScientist за указание на мою путаницу. Я подумал, что лучше всего полностью удалить ошибочную информацию.)

Поскольку $PATH изначально экспортировалось в *Среда 1006 * make , make гарантируют, что она будет экспортирована в среду любых команд рецепта, которые она запускает.Любое изменение, внесенное в $PATH в make-файле , будет попадать в среду команд получения, выполняемых make .

Обратите внимание, что это не true для команд, запускаемых через $(shell …).Экспортированные переменные сохраняют значения, которые были у них при запуске make .Любые изменения, которые они претерпевают в make-файле, игнорируются в отношении внешних команд.

Как указано в другом месте, одним из обходных путей является явное повторение увеличения $PATH в любом $(shell …)

my_var := $(shell PATH='${PATH}' which program)

(Удивляет меня. Это ошибка make ? Или, по крайней мере, ошибка документации?)

0 голосов
/ 06 июня 2018

Работает ли явное which, если вы не установили переменную SHELL в своем make-файле?

Установка переменной SHELL влияет только на рецепты.Он не используется для функции $(shell ...).Вы можете использовать:

my_var := $(shell /bin/bash -c 'which function')

Однако в моей системе даже использование оболочки по умолчанию работает с which.Возможно, ваша система как-то отличается.

Примечание, конечно which находит программы , а не функции ...

...