浏览代码

Added python bindings build system for cmake.

Hilton Medeiros 15 年之前
父节点
当前提交
940514a0a1
共有 3 个文件被更改,包括 163 次插入3 次删除
  1. 61 3
      Build/CMakeLists.txt
  2. 79 0
      Build/cmake/FileList.cmake
  3. 23 0
      Build/cmake/gen_filelists.sh

+ 61 - 3
Build/CMakeLists.txt

@@ -35,6 +35,7 @@ if(NOT CMAKE_BUILD_TYPE)
 endif()
 
 option(BUILD_SHARED_LIBS "Build shared libraries" ON)
+option(BUILD_PYTHON_BINDINGS "Build python bindings" OFF)
 
 if(NOT BUILD_SHARED_LIBS)
     add_definitions(-DSTATIC_LIB)
@@ -52,6 +53,27 @@ if(FREETYPE_FOUND)
     list(APPEND CORE_LINK_LIBS ${FREETYPE_LIBRARY})
 endif()
 
+if(BUILD_PYTHON_BINDINGS)
+    find_package(PythonInterp REQUIRED)
+    find_package(PythonLibs REQUIRED)
+    execute_process(
+        COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print(sysconfig.get_python_lib(1,0,prefix=''))"
+        OUTPUT_VARIABLE PYTHON_INSTDIR
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    if(PYTHONLIBS_FOUND)
+        include_directories(${PYTHON_INCLUDE_DIR})
+    endif()
+
+    #set(Boost_USE_STATIC_LIBS OFF)
+    #set(Boost_USE_MULTITHREADED ON)
+    find_package(Boost 1.40.0 COMPONENTS python REQUIRED)
+    if(Boost_FOUND)
+        include_directories(${Boost_INCLUDE_DIR})
+        list(APPEND PY_BINDINGS_LINK_LIBS ${Boost_LIBRARY})
+    endif()
+
+endif()
 
 #===================================
 # Setup paths ======================
@@ -91,6 +113,27 @@ foreach(library ${LIBRARIES})
     )
 endforeach(library)
 
+# Build python bindings
+
+if(BUILD_PYTHON_BINDINGS)
+    set(LIBRARIES core controls)
+
+    foreach(library ${LIBRARIES})
+        set(NAME _rocket${library})
+
+        add_library(${NAME} ${Py${library}_SRC_FILES}
+                            ${Py${library}_HDR_FILES}
+                            ${Py${library}_PUB_HDR_FILES}
+        )
+
+        set_target_properties(${NAME} PROPERTIES PREFIX "")
+
+        install(TARGETS ${NAME}
+                LIBRARY DESTINATION ${PYTHON_INSTDIR}
+        )
+    endforeach(library)
+endif()
+
 
 #===================================
 # Link libraries====================
@@ -98,11 +141,26 @@ endforeach(library)
 
 target_link_libraries(RocketCore ${CORE_LINK_LIBS})
 
+if(BUILD_PYTHON_BINDINGS)
+    target_link_libraries(_rocketcore RocketCore ${Boost_LIBRARY})
+    target_link_libraries(_rocketcontrols RocketControls ${Boost_LIBRARY})
+endif()
+
 
 #===================================
 # Installation =====================
 #===================================
 
-install(DIRECTORY ${PROJECT_SOURCE_DIR}/../Include/Rocket
-        DESTINATION include
-)
+if(BUILD_PYTHON_BINDINGS)
+    install(FILES ${PROJECT_SOURCE_DIR}/bin/rocket.py
+            DESTINATION ${PYTHON_INSTDIR}
+    )
+    install(DIRECTORY ${PROJECT_SOURCE_DIR}/Include/Rocket
+            DESTINATION include
+    )
+else()
+    install(DIRECTORY ${PROJECT_SOURCE_DIR}/Include/Rocket
+            DESTINATION include
+            PATTERN "Python" EXCLUDE
+    )
+endif()

+ 79 - 0
Build/cmake/FileList.cmake

@@ -410,3 +410,82 @@ set(Debugger_SRC_FILES
     ${PROJECT_SOURCE_DIR}/Source/Debugger/Geometry.cpp
 )
 
