diff --git a/CMakeLists.txt b/CMakeLists.txt index ff4fcc4..9ef1190 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,5 +6,8 @@ catkin_package(CFG_EXTRAS python_qt_binding-extras.cmake) catkin_python_setup() -install(DIRECTORY cmake - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) +install(FILES + cmake/shiboken_helper.cmake + cmake/sip_configure.py + cmake/sip_helper.cmake + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/cmake) diff --git a/cmake/python_qt_binding-extras.cmake.em b/cmake/python_qt_binding-extras.cmake.em new file mode 100644 index 0000000..a11da30 --- /dev/null +++ b/cmake/python_qt_binding-extras.cmake.em @@ -0,0 +1,7 @@ +@[if DEVELSPACE]@ +# location of cmake files in develspace +set(python_qt_binding_EXTRAS_DIR "@(CMAKE_CURRENT_SOURCE_DIR)/cmake") +@[else]@ +# location of cmake files in installspace +set(python_qt_binding_EXTRAS_DIR "${python_qt_binding_DIR}") +@[end if]@ diff --git a/cmake/python_qt_binding-extras.cmake.in b/cmake/python_qt_binding-extras.cmake.in deleted file mode 100644 index 20dcea4..0000000 --- a/cmake/python_qt_binding-extras.cmake.in +++ /dev/null @@ -1,5 +0,0 @@ -if(@DEVELSPACE@) - set(python_qt_binding_EXTRAS_DIR @CMAKE_CURRENT_SOURCE_DIR@/cmake) -else() - set(python_qt_binding_EXTRAS_DIR @CMAKE_INSTALL_PREFIX@/@CATKIN_PACKAGE_SHARE_DESTINATION@/cmake) -endif() diff --git a/cmake/shiboken_check_compiles.cmake b/cmake/shiboken_check_compiles.cmake deleted file mode 100644 index 6812613..0000000 --- a/cmake/shiboken_check_compiles.cmake +++ /dev/null @@ -1,49 +0,0 @@ -# - Check if given source can be processed with shiboken -# shiboken_check_compiles( ) -# - variable to store whether the source code compiled -# - source code to try to compile -# - source code of global.h, the inldue for the file containing source_header is appended internally -# - typesystem xml - -include(${python_qt_binding_EXTRAS_DIR}/shiboken_helper.cmake) - -macro(shiboken_check_compiles VAR SOURCE_HEADER GLOBAL_HEADER TYPESYSTEM_XML) - set(_PATH "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/shiboken_check_compiles") - set(SOURCE_HEADER "${SOURCE_HEADER}\n") - set(GLOBAL_HEADER "${GLOBAL_HEADER}\n#include \n") - - file(WRITE "${_PATH}/source.h" "${SOURCE_HEADER}") - file(WRITE "${_PATH}/global.h" "${GLOBAL_HEADER} - #include \"source.h\"") - file(WRITE "${_PATH}/typesystem.xml" "${TYPESYSTEM_XML}") - - message(STATUS "Performing Test ${VAR}") - _shiboken_generator_command(COMMAND global.h typesystem.xml "${_PATH}" "${_PATH}/build") - execute_process( - COMMAND ${COMMAND} - WORKING_DIRECTORY ${_PATH} - RESULT_VARIABLE ${VAR} - OUTPUT_VARIABLE _OUTPUT_VARIABLE - ERROR_VARIABLE _ERROR_VARIABLE - ) - - if(${${VAR}} STREQUAL "0") - message(STATUS "Performing Test ${VAR} - Success") - set(${VAR} 1 CACHE INTERNAL "Test ${VAR}") - set(_LOGFILE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log) - set(_STATUS "succeeded") - else() - message(STATUS "Performing Test ${VAR} - Failed") - set(${VAR} "" CACHE INTERNAL "Test ${VAR}") - set(_LOGFILE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log) - set(_STATUS "failed") - endif() - file(APPEND ${_LOGFILE} - "Performing Shiboken COMPILE Test ${VAR} ${_STATUS} with the following output:\n" - "${_OUTPUT_VARIABLE}\n" - "Error output was:\n${_ERROR_VARIABLE}\n" - "Source file was:\n${SOURCE_HEADER}\n" - "Global header was:\n${GLOBAL_HEADER}\n" - "Typesystem was:\n${TYPESYSTEM_XML}\n" - ) -endmacro() diff --git a/cmake/shiboken_check_qgenericreturnargument.cmake b/cmake/shiboken_check_qgenericreturnargument.cmake deleted file mode 100644 index a76f0b9..0000000 --- a/cmake/shiboken_check_qgenericreturnargument.cmake +++ /dev/null @@ -1,25 +0,0 @@ -# - Check if shiboken supports a QGenericReturnArgument with empty constructor -# shiboken_check_qgenericreturnargument() -# - variable to store whether shiboken support QGenericReturnArgument - -find_package(Qt4 REQUIRED COMPONENTS QtCore) -include(${QT_USE_FILE}) - -include(${python_qt_binding_EXTRAS_DIR}/shiboken_check_compiles.cmake) - -macro(shiboken_check_qgenericreturnargument SHIBOKEN_QGENERICRETURNARGUMENT_SUPPORT) - set(SOURCE_HEADER "#include - void func(QGenericReturnArgument arg); - ") - set(GLOBAL_HEADER "#include \"pyside_global.h\" - #include - ") - set(TYPESYSTEM_XML " - - - - - ") - - shiboken_check_compiles(${SHIBOKEN_QGENERICRETURNARGUMENT_SUPPORT} "${SOURCE_HEADER}" "${GLOBAL_HEADER}" "${TYPESYSTEM_XML}") -endmacro() diff --git a/cmake/shiboken_helper.cmake b/cmake/shiboken_helper.cmake index dc72571..b4b9c60 100644 --- a/cmake/shiboken_helper.cmake +++ b/cmake/shiboken_helper.cmake @@ -1,3 +1,8 @@ +if(__PYTHON_QT_BINDING_SHIBOKEN_HELPER_INCLUDED) + return() +endif() +set(__PYTHON_QT_BINDING_SHIBOKEN_HELPER_INCLUDED TRUE) + find_package(Shiboken) find_package(PySide) find_package(PythonLibs) @@ -30,6 +35,27 @@ macro(_shiboken_generator_command VAR GLOBAL TYPESYSTEM INCLUDE_PATH BUILD_DIR) endmacro() +# +# Run the Shiboken generator. +# +# :param PROJECT_NAME: The name of the shiboken project is only use for +# the custom command comment +# :type PROJECT_NAME: string +# :param GLOBAL: the SIP file +# :type GLOBAL: string +# :param TYPESYSTEM: the typesystem file +# :type TYPESYSTEM: string +# :param WORKING_DIR: the working directory +# :type WORKING_DIR: string +# :param GENERATED_SRCS: the generated source files +# :type GENERATED_SRCS: list of strings +# :param HDRS: the processed header files +# :type HDRS: list of strings +# :param INCLUDE_PATH: the include path +# :type INCLUDE_PATH: list of strings +# :param BUILD_DIR: the build directory +# :type BUILD_DIR: string +# function(shiboken_generator PROJECT_NAME GLOBAL TYPESYSTEM WORKING_DIR GENERATED_SRCS HDRS INCLUDE_PATH BUILD_DIR) _shiboken_generator_command(COMMAND "${GLOBAL}" "${TYPESYSTEM}" "${INCLUDE_PATH}" "${BUILD_DIR}") add_custom_command( @@ -42,6 +68,14 @@ function(shiboken_generator PROJECT_NAME GLOBAL TYPESYSTEM WORKING_DIR GENERATED endfunction() +# +# Add the Shiboken/PySide specific include directories. +# +# :param PROJECT_NAME: The namespace of the binding +# :type PROJECT_NAME: string +# :param QT_COMPONENTS: the Qt components +# :type QT_COMPONENTS: list of strings +# function(shiboken_include_directories PROJECT_NAME QT_COMPONENTS) set(shiboken_INCLUDE_DIRECTORIES ${PYTHON_INCLUDE_DIR} @@ -59,13 +93,21 @@ function(shiboken_include_directories PROJECT_NAME QT_COMPONENTS) endfunction() +# +# Add the Shiboken/PySide specific link libraries. +# +# :param PROJECT_NAME: The target name of the binding library +# :type PROJECT_NAME: string +# :param QT_COMPONENTS: the Qt components +# :type QT_COMPONENTS: list of strings +# function(shiboken_target_link_libraries PROJECT_NAME QT_COMPONENTS) set(shiboken_LINK_LIBRARIES ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${PYSIDE_LIBRARY} ) - + foreach(component ${QT_COMPONENTS}) string(TOUPPER ${component} component) set(shiboken_LINK_LIBRARIES ${shiboken_LINK_LIBRARIES} ${QT_${component}_LIBRARY}) diff --git a/cmake/sip_helper.cmake b/cmake/sip_helper.cmake index 0818bf5..7e797bd 100644 --- a/cmake/sip_helper.cmake +++ b/cmake/sip_helper.cmake @@ -3,7 +3,19 @@ if(__PYTHON_QT_BINDING_SIP_HELPER_INCLUDED) endif() set(__PYTHON_QT_BINDING_SIP_HELPER_INCLUDED TRUE) +set(__PYTHON_QT_BINDING_SIP_HELPER_DIR ${CMAKE_CURRENT_LIST_DIR}) + +find_package(PythonInterp REQUIRED) +assert(PYTHON_EXECUTABLE) + find_program(SIP_EXECUTABLE sip) +if(NOT SIP_EXECUTABLE_NOTFOUND) + message(STATUS "SIP binding generator available.") + set(sip_helper_FOUND TRUE) +else() + message(WARNING "SIP binding generator NOT available.") + set(sip_helper_NOTFOUND TRUE) +endif() # Provide cmake_parse_arguments() for versions of cmake before 2.8.3. if(${CMAKE_VERSION} VERSION_LESS 2.8.3) @@ -139,28 +151,39 @@ if(${CMAKE_VERSION} VERSION_LESS 2.8.3) endfunction(CMAKE_PARSE_ARGUMENTS _options _singleArgs _multiArgs) endif() -if(NOT SIP_EXECUTABLE_NOTFOUND) - message(STATUS "SIP binding generator available.") - set(sip_helper_FOUND TRUE) -else() - message(WARNING "SIP binding generator NOT available.") - set(sip_helper_NOTFOUND TRUE) -endif() - +# +# Run the SIP generator and compile the generated code into a library. +# +# .. note:: The target lib${PROJECT_NAME} is created. +# +# :param PROJECT_NAME: The name of the sip project +# :type PROJECT_NAME: string +# :param SIP_FILE: the SIP file to be processed +# :type SIP_FILE: string +# +# The following options can be used to override the default behavior: +# SIP_CONFIGURE: the used configure script for SIP +# (default: sip_configure.py in the same folder as this file) +# SOURCE_DIR: the source dir (default: ${PROJECT_SOURCE_DIR}/src) +# LIBRARY_DIR: the library dir (default: ${PROJECT_SOURCE_DIR}/src) +# BINARY_DIR: the binary dir (default: ${PROJECT_BINARY_DIR}) +# +# The following keywords arguments can be used to specify: +# DEPENDS: depends for the custom command +# (should list all sip and header files) +# DEPENDENCIES: target dependencies +# (should list the library for which SIP generates the bindings) +# function(build_sip_binding PROJECT_NAME SIP_FILE) - set(oneValueArgs SIP_CONFIGURE SOURCE_DIR LIBRARY_DIR BINARY_DIR) - set(multiValueArgs DEPENDS DEPENDENCIES) - cmake_parse_arguments(sip "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + cmake_parse_arguments(sip "" "SIP_CONFIGURE;SOURCE_DIR;LIBRARY_DIR;BINARY_DIR" "DEPENDS;DEPENDENCIES" ${ARGN}) if(sip_UNPARSED_ARGUMENTS) message(WARNING "build_sip_binding(${PROJECT_NAME}) called with unused arguments: ${sip_UNPARSED_ARGUMENTS}") endif() # set default values for optional arguments if(NOT sip_SIP_CONFIGURE) - # without catkin and CFG_EXTRAS the variable can not be set inside that script - message(FATAL_ERROR "build_sip_binding(${PROJECT_NAME}) missing argument: SIP_CONFIGURE") - # in the future set default value to sip_configure.py in this directory - #set(sip_SIP_CONFIGURE ${python_qt_binding_SOURCE_DIR}/cmake/sip_configure.py) + # default to sip_configure.py in this directory + set(sip_SIP_CONFIGURE ${__PYTHON_QT_BINDING_SIP_HELPER_DIR}/sip_configure.py) endif() if(NOT sip_SOURCE_DIR) set(sip_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src) @@ -179,7 +202,6 @@ function(build_sip_binding PROJECT_NAME SIP_FILE) set(LIBRARY_DIRS ${${PROJECT_NAME}_LIBRARY_DIRS}) set(LDFLAGS_OTHER ${${PROJECT_NAME}_LDFLAGS_OTHER}) - assert(PYTHON_EXECUTABLE) add_custom_command( OUTPUT ${SIP_BUILD_DIR}/Makefile COMMAND ${PYTHON_EXECUTABLE} ${sip_SIP_CONFIGURE} ${SIP_BUILD_DIR} ${SIP_FILE} ${sip_LIBRARY_DIR} \"${INCLUDE_DIRS}\" \"${LIBRARIES}\" \"${LIBRARY_DIRS}\" \"${LDFLAGS_OTHER}\" diff --git a/mainpage.dox b/mainpage.dox deleted file mode 100644 index 77cf7d0..0000000 --- a/mainpage.dox +++ /dev/null @@ -1,14 +0,0 @@ -/** -\mainpage -\htmlinclude manifest.html - -\b python_qt_binding is mostly a meta-package, providing python bindings for Qt. -There are two providers: pyqt and pyside. PyQt is released under the -GPL, which can be too restrictive. Therefore this package also -provides Pyside when available. Pyside uses the LGPL license, but is -not available via normal debian package channels on Ubuntu Lucid. - -Both the bindings and tools to build bindings are included from each -available provider. For PyQt, this is called "SIP". For Pyside, it -is called "Shiboken" (and other tools). -*/