2012-08-22 24 views
59

GNUメイクファイルでは、ファイルリストを入力して新しい拡張子でファイルリストを出力することが可能かどうか疑問に思っています。入力でGNU makeで複数の拡張子を持つリスト内の各ファイルの拡張子を変更するには?

、私はこのリストを得る:

FILES_IN=file1.doc file2.xls 

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

FILES_OUT=file1.docx file2.xlsx 

が、それは可能ですか?どうやって ?

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

答えて

107

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

FILES_OUT = $(FILES_IN:=x) 

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

この機能を使用してを.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))) 
+2

ルールが本当にそのジェネリックにできるのであれば、単に 'FILES_OUT:= $(patsubst%、%x、$(FILES_IN))'です。 – tripleee

+0

@Gillesこの有益な答えをありがとう! – TheFrancisOne

+0

この演算子の名前は何ですか?私はマニュアルをチェックしたいが、適切な名前を見つけることができない。 – rkioji

関連する問題