95

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

入力では、次のリストを取得します。

FILES_IN=file1.doc file2.xls

そして、この変数をFILES_IN変数からメイクファイルに作成したいと思います。

FILES_OUT=file1.docx file2.xlsx

出来ますか ?どのように ?

ファイルの一覧をパースして、拡張子(.doc、.xls)ごとに検出し、正しい拡張子に置き換えなければならないので、なかなか大変です。

4

1 に答える 1

157

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

FILES_OUT = $(FILES_IN:=x)

一般的な形式は$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). これは の値を取り、この接尾辞で終わる各単語の末尾を by にVARIABLE置き換えます(一致しない単語は変更されません)。GNU make は、この機能 (すべての make 実装に存在する)置換参照を呼び出します。OLD_SUFFIXNEW_SUFFIX

.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 機能もあります: patsubstfunction .

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
于 2012-08-22T11:18:22.430 に答える