Makefile 使用模式循环文件

Makefile 使用模式循环文件

在 bash 中,我可以这样做:

for name in sqls/*.{schema,migration}.sql; do
    echo $name; # some operation on the file name
done

它会输出类似这样的内容:

sqls/0001.schema.sql
sqls/0002.schema.sql
sqls/0003.migration.sql
sqls/0004.schema.sql
sqls/0006.schema.sql
sqls/0007.schema.sql

但是,如果我将相同的循环放入 Makefile 中:

names:
    for name in sqls/*.{schema,migration}.sql; do echo $name; done

输出变为:

sqls/*.{schema,migration}.sql

我如何在 Makefile 中做同样的事情?

答案1

你想要的是:

names:
    for name in sqls/*.{schema,migration}.sql; do\
        echo $${name};\ # some operation on the file name
    done

正如中所解释的文档,这就是访问之间的区别GNUMake巴什变量。这是一个使用两者的简单示例:

LIST = one two three
all:
        for i in $(LIST); do \
            echo $$i; \
        done

i是一个 bash 变量,而LIST是一个 GNUMake 变量。

简而言之,如果您需要 bash 接收美元符号,请在 makefile 中$添加双美元符号。 $$(请注意,使用{}or()makefile 或 bash 中的等效项.)

答案2

您需要意识到 {...} 是一个 bash 构造,而 Makefiles 通常启动不支持大括号扩展功能的 sh。

然而一切并没有失去;如果您使用 GNU Make,那么您可以通过将这一小行放在SHELL := bashMakefile 的最顶部来告诉 Make 使用 bash。

相关内容