我想在Makefile中执行命令,将结果存储到变量中,然后重用结果。
在BSD Makefile中,我可以使用!=运算符:
PASSWORD != openssl rand -base64 48
在GNU Makefile中,我可以使用shell函数:
PASSWORD := $(shell openssl rand -base64 48)
有没有办法以这样的方式写这个与两个make兼容?
预期输出
在这两种情况下,命令的结果都分配给了PASSWORD,所以我可以在Makefile中重用相同的PASSWORD值:
quux:
@echo $(PASSWORD)
@echo $(PASSWORD)
如果我运行make quux
,则会输出相同密码的两倍。
例如:
$ gmake quux
Y0ZrQQqLF9JK98x9UiIwWwcCN2Cq1wNqzph3ShG1RK0NeqbxWn6p4XB5zgHvfnbY
Y0ZrQQqLF9JK98x9UiIwWwcCN2Cq1wNqzph3ShG1RK0NeqbxWn6p4XB5zgHvfnbY
这与使用反引号运算符不同。在这种情况下,与两个make兼容,它每次都会运行命令。
答案 0 :(得分:2)
在GNU make 4.0中,添加了BSD运算符!=
以实现兼容性。对于之前版本的GNU make,你运气不好。你将不得不使用“穷人的”方法,这是一个递归的make调用。
要非常小心,因为BSD运算符和GNU make $(shell ...)
函数的语义略有不同。在您的特定情况下,您需要注意任何差异,因为shell命令的输出不包含任何变量引用(无$
)。