在GNU和BSD Makefile中运行命令并将结果存储到变量中

问题描述 投票:3回答:1

我想在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兼容,它将每次都运行命令。

makefile gnu-make
1个回答
3
投票

在GNU make 4.0中,已添加BSD运算符!=以实现兼容性。对于在此之前制作的GNU版本,您很不幸。您必须使用“穷人”方法,这是递归的make调用。

请非常小心,因为BSD运算符和GNU make $(shell ...)函数的语义略有不同。在您的特定情况下,您不会注意到任何差异,因为shell命令的输出不包含任何变量引用(无$)。

© www.soinside.com 2019 - 2024. All rights reserved.