1# 2# a cmake implementation of the Wrap Python SIP command 3# it creates bridge code for mixing vtkWrapPython code with SIP code 4# 5 6 7# VTK_WRAP_PYTHON_SIP takes a list of vtk source files to create sip bindings for 8# it creates .sip files from a template and then creates .cxx files from those 9# the .cxx files are returned from this macro 10FUNCTION(VTK_WRAP_PYTHON_SIP KIT SRC_LIST_NAME SOURCES) 11 IF(NOT SIP_EXECUTABLE) 12 MESSAGE(SEND_ERROR "SIP_EXECUTABLE not specified when calling VTK_WRAP_PYTHON_SIP") 13 ENDIF() 14 15 # the name of the module 16 17 SET(SIP_MOD vtk${KIT}PythonSIP) 18 SET(SIP_OUT_SRCS) 19 SET(SIP_IN_SRCS) 20 SET(VTK_WRAPPER_INIT_DATA "%Module vtk.${SIP_MOD} 0\n\n") 21 22 # For each class 23 FOREACH(FILE ${SOURCES}) 24 # should we wrap the file? 25 GET_SOURCE_FILE_PROPERTY(TMP_WRAP_EXCLUDE ${FILE} WRAP_EXCLUDE) 26 GET_SOURCE_FILE_PROPERTY(TMP_WRAP_SPECIAL ${FILE} WRAP_SPECIAL) 27 28 # if we should wrap it 29 IF (NOT TMP_WRAP_SPECIAL AND NOT TMP_WRAP_EXCLUDE) 30 31 # what is the filename without the extension 32 GET_FILENAME_COMPONENT(TMP_FILENAME ${FILE} NAME_WE) 33 34 # the input file might be full path so handle that 35 GET_FILENAME_COMPONENT(TMP_FILEPATH ${FILE} PATH) 36 37 # compute the input filename 38 IF (TMP_FILEPATH) 39 SET(TMP_INPUT ${TMP_FILEPATH}/${TMP_FILENAME}.h) 40 ELSE () 41 SET(TMP_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/${TMP_FILENAME}.h) 42 ENDIF () 43 44 # new source file is namePython.cxx, add to resulting list 45 SET(sip_output_src sip${SIP_MOD}${TMP_FILENAME}.cpp) 46 SET(SIP_OUT_SRCS ${SIP_OUT_SRCS} ${sip_output_src}) 47 48 SET(VTK_CLASS ${TMP_FILENAME}) 49 SET(sip_input_src ${CMAKE_CURRENT_BINARY_DIR}/${TMP_FILENAME}Python.sip) 50 SET(SIP_IN_SRCS ${SIP_IN_SRCS} ${sip_input_src}) 51 CONFIGURE_FILE(${VTK_CMAKE_DIR}/vtkWrapPython.sip.in ${sip_input_src} @ONLY) 52 53 SET(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA}%Include ${TMP_FILENAME}Python.sip\n") 54 55 ENDIF () 56 57 ENDFOREACH() 58 59 # finish the data file for the init file 60 CONFIGURE_FILE( 61 ${VTK_CMAKE_DIR}/vtkWrapperInit.data.in 62 ${CMAKE_CURRENT_BINARY_DIR}/${SIP_MOD}.sip 63 @ONLY 64 ) 65 SET(SIP_IN_SRCS ${SIP_IN_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/${SIP_MOD}.sip) 66 SET(SIP_OUT_SRCS ${SIP_OUT_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/sip${SIP_MOD}cmodule.cpp) 67 68 ADD_CUSTOM_COMMAND( 69 OUTPUT ${SIP_OUT_SRCS} 70 DEPENDS ${SIP_EXECUTABLE} ${SIP_IN_SRCS} 71 COMMAND ${SIP_EXECUTABLE} 72 ARGS -c ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${SIP_MOD}.sip 73 COMMENT "Python SIP Wrapping - generating for vtk${KIT}" 74 ) 75 76 SET(${SRC_LIST_NAME} ${${SRC_LIST_NAME}} ${SIP_OUT_SRCS} PARENT_SCOPE) 77 78ENDFUNCTION() 79 80# create sip module library 81# one is created for use within a VTK build, and another is created for use in an install tree 82# all files passed in WRAP_SRCS are wrapped with sip/vtk bridge code 83function(VTK_CREATE_SIP_MODULE KIT WRAP_SRCS) 84 IF(NOT SIP_EXECUTABLE) 85 MESSAGE(SEND_ERROR "SIP_EXECUTABLE not set.") 86 ELSE() 87 INCLUDE_DIRECTORIES(${SIP_INCLUDE_DIR}) 88 VTK_WRAP_PYTHON_SIP(${KIT} KitPythonSIP_SRCS "${WRAP_SRCS}") 89 VTK_ADD_LIBRARY(vtk${KIT}PythonSIP MODULE ${KitPythonSIP_SRCS}) 90 SET_TARGET_PROPERTIES(vtk${KIT}PythonSIP PROPERTIES PREFIX "" SKIP_BUILD_RPATH 1) 91 IF(WIN32 AND NOT CYGWIN) 92 SET_TARGET_PROPERTIES(vtk${KIT}PythonSIP PROPERTIES SUFFIX ".pyd") 93 ENDIF() 94 TARGET_LINK_LIBRARIES(vtk${KIT}PythonSIP vtk${KIT}PythonD) 95 get_target_property(lib_loc vtk${KIT}PythonSIP LOCATION) 96 ADD_CUSTOM_COMMAND(TARGET vtk${KIT}PythonSIP POST_BUILD 97 COMMAND ${CMAKE_COMMAND} -E copy "${lib_loc}" "${VTK_BUILD_PYTHON_MODULE_DIR}/vtk/" 98 ) 99 100 IF(NOT VTK_INSTALL_NO_LIBRARIES) 101 INSTALL(TARGETS vtk${KIT}PythonSIP 102 EXPORT ${VTK_INSTALL_EXPORT_NAME} 103 RUNTIME DESTINATION ${VTK_INSTALL_RUNTIME_DIR} COMPONENT RuntimeLibraries 104 LIBRARY DESTINATION ${VTK_INSTALL_LIBRARY_DIR} COMPONENT RuntimeLibraries 105 ARCHIVE DESTINATION ${VTK_INSTALL_ARCHIVE_DIR} COMPONENT Development) 106 ENDIF() 107 ENDIF() 108endfunction() 109