2008年10月10日金曜日

sconsのバグ in vc8, vc9

だいぶ前にバグレポートを出したのですが、
1.0.1でも未だに直っていないようなのでここに書いておきます。

VC8およびVC9でコンパイルをしようとすると、インクルード・ライブラリ・実行ファイルのパスが正しくcl.exeに渡されません。
解決方法は、sconsのインストール先(たいていはpythonのインストールディレクトリの下のどこかのはずです)から見て、/Tools/msvc.pyの223行目(あたり)、
var_name = environment_var_map.get(property_name)

var_name = environment_var_map.get(property_name.value)
に書き換えるだけです。

英語圏でも困っている人が多いようなので以下適当な英語訳 見なかったことにしてください

scons has a bug on platform VC8 and VC9, it cannot detect the paths thosespecified from VC's IDE configuration. (Tools -> Option -> Project and Solution, I only have Japanese edition so menu name might differ, but you would be able to guess what I want to say!)
All you need to do to fix this bug is to append six characters to (Scons-Root)/Tools/msvc.py: line 223,
var_name = environment_var_map.get(property_name)
to
var_name = environment_var_map.get(property_name.value)
Then you can enjoy hi-customizable brilliant make system, scons.

2008年10月2日木曜日

boost::python、embedding(埋め込み)

あまりにも本家のドキュメントが少なく、また日本語で検索してもほとんどひっかかりません。
また、真面目にやろうとするとboost::pythonとPythonについて熟知しなくてはならないようで、
これは意外と手間のかかる作業かもしれません。

一般にboost::pythonは『PythonからC++のコードを呼び出す』という文脈で使われることが多いようですが、
その逆、『C++からPythonを呼び出す』ことも当然サポートしています。
一番簡単な例、要するにC++からPythonで書かれた関数を呼び出して値を返してもらう、
ということのやり方は本家のドキュメントにあるので(それしかないとも言う)、ここでは書きません。
しかし埋め込みを実用的なものにするには、もっと多くの機能が必要で、
それらはboost::python上で実装されているにも関わらずほとんどドキュメントが(英語ですら)ありません。

やりたいことその1は、C++から呼び出したPython上のコードで、
C++で書かれたクラスやenumを使いたい、というような場合です。
embeddingでなければ、これはBOOST_PYTHON_MODULEを使えば難なくできることなのですが、
embeddingでのやり方は今のところドキュメントに記述されていません。

結論から言えば、非embedding時の方法にもう二手間加えることで、
embedding時もこれは容易に可能になります。
手間一つ目は、BOOST_PYTHON_STATIC_LIBを#defineすること。
手間二つ目は、Py_Initialize()する前に、PyImport_AppendInittabでモジュールを登録することです。

後者は少しだけ追加説明が必要でしょうか。
BOOST_PYTHON_MODULE(name)は、init##name()という関数を定義しています。
これをPyImport_AppendInittab関数に渡してやることにより、
はじめてPythonスクリプト内でimportできるようになります。
  int PyImport_AppendInittab( char *name, void (*initfunc)(void)) 


その2に続く?