如何在运行时使用 Makefile 中 shell 函数的返回值



我在Makefile的几个地方使用了shell命令的结果。结果在 Makefile 加载时是未知的 - 每次都需要计算。

我尝试了以下方法:

cmd = echo "string"
target:
    ls $(call cmd)
Instead of ls string, I get ls echo string.

由于各种技术原因,您的解决方案并不真正正确,这些原因在这个微不足道的例子中可能无关紧要,但在其他情况下可能会咬得很厉害。

在配方中使用shell始终是[*]的反模式。 在某些情况下,它会产生一些非常奇怪的结果。 您在上面所做的更改就是这样做的。

相反,您希望使用 shell 语法来运行命令并替换其输出:通过反引号或较新的 $(...) 语法。 后者具有更好的嵌套能力,但在makefile配方中使用更烦人,因为它需要引用美元符号。

您可以根据需要将其放在变量内部或外部。 因此,这些解决方案之一更好:

cmd = `echo "string"`
target:
        ls $(call cmd)

cmd = $$(echo "string")
target:
        ls $(call cmd)

cmd = echo "string"
target:
        ls `$(call cmd)`

cmd = echo "string"
target:
        ls $$($(call cmd))

[*] 每条规则总有一个例外... :)

我想通了。而不是: cmd = echo "string"我使用过: cmd = $(shell echo "string") .

最新更新