1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
if(__PYTHON_QT_BINDING_SIP_HELPER_INCLUDED)
return()
endif()
set(__PYTHON_QT_BINDING_SIP_HELPER_INCLUDED TRUE)
set(__PYTHON_QT_BINDING_SIP_HELPER_DIR ${CMAKE_CURRENT_LIST_DIR})
if(NOT PYBUILD_PYTHON_VERSION)
set(PYBUILD_PYTHON_VERSION "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}")
endif()
set(Python_ADDITIONAL_VERSIONS ${PYBUILD_PYTHON_VERSION})
find_package(PythonInterp ${PYBUILD_PYTHON_VERSION} EXACT REQUIRED)
assert(PYTHON_EXECUTABLE)
find_package(PythonLibs ${PYBUILD_PYTHON_VERSION} EXACT REQUIRED)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c "import sipconfig; print(sipconfig.Configuration().sip_bin)"
OUTPUT_VARIABLE PYTHON_SIP_EXECUTABLE
ERROR_QUIET)
if(PYTHON_SIP_EXECUTABLE)
string(STRIP ${PYTHON_SIP_EXECUTABLE} SIP_EXECUTABLE)
else()
find_program(SIP_EXECUTABLE sip)
endif()
if(SIP_EXECUTABLE)
message(STATUS "SIP binding generator available at: ${SIP_EXECUTABLE}")
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)
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)
# 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)
endif()
if(NOT sip_LIBRARY_DIR)
set(sip_LIBRARY_DIR ${PROJECT_SOURCE_DIR}/lib)
endif()
if(NOT sip_BINARY_DIR)
set(sip_BINARY_DIR ${PROJECT_BINARY_DIR})
endif()
set(SIP_BUILD_DIR ${sip_BINARY_DIR}/sip/${PROJECT_NAME})
set(INCLUDE_DIRS ${${PROJECT_NAME}_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
set(LIBRARY_DIRS ${${PROJECT_NAME}_LIBRARY_DIRS})
set(LDFLAGS_OTHER ${${PROJECT_NAME}_LDFLAGS_OTHER})
set(EXTRA_DEFINES "")
if(DEFINED BUILD_SHARED_LIBS AND BUILD_SHARED_LIBS)
set(EXTRA_DEFINES "ROS_BUILD_SHARED_LIBS")
endif()
# SIP configure doesn't handle build configuration keywords
catkin_filter_libraries_for_build_configuration(LIBRARIES ${${PROJECT_NAME}_LIBRARIES})
# SIP configure doesn't handle CMake targets
catkin_replace_imported_library_targets(LIBRARIES ${LIBRARIES})
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}\" \"${EXTRA_DEFINES}\"
DEPENDS ${sip_SIP_CONFIGURE} ${SIP_FILE} ${sip_DEPENDS}
WORKING_DIRECTORY ${sip_SOURCE_DIR}
COMMENT "Running SIP generator for ${PROJECT_NAME} Python bindings..."
)
if(NOT EXISTS "${sip_LIBRARY_DIR}")
file(MAKE_DIRECTORY ${sip_LIBRARY_DIR})
endif()
if(WIN32)
set(MAKE_EXECUTABLE NMake.exe)
else()
set(MAKE_EXECUTABLE "\$(MAKE)")
endif()
add_custom_command(
OUTPUT ${sip_LIBRARY_DIR}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
COMMAND ${MAKE_EXECUTABLE}
DEPENDS ${SIP_BUILD_DIR}/Makefile
WORKING_DIRECTORY ${SIP_BUILD_DIR}
COMMENT "Compiling generated code for ${PROJECT_NAME} Python bindings..."
)
add_custom_target(lib${PROJECT_NAME} ALL
DEPENDS ${sip_LIBRARY_DIR}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
COMMENT "Meta target for ${PROJECT_NAME} Python bindings..."
)
add_dependencies(lib${PROJECT_NAME} ${sip_DEPENDENCIES})
endfunction()
|