在 MAKEFLAGS 中传递要扩展的变量

Pass Variable to be Expanded in MAKEFLAGS

给定如下所示的 Makefile,如何使用 $MAKEFLAGSFOOBAR 的值设置为 foo /home/scott

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 使用的变量,我正在用 pyenv 的 python-build 构建它。我发现 python-build 暴露了$MAKE_OPTS 结果成功了,但现在我很好奇为什么我之前的尝试都失败了。)

这是因为 MAKEFLAGS 被立即替换,所以在您的 FOO 甚至被定义之前它就解析为一个空字符串。如果你想推迟决议,你需要加倍美元,例如:

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