Makefile POSIX能否从程序输出中设置变量?

Makefile POSIX能否从程序输出中设置变量?,makefile,posix,Makefile,Posix,在gnumake中,可以执行类似于X:=$(shell命令-vfoo)的操作,将X设置为该shell命令的输出。有没有一种方法可以用纯POSIX make实现同样的效果?我不知道POSIX的具体情况,因为GNU make是如此的普遍,但是您可以在sh中找到的标准backtick语法应该是存在的 另外,:=构造是特定于GNU的,因此您应该只使用变量赋值,默认情况下是惰性的。如果您可以懒散地使用它,考虑到这些工具的传统,即它出现在sh中,以及make中程序输出的重要性,那么可以合理地假设您可以使用反

在gnumake中,可以执行类似于
X:=$(shell命令-vfoo)
的操作,将X设置为该shell命令的输出。有没有一种方法可以用纯POSIX make实现同样的效果?

我不知道POSIX的具体情况,因为GNU make是如此的普遍,但是您可以在
sh
中找到的标准backtick语法应该是存在的

另外,
:=
构造是特定于GNU的,因此您应该只使用变量赋值,默认情况下是惰性的。如果您可以懒散地使用它,考虑到这些工具的传统,即它出现在
sh
中,以及
make
中程序输出的重要性,那么可以合理地假设您可以使用反勾号

X=`command -v foo`
最后,
make
调用始终允许在调用中定义宏:

$ make VAR=value VAR=value ... target...

在POSIX中还没有任何方法。有一种可能会在某个时候被接受的方法,它允许
=赋值,类似于使用
$(shell…
。较新版本的GNU使用这种语法,BSD也使用这种语法

X != command -v foo

所以这里的关键词是“lazyly”–我在BSD上尝试了这个方法,在计算其他变量后,使用
$(X)
的规则将被替换。这也意味着,如果使用反勾号设置X,则不能执行类似于
$($(X)_SOURCES)
的技巧。因此,如果/tmp/test.mk包含
X=`echo foo`;⮒ Y=foo;⮒ foo_VAR=bar;⮒ 全部:;⮒         回声“$(X)”;⮒         回声“$($(Y)_VAR)”;⮒         echo“$($(X)_VAR)”
然后输出为
echo“`echo foo`”⮒ 福⮒ 回音“条”⮒ 酒吧⮒ 回声“”⮒ ⮒ 
我认为将shell命令的输出作为
make
变量或宏名称的一部分不是一个好主意。我知道项目中可能会有一些需求导致您编写这些代码,但通常可以用更直接的方式解决……迭戈,我不会使用
“$($(X)_VAR)”
;)它只是展示了backtick方法的局限性——实际上无法将变量值设置为输出(甚至无法根据命令是否失败设置变量)“应该存在可以在sh中找到的标准backtick语法”——这是不正确的。如果反勾号出现在规则中,则会在临时shell中设置变量(通常仅用于规则的该行,除非给出了
.ONESHELL
),而不是在makefile中。这太棒了!它在FreeBSD上工作,虽然我在GNU make 3.81上找到了一台OSX(10.8.0)机器,但它没有,它似乎是在GNU make的4.0版本中添加的;3.81是在2006年发布的,所以不算“更新版”:(请注意:您永远不会看到OSX附带的GNU make的更新版本。苹果讨厌GPLv3,因此它总是拥有所有GNU程序的更旧版本,从他们将许可证切换到GPLv3之前(这是他们在clang、lldb等方面投入如此之多的一个主要原因)另一个例子,OSX外壳是GNU Bash 3.2.57,从2007年开始,尽管较新的GNUBash版本具有重要的新特性和标准一致性。您可以使用macports或其他外部OSX存储库来安装GNU程序的更新版本。