+set(Pycore_HDR_FILES
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextDocumentProxy.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventListenerInstancer.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementInterface.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventListener.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/Module.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventWrapper.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextInterface.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementStyleProxy.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventInterface.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextProxy.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/Converters.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementDocumentWrapper.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/precompiled.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementChildrenProxy.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventInstancer.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementAttributeProxy.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextInstancer.h
+)
+
+set(Pycore_PUB_HDR_FILES
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/VectorInterface.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/Wrapper.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/NameIndexInterface.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/ElementInstancer.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/PickleTypeConverter.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/ElementWrapper.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/Utilities.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/Header.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/Python.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/WrapperIter.h
+    ${PROJECT_SOURCE_DIR}/Include/Rocket/Core/Python/ConverterScriptObject.h
+)
+
+set(Pycore_SRC_FILES
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementChildrenProxy.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventListenerInstancer.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventListener.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/Utilities.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextInstancer.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/Interfaces.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/precompiled.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementStyleProxy.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextProxy.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementDocumentWrapper.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/Converters.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextInterface.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/Module.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventInstancer.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventWrapper.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementAttributeProxy.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ContextDocumentProxy.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/ElementInterface.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/Python/EventInterface.cpp
+)
+
+set(Pycontrols_HDR_FILES
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/DataFormatterWrapper.h
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/DataSourceWrapper.h
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/ElementInterface.h
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/Module.h
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/SelectOptionProxy.h
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/precompiled.h
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/DataGridRowProxy.h
+)
+
+set(Pycontrols_PUB_HDR_FILES
+)
+
+set(Pycontrols_SRC_FILES
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/precompiled.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/DataSourceWrapper.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/Module.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/SelectOptionProxy.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/DataFormatterWrapper.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/ElementInterface.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Controls/Python/DataGridRowProxy.cpp
+)
+

+ 23 - 0
Build/cmake/gen_filelists.sh

@@ -8,22 +8,45 @@ pubhdr='set(lib_PUB_HDR_FILES'
 srcdir='${PROJECT_SOURCE_DIR}'
 
 printfiles() {
+    # Print headers
     echo ${hdr/lib/$1} >>$file
     find  Source/$1/ -maxdepth 1 -iname "*.h" -exec echo '    '$srcdir/{} \; >>$file
     echo -e ')\n' >>$file
+    # Print public headers
     echo ${pubhdr/lib/$1} >>$file
     find  Include/Rocket/$1/ -maxdepth 1 -iname "*.h" -exec echo '    '$srcdir/{} \; >>$file
+    # Print main public header
     echo '    '$srcdir/Include/Rocket/$1.h >>$file
     echo -e ')\n' >>$file
+    # Print source files
     echo ${src/lib/$1} >>$file
     find  Source/$1/ -maxdepth 1 -iname "*.cpp" -exec echo '    '$srcdir/{} \; >>$file
     echo -e ')\n' >>$file
 }
 
+printpyfiles() {
+    # Print headers
+    echo ${hdr/lib/Py${1,}} >>$file
+    find  Source/$1/Python -iname "*.h" -exec echo '    '$srcdir/{} \; >>$file
+    echo -e ')\n' >>$file
+    # Print public headers
+    echo ${pubhdr/lib/Py${1,}} >>$file
+    find  Include/Rocket/$1/Python -iname "*.h" -exec echo '    '$srcdir/{} \; >>$file 2>/dev/null
+    echo -e ')\n' >>$file
+    # Print source files
+    echo ${src/lib/Py${1,}} >>$file
+    find  Source/$1/Python -iname "*.cpp" -exec echo '    '$srcdir/{} \; >>$file
+    echo -e ')\n' >>$file
+}
+
 pushd $basedir
 echo -e "# This file was auto-generated with gen_filelists.sh\n" >$file
 for lib in "Core" "Controls" "Debugger"; do
     printfiles $lib
 done
+
+for lib in "Core" "Controls"; do
+    printpyfiles $lib
+done
 popd