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

时间:2014-02-19 08:05:48

标签: makefile gnu-make

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

1 个答案:

答案 0 :(得分:2)

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

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