2014-02-19 29 views
2

我想在Makefile中执行一个命令,将结果存储到一个变量中并稍后重新使用结果。在GNU和BSD Makefile中运行一个命令并将结果存储到一个变量中

在BSD Makefile中,我可以使用=运算符:

PASSWORD != openssl rand -base64 48 

在GNU Makefile中,我可以使用shell功能:

PASSWORD := $(shell openssl rand -base64 48) 

是否有这样写这样的方式这是与两个兼容的方式吗?


预期输出

在这两种情况下,命令的结果被分配给密码,所以我可以重用在生成文件相同的PASSWORD值:

quux: 
    @echo $(PASSWORD) 
    @echo $(PASSWORD) 

如果我运行make quux,这将输出两倍的相同的密码。

例如:

$ gmake quux 
Y0ZrQQqLF9JK98x9UiIwWwcCN2Cq1wNqzph3ShG1RK0NeqbxWn6p4XB5zgHvfnbY 
Y0ZrQQqLF9JK98x9UiIwWwcCN2Cq1wNqzph3ShG1RK0NeqbxWn6p4XB5zgHvfnbY 

这是不同于使用反引号运算符。在这种情况下,兼容两个make,它会每次运行命令。

回答

2

在GNU make 4.0中,BSD运营商!=已添加用于兼容性。对于之前的GNU版本,你运气不好。你将不得不使用“穷人的”方法,这是一个递归调用。

要非常小心,因为BSD操作符和GNU make $(shell ...)函数具有稍微不同的语义。在您的特定情况下,您需要注意任何差异,因为shell命令的输出不包含任何变量引用(否$)。

+0

好消息它是在最新的GNU make中得到的。 – Dereckson

相关问题