要在MAKEFLAGS中扩展的传递变量

问题描述 投票:0回答:1

给出如下所示的Makefile,如何使用FOOBARfoo /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的解决方案。)

((为什么需要这个?我想覆盖我使用pyenv的python-build构建的Python使用的变量。我发现python-build暴露了$MAKE_OPTS,该结果证明可以工作,但现在我很好奇为什么我以前的尝试失败了。)

makefile gnu-make bsdmake
1个回答
2
投票

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

$ export MAKEFLAGS="FOOBAR=\$\$(FOO)\ $HOME"
$ make
$FOOBAR is [foo /home/raspy]
© www.soinside.com 2019 - 2024. All rights reserved.