From: Diane Trout Date: Thu, 27 Jul 2006 00:25:46 +0000 (+0000) Subject: make it possible to build mussa with python X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=mussa.git;a=commitdiff_plain;h=949fb3457eb4232fa9c97f1dc4646548ff4cfab0 make it possible to build mussa with python (well actually this patch will now default to building with python) Getting this to work required popping the qui/mussagl target down to the root of the CMakeLists.txt because the executable depended on both the mussa_qui library and the mussa_py library and the mussa_py code depended on the mussa_qui library. Which meant that the simple linear ADD_DIRECTORY structure wouldn't work. ADD_DIRECTORY(py) had to be between building the qui library and the executable. as a bonus this actually puts the executable in a more comprehensible place. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index e5ca030..7474cec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,6 @@ PROJECT(mussa) ENABLE_TESTING() CMAKE_MINIMUM_REQUIRED(VERSION 2.2) - # try to include our cmake modules SET (CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/makelib) @@ -12,6 +11,21 @@ IF(NOT CMAKE_BUILD_TYPE) FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) +# configure python +SET(USE_PYTHON 1) + +# include packages we depend on +FIND_PACKAGE(Qt4) +SET(QT_USE_QTOPENGL 1) +IF(QT_ASSISTANT_LIB) + SET(QT_USE_QTNETWORK 1) + SET(QT_USE_QTASSISTANT 1) +ENDIF(QT_ASSISTANT_LIB) +INCLUDE( ${QT_USE_FILE} ) +FIND_PACKAGE(OpenGL) +FIND_PACKAGE(Boost) +FIND_PACKAGE(PythonLibs) + # all of our source files al relative to the root of our project INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) ADD_SUBDIRECTORY( doc ) @@ -19,3 +33,60 @@ ADD_SUBDIRECTORY( alg ) ADD_SUBDIRECTORY( qui ) ADD_SUBDIRECTORY( py ) +SET(MAIN_SOURCES + qui/mussagl.cpp) +ADD_EXECUTABLE(mussagl WIN32 MACOSX_BUNDLE ${MAIN_SOURCES} ) + +TARGET_LINK_LIBRARIES(mussagl + mussa_core + mussa_qui + ${QT_LIBRARIES} + ${OPENGL_gl_LIBRARY} + ${BOOST_PROGRAM_OPTIONS_LIBRARY} + ${BOOST_FILESYSTEM_LIBRARY} + ) + +IF(USE_PYTHON) + INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) + SET(PYTHON_CFLAGS "-DUSE_PYTHON") + TARGET_LINK_LIBRARIES(mussagl + mussa_py + ${BOOST_PYTHON_LIBRARY} + optimized ${PYTHON_LIBRARIES} + debug ${PYTHON_DEBUG_LIBRARIES} + ) +ENDIF(USE_PYTHON) + +GET_MUSSA_COMPILE_FLAGS(MAIN_CFLAGS) +GET_MUSSA_LINK_FLAGS(MAIN_LDFLAGS) + +SET_SOURCE_FILES_PROPERTIES( + ${MAIN_SOURCES} + PROPERTIES + COMPILE_FLAGS "${MAIN_CFLAGS} ${PYTHON_CFLAGS}" +) +SET_TARGET_PROPERTIES( + mussagl PROPERTIES + COMPILE_FLAGS "${MAIN_CFLAGS}" + LINK_FLAGS "${MAIN_LDFLAGS}" +) + +# we need Cocoa in order to find where our base directory is (AKA bundle) +IF(APPLE) + SET(COCOA_LIBRARY "-framework Cocoa") + TARGET_LINK_LIBRARIES(mussagl ${COCOA_LIBRARY}) + SET(MACOSX_BUNDLE_BUNDLE_NAME "Mussa") + SET(MACOSX_BUNDLE_LONG_VERSION_STRING "Mussa Copyright 2004-2006 California Institute of Technology") + SET(MACOSX_BUNDLE_COPYRIGHT "Copyright 2004-2006 California Institute of Technology") + SET(MACOSX_BUNDLE_ICON_FILE "mussa") + + SET(APP_DIR ${CMAKE_BINARY_DIR}/mussagl.app/Contents) + SET(RESOURCE_DIR ${APP_DIR}/Resources}) + + ADD_CUSTOM_TARGET(mussa.icns ALL + cmake -E copy_directory ${CMAKE_SOURCE_DIR}/icons/osx + ${APP_DIR} + ) +ENDIF(APPLE) + + diff --git a/py/CMakeLists.txt b/py/CMakeLists.txt index 8bb2429..02ad969 100644 --- a/py/CMakeLists.txt +++ b/py/CMakeLists.txt @@ -21,10 +21,8 @@ IF(BOOST_PYTHON_LIBRARY) sequence.cpp ) - #SET_SOURCE_FILES_PROPERTIES(${SOURCES} COM - ADD_LIBRARY(mussa MODULE ${SOURCES}) - # ADD_LIBRARY(mussa_py STATIC ${SOURCES}) + ADD_LIBRARY(mussa_py STATIC ${SOURCES}) ADD_CUSTOM_TARGET(mussa.so ALL COMMAND cp libmussa.so mussa.so DEPENDS mussa) @@ -39,6 +37,19 @@ IF(BOOST_PYTHON_LIBRARY) ${QT_LIBRARIES} ) + GET_MUSSA_COMPILE_FLAGS(PY_CFLAGS) + GET_MUSSA_LINK_FLAGS(PY_LDFLAGS) + SET_SOURCE_FILES_PROPERTIES( + ${SOURCES} + PROPERTIES + COMPILE_FLAGS "${PY_CFLAGS}" + ) + SET_TARGET_PROPERTIES( + mussa mussa_py PROPERTIES + COMPILE_FLAGS "${PY_CFLAGS}" + LINK_FLAGS "${PY_LDFLAGS}" + ) + IF(PYTHON_EXECUTABLE) SET(PYTHON_TEST_DIR ${CMAKE_SOURCE_DIR}/py/test/) ADD_TEST(sequence_py diff --git a/qui/CMakeLists.txt b/qui/CMakeLists.txt index bead7f8..dfdba48 100644 --- a/qui/CMakeLists.txt +++ b/qui/CMakeLists.txt @@ -63,8 +63,6 @@ SET(GUI_SOURCES seqbrowser/SequenceDescription.cpp ) -SET(MAIN_SOURCES - mussagl.cpp) SET(RCCS ../icons.qrc) QT4_ADD_RESOURCES(RCC_SOURCES ${RCCS}) @@ -82,53 +80,16 @@ ADD_LIBRARY(mussa_qui STATIC ${SOURCES}) TARGET_LINK_LIBRARIES(mussa_qui mussa_core) -ADD_EXECUTABLE(mussagl WIN32 MACOSX_BUNDLE ${MAIN_SOURCES} ) - -TARGET_LINK_LIBRARIES(mussagl - mussa_core - mussa_qui - ${QT_LIBRARIES} - ${OPENGL_gl_LIBRARY} - ${BOOST_PROGRAM_OPTIONS_LIBRARY} - ${BOOST_FILESYSTEM_LIBRARY} - ) - -IF(USE_PYTHON) - SET(CFLAGS "-DUSE_PYTHON=1 ${CFLAGS}") - TARGET_LINK_LIBRARIES(mussagl - ${BOOST_PYTHON_LIBRARY} - optimized ${PYTHON_LIBRARIES} - debug ${PYTHON_DEBUG_LIBRARIES} - ) -ENDIF(USE_PYTHON) - SET_SOURCE_FILES_PROPERTIES( - ${SOURCES} ${MAIN_SOURCES} + ${SOURCES} PROPERTIES COMPILE_FLAGS "${QUI_CFLAGS}" ) SET_TARGET_PROPERTIES( - mussagl mussa_qui PROPERTIES + mussa_qui PROPERTIES COMPILE_FLAGS "${QUI_CFLAGS}" LINK_FLAGS "${QUI_LDFLAGS}" ) -# we need Cocoa in order to find where our base directory is (AKA bundle) -IF(APPLE) - SET(COCOA_LIBRARY "-framework Cocoa") - TARGET_LINK_LIBRARIES(mussagl ${COCOA_LIBRARY}) - SET(MACOSX_BUNDLE_BUNDLE_NAME "Mussa") - SET(MACOSX_BUNDLE_LONG_VERSION_STRING "Mussa Copyright 2004-2006 California Institute of Technology") - SET(MACOSX_BUNDLE_COPYRIGHT "Copyright 2004-2006 California Institute of Technology") - SET(MACOSX_BUNDLE_ICON_FILE "mussa") - - SET(APP_DIR ${CMAKE_BINARY_DIR}/qui/mussagl.app/Contents) - SET(RESOURCE_DIR ${APP_DIR}/Resources}) - - ADD_CUSTOM_TARGET(mussa.icns ALL - cmake -E copy_directory ${CMAKE_SOURCE_DIR}/icons/osx - ${APP_DIR} - ) -ENDIF(APPLE) ADD_SUBDIRECTORY( test ) diff --git a/qui/mussagl.cpp b/qui/mussagl.cpp index 3d45cb7..da1311d 100644 --- a/qui/mussagl.cpp +++ b/qui/mussagl.cpp @@ -2,6 +2,7 @@ #ifdef USE_PYTHON #include namespace py = boost::python; +extern "C" void initmussa(); #endif using namespace boost::filesystem; @@ -38,25 +39,8 @@ int main(int argc, char **argv) try { #ifdef USE_PYTHON if (opts.runAsPythonInterpeter) { + PyImport_AppendInittab("mussa", &initmussa); Py_Initialize(); - py::object main_module((py::handle<>(py::borrowed(PyImport_AddModule("__main__"))))); - py::object main_namespace = main_module.attr("__dict__"); - - py::handle<> ignored((PyRun_String( - //"from IPython.Shell import IPShellEmbed\n" - //"shell = IPShellEmbed(['mussa'], '')\n", - //"import mussa\n" - "def square(x):\n" - " r = x * x\n" - " print 'the square is %d' % (r)\n" - " return r\n", - Py_file_input, - main_namespace.ptr(), - main_namespace.ptr()) - )); - py::object square = main_module.attr("square"); - int result = py::extract(square(3)); - std::cout << "C++ has " << result << std::endl; PyRun_InteractiveLoop(stdin, "mussa"); } else #endif /* USE_PYTHON */