Передайте переменную для расширения в MAKEFLAGS - PullRequest
0 голосов
/ 11 марта 2020

Учитывая Makefile, как показано ниже, как я могу установить значение FOOBAR в foo /home/scott, используя $MAKEFLAGS?

FOO=foo
FOOBAR=$(FOO) bar

$(info $$FOOBAR is [$(FOOBAR)])

Я знаю, что могу сделать

$ make FOOBAR="\$(FOO) $HOME"
$FOOBAR is [foo /home/scott]

И это прекрасно работает

$ MAKEFLAGS="FOOBAR=foo\ $HOME" make
$FOOBAR is [foo /home/scott]

Интересно, что это не так хорошо работает

$ MAKEFLAGS="FOOBAR='foo $HOME'" make
$FOOBAR is ['foo]

Моя цель примерно такая, но постарайся, как только смогу, этого не добиться

$ export MAKEFLAGS="FOOBAR=\$(FOO)\ $HOME"  # <-- this line is wrong
$ make
$FOOBAR is [foo /home/scott]  # <-- not the real output

Фактический вывод:

$ export MAKEFLAGS="FOOBAR=\$(FOO)\ $HOME"
$ make
$FOOBAR is [/home/scott]

Как использовать переменную для замены в $MAKEFLAGS переопределении?

(Стандартное решение POSIX - это предпочтительнее, но будет работать только решение GNU.)

(Зачем мне это нужно? Я хочу переопределить переменную, используемую Python, которую я собираю с помощью python -компиляции pyenv. Я нашел этот python -build выставляет $MAKE_OPTS, который сработал, но теперь мне любопытно, почему мои предыдущие попытки потерпели неудачу.)

1 Ответ

2 голосов
/ 12 марта 2020

Это потому, что MAKEFLAGS заменяются немедленно, поэтому, прежде чем ваш FOO будет даже определен, он будет преобразован в пустую строку. Если вы хотите отложить разрешение sh, вам потребуется удвоить доллар, например:

$ export MAKEFLAGS="FOOBAR=\$\$(FOO)\ $HOME"
$ make
$FOOBAR is [foo /home/raspy]
...