make it possible to build mussa with python
authorDiane Trout <diane@caltech.edu>
Thu, 27 Jul 2006 00:25:46 +0000 (00:25 +0000)
committerDiane Trout <diane@caltech.edu>
Thu, 27 Jul 2006 00:25:46 +0000 (00:25 +0000)
(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.

CMakeLists.txt
py/CMakeLists.txt
qui/CMakeLists.txt
qui/mussagl.cpp

index e5ca03000c79ebf9c11fcfe7dc6930c78f2f9cd1..7474cec63920729e9dcdd564e0d7cf603f158b34 100644 (file)
@@ -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)
+
+
index 8bb24294f8b51102535dde692eb526c67bf7244c..02ad969bb6669fa8cb4bea4ad9b19457feed69b2 100644 (file)
@@ -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 
index bead7f8036017707a46d3e845fcf4ae34408b494..dfdba484b727791d350312af48b805effe1672c4 100644 (file)
@@ -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 )
index 3d45cb7dc9c164afd1f3ed6a82337aa87e4c6d2c..da1311d0ee15610dc7089ee285a46e3f9856a49c 100644 (file)
@@ -2,6 +2,7 @@
 #ifdef USE_PYTHON
 #include <boost/python.hpp>
 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<int>(square(3));
-      std::cout << "C++ has " << result << std::endl;
       PyRun_InteractiveLoop(stdin, "mussa");
     } else 
 #endif /* USE_PYTHON */