ClearSilver
出典: やる気向上作戦
目次 |
ClearSilverとは
ClearSilver とは、Brandon Long氏とneotonic社により開発された、 C言語によるテンプレートエンジン。TracがPythonバインディングを使用していることで有名。 また、Google Groups等の著名なサイトも、ClearSilverを利用して構築されている。
使いどころ
各種のデータ整形に重宝する。 とにかく、C/C++で使えるテンプレートエンジンは貴重。
Windows上でビルドする
環境構築
http://www.mingw.org/download.shtml から、MingwとMSYSをインストール。また、pexports用にMinGW Utilitiesもインストールしておくこと。
ソースコード編集
ClearSilverのAPIの中には、内部でメモリブロックを確保して返すものがある。 DLL内で確保したメモリブロックは、C Runtime Libraryの違いを考慮し、原則としてDLL内で解放しなければならない。 そこで、neo_misc.h, neo_misc.c に、以下の関数を追加
void* ne_alloc(size_t len)
{
return malloc(len);
}
void ne_free(void* data)
{
free(data);
}
hdf_write_string()等の、内部でメモリを確保して返す関数を使用した場合は、必ず上記のne_free()を用いて解放すること。
cgi.c内で、feature.hで宣言される関数sleepを使用しているが、MinGWには存在しない。sleepはデバッグにしか使用しないので、ダミー関数にすりかえる。
以下のダミー関数をcgi.cに追加。
static unsigned int sleep(unsigned int seconds)
{
return seconds;
}
ビルド
configure & makeで問題なくビルド可能。
Pythonモジュールのビルド
configure時に、以下のようにpython.exeの場所を指定。
configure --with-python=/c/Python25/python.exe --disable-compression
rules.mkを以下のとおり書き換える
PYTHON_INC = -I/c/Python25/include
PYTHON_LIB = -L/c/Python25/libs -lpython25
makeすると、pythonディレクトリにneo_cgi.pydができるので、これをsite-packagesにコピーする。
DLL化
まず、libneo_cs.aとlibneo_util.aを結合し、一つのライブラリにする。
ar x libneo_cs.a
ar x libneo_utl.a
ar r libclearsilver.a *.o
a2dllコマンドで、DLL化
a2dll libclearsilver.a
defファイルを作成
pexports clearsilver.dll > clearsilver.def
clearsilver.defを編集し、適宜シンボルを削除。テンプレートエンジンとして使うだけなら、 cs_*, hdf_*, ne_alloc/free, nerr_*, NERR_* があればよい。
VC付属のlibコマンドを利用し、インポートライブラリを作成
lib /DEF:clearsilver.def /OUT:clearsilver.lib
libコマンド使用時のみWindowsのコマンドプロンプトで作業。
ヘッダファイルを修正
neo_files.h内でmode_t、util/filter.h内でpid_tと、VC付属のヘッダに存在しない型が使用されている。 typedefするか、ヘッダ自体をコメントアウト。 また、libneo_cs.a, libneo_utl.a しかDLL化してないので、cgi/*.h もコメントアウト。
また、neo_err.h内、
extern NERR_TYPE NERR_*;
を、
__declspec(dllimport) NERR_TYPE NERR_*;
に置換。
バイナリキット
ClearSilver 0.10.5 をMinGW5.0.3 + Python2.5でビルドしたもの。必要最小限のヘッダだけを切り出して添付。
