0

给定一个像下面这样的 Makefile,我该如何设置FOOBARusingfoo /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-only 解决方案也可以。)

(为什么我需要这个?我想覆盖 Python 使用的一个变量,我正在使用 pyenv 的 python-build 构建它。我发现 python-build 暴露$MAKE_OPTS了它,但现在我很好奇为什么我以前的尝试有失败的。)

4

1 回答 1

2

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

$ export MAKEFLAGS="FOOBAR=\$\$(FOO)\ $HOME"
$ make
$FOOBAR is [foo /home/raspy]
于 2020-03-11T21:05:35.310 回答