带模式的 Makefile 循环文件

Koa*_*ung 4 bash make

在 bash 中,我可以这样做:

for name in sqls/*.{schema,migration}.sql; do
    echo $name; # some operation on the file name
done
Run Code Online (Sandbox Code Playgroud)

它会输出如下内容:

sqls/0001.schema.sql
sqls/0002.schema.sql
sqls/0003.migration.sql
sqls/0004.schema.sql
sqls/0006.schema.sql
sqls/0007.schema.sql
Run Code Online (Sandbox Code Playgroud)

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

names:
    for name in sqls/*.{schema,migration}.sql; do echo $name; done
Run Code Online (Sandbox Code Playgroud)

输出变成:

sqls/*.{schema,migration}.sql
Run Code Online (Sandbox Code Playgroud)

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

arn*_*rna 7

你想要的是:

names:
    for name in sqls/*.{schema,migration}.sql; do\
        echo $${name};\ # some operation on the file name
    done
Run Code Online (Sandbox Code Playgroud)

文档中所述,这是访问GNUMakebash变量之间的区别。这是一个使用两者的简单示例:

LIST = one two three
all:
        for i in $(LIST); do \
            echo $$i; \
        done
Run Code Online (Sandbox Code Playgroud)

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

简而言之,如果您需要 bash 来接收美元符号$,请$$在您的 makefile 中放置一个双美元符号。(请注意,在 makefiles 或 bash 中使用{}()等效的。)


小智 4

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

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