1. ホーム
  2. makefile

[解決済み] GNU make で、複数の拡張子を持つリストの各ファイルの拡張子を変更するには?

2023-02-11 21:43:05

質問

GNU makefile において、ファイルリストの入力で、新しい拡張子を持つファイルリストを出力することが可能かどうか疑問に思っています。

入力で、私はこのリストを得ます。

FILES_IN=file1.doc file2.xls

で、この変数をmakefileでビルドしたい。 ファイル_IN という変数があります。

FILES_OUT=file1.docx file2.xlsx

それは可能ですか?どのように?

ファイルリストを解析し、各拡張子(.doc, .xls)を検出し、正しい拡張子に置き換える必要があるため、かなり困難です。

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

空白で区切られたファイル名のリストで拡張子を置換することは一般的な要件であり、このための機能が組み込まれています。もしあなたが x をリスト内のすべての名前の末尾に追加します。

FILES_OUT = $(FILES_IN:=x)

一般的な形式は $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX) . の値をとります。 VARIABLE の値を取り、代わりに OLD_SUFFIX で終わる各単語の末尾を NEW_SUFFIX を追加します (マッチしない単語は変更されません)。GNU make はこの機能を (どの make の実装にも存在する) 置換リファレンス .

を変更したいだけなら .doc.docx.xls.xlsx に変換するためには、中間変数を使用する必要があります。

FILES_OUT_1 = $(FILES_IN:.doc=.docx)
FILES_OUT = $(FILES_OUT_1:.xls=.xlsx)

より一般的な構文である $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX) . この機能はGNU makeに特有のものではありませんが、接尾辞を変更するプレーンな置換ほどには移植性がありません。

また、GNU makeの機能で、同じ行に複数の置換を連鎖させることができるものがあります: それは patsubst 機能 .

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))