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

Der*_*son 4 makefile gnu-make

我想在 Makefile 中执行一个命令,将结果存储到一个变量中并稍后重用该结果。

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

PASSWORD != openssl rand -base64 48
Run Code Online (Sandbox Code Playgroud)

在 GNU Makefile 中,我可以使用 shell 函数:

PASSWORD := $(shell openssl rand -base64 48)
Run Code Online (Sandbox Code Playgroud)

有没有办法以与两个 make 兼容的方式编写它?


预期输出

在这两种情况下,命令的结果都分配给 PASSWORD,因此我可以在 Makefile 中重用相同的 PASSWORD 值:

quux:
    @echo $(PASSWORD)
    @echo $(PASSWORD)
Run Code Online (Sandbox Code Playgroud)

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

例如:

$ gmake quux
Y0ZrQQqLF9JK98x9UiIwWwcCN2Cq1wNqzph3ShG1RK0NeqbxWn6p4XB5zgHvfnbY
Y0ZrQQqLF9JK98x9UiIwWwcCN2Cq1wNqzph3ShG1RK0NeqbxWn6p4XB5zgHvfnbY
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*ist 6

在 GNU make 4.0 中,!=为了兼容性添加了 BSD 操作符。对于在此之前的 GNU make 版本,您很不走运。您将不得不使用“穷人的”方法,这是一个递归的 make 调用。

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