Py++を使えるようにするまでのメモ

Python/C APIに比べればboost::pythonのモジュール記法はかなり楽になるとはいえ
対象クラスの修正or変更のたびに手で書き換えるのは少々かったるい。
Py++はC++ソースコードをパースしてboost::pythonのモジュール記法を自動生成してくれるらしい。

必要なもの

GCCXMLのセットアップ

GCC_XMLはVC7.1以上だと公式サイトでバイナリ配布されてる奴だと動きません。
ウチの環境はVC8(2005)なので困った(><)
んでググってみて見つけたこのサイトによるとみるとこの自分でビルドすればいいみたい。
上記サイトではcygwin使ってるみたいだけど俺はcygwin入れたくないのでWinCVSを使ってみることにする。
 
WinCVSとかでOSSなレポジトリにアクセスしてソースをビルドするという事が初体験なので手順をメモしておく。
まずここから"WinCVS13b14-SJIS-12.lzh"をダウンロード。
んでGCC_XMLcvsレポジトリにログインするー。

パスワードを聞かれるが空のままでOKだ。
んで適当なディレクトリにチェックアウトするー。

んでOK押すとががーっとソースコード類が落ちてくる。お茶飲んで待ってろ。
 
次はここから"cmake-2.6.0-win32-x86.zip"を落としてくる
/bin/CMakeSetup.exeを実行してソースディレクトリ,出力ディレクトリの指定があるのでgccxmlのディレクトリを指定。
Configureボタンを押すとビルド環境を指定するダイアログが出るので"VisualStudio8 2005"を指定してOKを押す。
なんか94%ぐらいで警告が出るが良く分からんのでキャンセル押してスルー。
終わるとリストが真っ赤になってるので適当に一つ選択してEnterを押すと灰色にかわりOKボタンが押せるようになる。

OKボタンを押すと出力指定ディレクトリにVisualStudioソリューションファイルがあるのでVC2005で開き、releaseビルドを行う。
エラーが無ければ/bin/releaseに実行ファイル群できました。

ヤッタネ!
あと忘れず上記サイトにあったGCCXML_COMPILERの環境変数の定義とgccxml_vcconfig.exeを使ったパッチ当てをやっておこう。
どちらが欠けてもちゃんと動かないぞ。

pygccxml、py++のセットアップ

PythonインストールディレクトリにPATHを通しておくこと。
公式のsourceForgeからpygccxml-0.9.5.zip、Py++-0.9.5.zipを落としてきて解凍する。
コマンドプロンプトで各々の解凍ディレクトリに移動して"python setup.py install"と打つ。
これですべての準備完了。
 

実際に使ってみる

テスト用に以下のリストをSample.hと名前をつけて適当なディレクトリに保存する。

class CSample {
public:
	CSample() {}
	~CSample();

	int get() { return value; }
	void set( int set ) { value = set; }
private:
	void update() {}
private:
	int value;
};

Py++にはデモ用のGUIフロントエンドがある。
先ほどのPy++のsetupが完了していれば、"\build\scripts-2.5"にpyplusplus_gui.pyw"とファイルが出来ているはずだ。
pyファイルに関連付けされていればダブルクリックするだけでウィンドウが開く。
先頭のヘッダファイル指定にSample.hを、GCC_XML locationに先ほど自分でビルドした"gccxml.exe"を指定する。

generate codeボタンを押すと・・・デター!

#include "boost/python.hpp"

#include "sample.h"

namespace bp = boost::python;

BOOST_PYTHON_MODULE(pyplusplus){
    bp::class_< CSample >( "CSample" )    
        .def( bp::init< >() )    
        .def( 
            "get"
            , &::CSample::get )    
        .def( 
            "set"
            , &::CSample::set
            , ( bp::arg("set") ) );
}

こんな感じ。ちゃんとpublicメンバ類にだけ定義されてる。
 
ちなみにgenerate Py++codeボタンを押すとフロントエンドを起動しなくても
実行するだけで自動的にC++ファイルを吐き出すPythonコードの雛形が出せる。

import os
from pyplusplus import module_builder

#Creating an instance of class that will help you to expose your declarations
mb = module_builder.module_builder_t( [r"D:/pytest/sample.h"]
                                      , gccxml_path=r"D:/oss/gccxml/bin/gccxml.exe" 
                                      , working_directory=r"D:/pytest"
                                      , include_paths=['D:/pytest']
                                      , define_symbols=[] )


#Well, don't you want to see what is going on?
mb.print_declarations()

#Creating code creator. After this step you should not modify/customize declarations.
mb.build_code_creator( module_name='pyplusplus' )

#Writing code to file.
mb.write_module( './bindings.cpp' )

変換するC++クラスの複雑さによっては色々手を加えなくてはいけないらしいのでこのままでは使えないケースのほうが多そうだ。
本運用時にはおそらくこいつに手を加えてソースに修正がある場合にカスタムビルドさせれば自動化が出来るはずだ。
とりあえず今日はここまで。