boost.pythonをcmakeでコンパイルする方法

boost.pythonをcmakeでコンパイルする方法です. ubuntu7.10,centos5で動作を確認しています.

例として以下のコード boopy.cpp をcmakeでコンパイルする方法を示します.

#include <boost/python.hpp>
#include <boost/python/numeric.hpp>
using namespace boost::python;

char const* say_yes(){return "YES!!";}

// See if we can invoke array() from C++
object new_array()
{
    return numeric::array(make_tuple(
            make_tuple(1,2.2,3)
          , make_tuple(4,5,6)
          , make_tuple(7,8,9)
		   ),'d');
}

// test argument conversion
void take_array(numeric::array x){x[make_tuple(0,0)]= 0.5;}

BOOST_PYTHON_MODULE(libboopy)
{
    def("yes", say_yes);
    def("new_array", new_array);
    def("take_array", take_array);
}
  • boopy.cppと同じディレクトリにCMakeLists.txtというファイル名の以下のテキストファイルを作る
INCLUDE_DIRECTORIES(  /usr/include/python2.4       )
ADD_LIBRARY(boopy  SHARED boopy.cpp )
TARGET_LINK_LIBRARIES(boopy boost_python python2.4 )
$ cmake .
$ make
  • 以下のpythonコード boopy.pyでlibboopy.soを呼び出すテストができます
    • emacsから実行するときはboopy.pyを開いてc-c c-cすれば実行される
def boopy_test():
    import sys
    import numarray
    import libboopy
    print libboopy.yes()
    x =  libboopy.new_array()
   print x
    libboopy.take_array(x)
    print x
    z=numarray.array([[0,1],[1,3]], numarray.Float)
    print z 
    libboopy.take_array(z)
    print z
if __name__ == '__main__':
    print "running..."
    import sys
    boopy_test()

以下の出力が得られる

YES!!
[[ 1.   2.2  3. ]
 [ 4.   5.   6. ]
 [ 7.   8.   9. ]]
[[ 0.5  2.2  3. ]
 [ 4.   5.   6. ]
 [ 7.   8.   9. ]]
[[ 0.  1.]
 [ 1.  3.]]
[[ 0.5  1. ]
 [ 1.   3. ]]