我在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")
.