Wt C++ Web Toolkit

通常 Java Servlet で実装する Ajax 非同期通信 Web サーバアプリケーションを C++ で書けないか調べていて,Wt ("Witty", a C++ Web Toolkit) というツールキットの存在を知った。Widget(画面構築部品のようなもの)志向の強い設計になっていて,Web 画面を Widget で組立てることができる。画像操作にも強い。メッセージを言語に応じて切り替える API も備えている。クエリを出す HTML や JavaScript も Widget で自動的に生成してしまうような凝り様である。

私としては,クエリを出す HTML + JavaScript を別リソースとして用意し,サーバ側だけが Java ではなく C++ のアプリが動いている,というイメージのほうがわかり易いのだけれども,Wt の方式に則れば,いわゆるビジネスロジックのすべてをユーザから見えにくくするというメリットがある(HTML,JavaScript を独立したリソースとして公開すると,JavaScript コードから業務データ構造がパクられるなどの危険性がある)。今日は,Mac OS X Snow Leopard への Wt インストール備忘録。

Wt は CMake と Boost C/C++ ライブラリを前提とする。これらをあらかじめ導入しておく。ここではその導入手順は割愛。Wt 最新バージョンは 3.2.1 であり,Wt ダウンロードページから取得できる。私は開発最中の最新 Git リポジトリから引っ張って来てインストールした。ここではそのトップディレクトリ名として wt を説明のために使うものとする。wt-3.2.1.tar.gz アーカイブを展開した場合は wt-3.2.1 となる。

% cd ~/tmp
% git clone http://www.webtoolkit.eu/git/wt.git

wt 直下にある INSTALL ファイルに導入手順が書かれている。オプション的に入れておくとよい画像処理ライブラリについてはこちらを参照のこと。以下のようにして Wt リソースをコンパイルする。

% cd ~/tmp/wt
% mkdir build
% cd build
% cmake -DBOOST_DIR=/usr/local ../
% make

けっこう時間がかかる。ところが,私の Mac OS X 環境では,Boost ライブラリの取り込みでリンケージがことごとく失敗してしまい,libwt.dylib を生成できず悩んだ。FreeBSD でやってみたらすんなりインストールできた。Mac OS X は私の開発用マシンなので,Wt をぜひとも動かせるようにしておきたい。

こういうとき,CMake で自動生成した Makefile を使っているシステムは,どこで何をやっているのか調査するのに大いに苦労する。リソースを grep しまくってリンケージ指定を探したら,link.txt に記述した内容で実行していることがわかった。これを確認すると,C++ コンパイラへの Boost ライブラリ指示が,/opt/local/lib/libboost_thread-mt.dylib /opt/local/lib/libboost_regex-mt.dylib ... のような感じで羅列されてあった。-mt という余計なものが勝手に付加されていて,これじゃ見つからないはずだと納得した。さらにライブラリの指示なら -lライブラリ にしたほうがよいのではないかと思われた。

link.txt はうんざりするほど数がある。というわけで,配下の link.txt をすべて探し出して,リンク指定を書き換えるシェルスクリプトを書いた。

#!/bin/sh
# Web toolkit link option 訂正
for i in `find . -name "link.txt"`
do
    cp $i $i.bak
    cat $i | sed -e \
's/\/opt\/local\/lib\/libboost_thread-[^\.]*\.dylib/-lboost_thread/g' |\
    sed -e \
's/\/opt\/local\/lib\/libboost_random-[^\.]*\.dylib/-lboost_random/g' |\
    sed -e \
's/\/opt\/local\/lib\/libboost_regex-[^\.]*\.dylib/-lboost_regex/g' |\
    sed -e \
's/\/opt\/local\/lib\/libboost_signals-[^\.]*\.dylib/-lboost_signals/g' |\
    sed -e \
's/\/opt\/local\/lib\/libboost_system-[^\.]*\.dylib/-lboost_system/g' |\
    sed -e \
's/\/opt\/local\/lib\/libboost_filesystem-[^\.]*\.dylib/-lboost_filesystem/g' |\
    sed -e \
's/\/opt\/local\/lib\/libboost_date_time-[^\.]*\.dylib/-lboost_date_time/g' \
    > $i.new
    mv $i.new $i
done

ビンゴでした。これを実行した結果,リンケージはすべてうまく行った。sudo make install でインストールする。

例題プログラムもコンパイルしておく。こういうのがシステム仕様の理解・勉強にいちばん役立つ。

% cd ~/tmp/wt/build
% make -C examples

コンパイルが通ったら,動かしてみる。Wt はアプリを FastCGI として動作させることができる一方,libwthttp とリンケージすることにより,なんとアプリそのものをスタンドアローンの HTTP/WebSockets サーバ(wthttp)として動作させることができる。添付の例題プログラムの一つ composer(簡易メールソフト)は wthttp サーバとして動作するようコンパイルされる。以下のオペレーションを行って動かしてみる。wthttp サーバ起動のオプション詳細はドキュメント 10.4 Wt httpd (command-line or configuration file) options を参照のこと。ロギングなどもでき,なかなかである。シンプルな分,おそらく高速に動作すると思う。

% cd ~/tmp/wt/examples/composer
% ln -s ../../resources .
% ../../build/examples/composer/composer.wt --docroot . \
  --http-address 0.0.0.0 --http-port 8080

ブラウザでこのサーバにアクセスしてみた画面は次の通り。

20120426-wtex.pngcomposer, Wt example

いいものを見つけた。早速メーリングリストにも参加を申し込んだ。私のプーシキン・コンコーダンスのコントローラもこれで行くつもりで,いま API を研究中である。