1. ホーム
  2. makefile

[解決済み] GNU makeで再帰的ワイルドカード?

2022-11-22 19:42:50

質問

久しぶりに make を使うのは久しぶりなので、我慢してください...

ディレクトリを flac というディレクトリがあり、.FLAC ファイルが含まれています。対応するディレクトリを mp3 には MP3 ファイルがあります。FLAC ファイルが対応する MP3 ファイルよりも新しい場合 (または、対応する MP3 ファイルが存在しない場合)、FLAC ファイルを MP3 ファイルに変換し、タグをコピーする一連のコマンドを実行したいのですが、どうすればよいでしょうか?

キッカー: 私は flac ディレクトリを再帰的に検索し、対応するサブディレクトリを mp3 ディレクトリに対応するサブディレクトリを作成します。ディレクトリとファイルの名前にはスペースを含めることができ、UTF-8で命名される。

そして、私が使いたいのは make を使って駆動させたい。

どのように解決するのですか?

私なら、次のような方法をとります。

FLAC_FILES = $(shell find flac/ -type f -name '*.flac')
MP3_FILES = $(patsubst flac/%.flac, mp3/%.mp3, $(FLAC_FILES))

.PHONY: all
all: $(MP3_FILES)

mp3/%.mp3: flac/%.flac
    @mkdir -p "$(@D)"
    @echo convert "$<" to "$@"

いくつかの簡単なメモ make の初心者のためのいくつかの簡単なメモです。

  • @ は、コマンドの前にある make が実際に実行する前にコマンドを表示することを防ぎます。
  • $(@D) はターゲットファイル名のディレクトリ部分 ( $@ )
  • シェルコマンドを含む行は、スペースではなく、タブで始まることを確認してください。

これがすべてのUTF-8文字などを処理するとしても、ファイル名やディレクトリ名にスペースがあると、次のように失敗します。 make はメイクファイル内のものを区切るためにスペースを使用し、私はそれを回避する方法を知らないからです。そのため、シェルスクリプトを使用することになりますが、残念です。