カレントディレクトリに複数のXMLファイル(*.xml)があり、
これをHTMLに変換したい。
このときMakeを使って、更新されたファイルだけ変換するようにしたいがどうすればいいか。
前提条件
もしXMLファイル数が変化しないならば、
Makefile に以下のように記述しておけばよい。
(変換対象となるファイルは foo1.xml foo2.xml foo3.xml)
.SUFFIXES: .SUFFIXES: .xml .html .xml.html : cat $< | /bin/toHtml > $@ all: foo1.html foo2.html foo3.html
しかし、foo4.xml,foo5.xml,hoge1.xml といった具合に
どんどん変換対象ファイルが増える場合、
ファイル名/ファイル数が変化するたびに、Makefile を書き換えるのは面倒な上、間違いが起きる。
ファイル数が変化しても、対応できるMakefileを書くにはどうしたらいいか?
ファイル名/ファイル数が変化しても対応できるように、
Makefile中に カレントディレクトリにある.xmlファイルを列挙して make を実行する*
シェルスクリプトを書いてしまいます。
.SUFFIXES:
.SUFFIXES: .xml .html
.xml.html :
cat $< | /bin/toHtml > $@
.PHONY: all
all:
for xmlf in *.xml ; do htmlf=$${xmlf%.*}.html; $(MAKE) $$htmlf ; done
.PHONY: clean
clean:
$(RM) *.html
Makefile中にシェルスクリプトを書くのがはばかられる場合は、
以下の その2 の方法を使います。
※この方法は、MASA.H氏に教えていただきました。感謝します。
Makefileだけで解決する方法がありました。
.SUFFIXES: .SUFFIXES: .xml .html .xml.html : cat $< | /bin/toHtml > $@ xmlfiles:=$(wildcard *.xml) htmlfiles=$(xmlfiles:.xml=.html) .PHONY: all all: $(htmlfiles) .PHONY: clean clean: $(RM) $(htmlfiles)
ポイントは以下の2つです。
xmlfiles:=$(wildcard *.xml)
これでカレントディレクトリにあるxmlファイルを$(xmlfiles)に代入することができます。
makeでは最終的に生成したファイル名を指定しなければならないため、
xmlの拡張子を持つファイル名を得ただけでは、問題は半分しか解決していません。
たとえば、*foo-1.xml foo-2.xml* がカレントディレクトリにあるならば、
ここで実際に得たい文字列は、*foo-1.html foo-2.html* になります。
ポイント1)により既に、$(xmlfiles)=*foo-1.xml foo-2.xml* は得ているため、
あとはこのxmlの部分をhtmlに変える呪文をとなえます。
htmlfiles=$(xmlfiles:.xml=.html)
MindBoard は 直観的な操作で簡単にマインドマップを描くことができる Android タブレット用アプリです。