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

説明したように文書、これはアクセス間の違いです。グヌメイクそして強く打つ変わりやすい。以下は、両方を使用する簡単な例です。

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

これはibash変数LISTですが、GNUMake変数です。

要するに、ドル記号を受け取るためにbashが必要な場合は、makefileに$二重ドル記号を追加してください。$${}またはを使用()するMakefileまたはbashのそれに対応する項目.)

答え2

{...}はbash構成で、Makefileは通常中括弧拡張機能をサポートしていないshを起動することを認識する必要があります。

しかし、すべてが失われるわけではありません。 GNU Makeを使用している場合は、SHELL := bashMakefileの上部にこの小さな行を配置してMakeにbashを使用するように指示できます。

関連情報