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