PREV << TOP >> NEXT

Website Meta Language

Makefileを書くと楽です

一応WMLにはwmkというmakeをするプログラムがあるのですが、残念ながらこれは日本語を扱う時には少々不便です。日本語の場合、コードを変換したりする必要があるのですが、これはwmkでは扱えません。そこで、素直にここは普通のプログラムのようにMakefileを書いてしまいましょう。なに、ちょこちょこと書けばいいだけなので、簡単です。

○ 簡単な例

まず、一番簡単な例からはじめてみましょう。 index.wml というファイルをコンパイルしてindex.htmlを生成します。 Makefile というファイル名で保存して、make あるいは make all とコマンドを打ってください。 そうそう、Makefileでの字下げは例外無くタブですので、御間違えなく。 空白だとエラーが出ます。

[File] Makefile

# wmlの場所
WML = /usr/local/bin/wml
# wmlのオプション
CFLAGS = -O2
# nkfの場所
NKF = /usr/bin/nkf -j
# 一時ファイル
TEMPFILE = /tmp/maketmp
RM = /bin/rm -f

HTML = index.html

###########################################################

All: html

html: $(HTML)
        $(RM) $(TEMPFILE)

index.html: index.wml
        $(WML) $(CFLAGS) index.wml > $(TEMPFILE)
        $(NKF) < $(TEMPFILE) > index.html

一旦コンパイルした後、そのままでは漢字コードがEUCそのままなので、nkfでISO-2022-JPに変換しています。 変換が必要ないのならば、nkfはいりません。 SJISにしたいのならば、-jを-sに変換してください。

○ もうちょっと実用的に

さて、これでは wmd を使っても同じですね。今度は #include を使うことを考えてみまし ょう。上に加えて next.wml というファイルを追加するとします。 そして、共通する部分をまとめた common.wh というファイルを使っているとします、 ついでに make check とすると htmllint で文法をチェック、make clean で作成したHTMLファイルを全部消去するようにしましょう。 依存関係を書いたファイルをいくつも並べなくてもいいように、サフィックス(拡張子)も見て依存関係を自動的につくるようにしています。

[File] Makefile

# wmlの場所
WML = /usr/local/bin/wml
CC = $(WML)

# wmlのオプション
CFLAGS = -O2

# htmllintとそのオプション
HTMLLINT = /home/silver/public_html/htmllint/htmllint
HFLAGS = -noreligious -x communicator

# nkfの場所
NKF = /usr/bin/nkf -j

# rmコマンド
RM = /bin/rm -f

# 一時ファイル
TEMPFILE = /tmp/wmlmaketempfile

# 共通で使うファイル
COMMON_CONTENTS = common.wh

# 最終的に作成するファイル
HTML = index.html next.html
###########################################################

All: html

html: $(HTML)

$(HTML): $(COMMON_CONTENTS)

%.html: %.wml
        $(CC) $(CFLAGS) $< > $(TEMPFILE)
        $(NKF) < $(TEMPFILE) > $@
        $(RM) $(TEMPFILE)

check:
        $(HTMLLINT) $(HFLAGS) $(HTML)

clean:
        rm -f $(HTML)

これで、だいぶ実用的になりましたね。あとは、HTMLにつくりたいファイル名を書いて、新しくそれぞれの依存関係を記述するだけです。 普通に使うだけならば HTML = の行に追加したファイルを記述するだけでも大丈夫でしょう。 単純なサイトならばこれで十分のはずです。 もっと詳しく知りたい方は、makeに関する参考文献を読んでください。

○ 多言語バージョン用 Makefile

WMLでは wml::std::lang を使う事により、多言語のページを一気に生成できます。 しかし、やはりそこに日本語かからむと少々面倒な事もあります。 そこで、多言語用の Makefile を作ってみました。

[File] Makefile

# Website Meta Language
WML = /usr/bin/wml
CFLAGS = -O2
CC = $(WML)

# htmllint
HTMLLINT = /usr/bin/jweblint
HFLAGS =  -x communicator

# Nihongo Kanji Filter
NKF = /usr/bin/nkf -jx

# Basic Commands
RM = /bin/rm -f
MAKE = /usr/bin/make
MAKETARGET = all

# 一時ファイル
TEMPFILE = /tmp/makewmltmp

# 共通ファイル
WMLCONTENTS = common.wh

# 各言語のHTMLファイル
HTML_JA = \
	index.ja.html \
	main.ja.html
HTML_EN = \
	index.en.html \
	main.en.html

# サブディレクトリがあれば書く
SUBDIRS =

##################################################################
HTML = $(HTML_JA) $(HTML_EN)

all: html

subdirs:
	@for i in $(SUBDIRS); \
        do $(MAKE) -C $$i all || exit; \
        done

html: $(HTML)

$(HTML): $(WMLCONTENTS)

# 日本語の場合
%.ja.html: %.wml
	$(CC) $(CFLAGS) -o '(ALL-LANG_*)+LANG_JA:$(TEMPFILE)' $<
	$(NKF) < $(TEMPFILE) > $@
	$(RM) $(TEMPFILE)

# 英語の場合
%.en.html: %.wml
	$(CC) $(CFLAGS) -o '(ALL-LANG_*)+LANG_EN:$@' $<

check:
	$(HTMLLINT) $(HFLAGS) $(HTML)
	@for i in $(SUBDIRS); \
        do $(MAKE) -C $$i check || exit; \
        done

clean:
	rm -f $(HTML)
	@for i in $(SUBDIRS); \
        do $(MAKE) -C $$i clean || exit; \
        done

index.wml のように、一つファイルを作れば、index.ja.html index.en.html というようにそれぞれの言語に分けて生成してくれます。

[File] index.wml

#use wml::std::case global=lower
#use wml::std::lang
#use wml::std::page

<lang:new id=ja short>
<lang:new id=en short>
<page>

<h1>\
<ja>タイトル</ja>\
<en>Title</en>\
</h1>

<h2>
<ja>日本語</ja>\
<en>English</en>\
</h2>

<ja>本文はこんな感じ</ja>\
<en>This is contents area</en>
PREV << TOP >> NEXT