在makefile中使用花括号进行变量扩展不起作用

时间:2012-10-11 11:17:17

标签: bash shell makefile ubuntu-12.04

当我在shell上运行以下命令时,它可以正常工作。但是如果我在Makefile中写它并用“make”命令调用它就不起作用。

  

cp wpa_ {cli,supplicant,passphrase,event} / usr / local / bin /

“make”命令后出现

错误:

  

cp:无法统计`wpa_ {cli,supplicant,passphrase,event}':没有这样的文件   或目录

如何使其与Makefile一起使用?我使用的是Ubuntu 12.04。相同的Makefile适用于其他Linux发行版。

3 个答案:

答案 0 :(得分:21)

默认使用老式Bourne shell(/ bin / sh),不支持大括号扩展。如果尚未设置,请将生成文件中的SHELL变量设置为/ bin / bash。

答案 1 :(得分:0)

正如史蒂夫·K(Steve K)解释的那样,这是一种bashism。如果您想更严格地遵守标准,则可以使用for循环而不会遇到太多麻烦。

for x in cli supplicant passphrase event; do cp -v wpa_$$x /usr/local/bin/; done

像往常一样,将makefile文件全部放在一行中,或使用反斜杠将其分成几行。双美元符号表示make需要将$传递给shell。

答案 2 :(得分:0)

我喜欢@bk 的回答,因为它符合该工具的约定,但作为参考,您也可以直接调用 bash shell 只用一个命令来进行大括号扩展:

wpa_files := $(shell /bin/bash -c 'echo wpa_{cli,supplicant,passphrase,event}')

target:
    cp $(wpa_files) /usr/local/bin/