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でビルドしたもの。必要最小限のヘッダだけを切り出して添付。

個人用ツール