GNU makeの複数の拡張子を持つリスト内の各ファイルの拡張子を変更するにはどうすればよいですか?


84

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

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

FILES_IN=file1.doc file2.xls

そして、FILES_IN変数からmakefileにこの変数を作成したいと思います。

FILES_OUT=file1.docx file2.xlsx

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

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

回答:


141

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

FILES_OUT = $(FILES_IN:=x)

一般的な形式は$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)です。これはの値を取り、この接尾辞で終わる各単語の終わりでで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)。この機能はGNUmakeに固有のものではありませんが、単純な接尾辞を変更する置換ほど移植性はありません。

同じ行に複数の置換を連鎖させることができるGNUmake機能もあります:patsubst関数

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

3
またはFILES_OUT := $(patsubst %,%x,$(FILES_IN))、ルールを実際にその一般的なものにすることができる場合。
トリプリー2012

この演算子の名前は何ですか?マニュアルを確認したいのですが、正しい名前が見つかりません。
rph 2016年

1
@rkiojiどの演算子?GNU makeマニュアルへのリンクを示しますが$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)、他に何を参照していますか?
Gilles'SO-邪悪になるのをやめなさい '2016

@Gillesそうそう、リンクが表示されませんでした。私は「置換」に言及しました。ありがとう!
rph 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.