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