web-dev-qa-db-ja.com

GNU makeで複数の拡張子を持つリストの各ファイルの拡張子を変更する方法は?

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

入力では、私はこのリストを取得します:

FILES_IN=file1.doc file2.xls

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

FILES_OUT=file1.docx file2.xlsx

出来ますか ?どうやって ?

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

74
TheFrancisOne

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

_FILES_OUT = $(FILES_IN:=x)
_

一般的な形式は$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)です。これはVARIABLEの値を取り、この接尾辞で終わる各Wordの末尾の_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 function

_FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
_
130
Gilles