1# 2# a cmake implementation of the Wrap Tcl command 3# it takes an optional VERSION parameter that will be output 4# to the .data file as VERSION ${VERSION}. 5# vtkWrapTclInit will then recognize the VERSION keyword, extract the version 6# and make sure the corresponding Tcl package is 'provided' with that version. 7# 8 9MACRO(VTK_WRAP_TCL2 TARGET) 10 # convert to the WRAP3 signature 11 SET(MODE SOURCE_LIST) 12 SET(SOURCES) 13 FOREACH(ARG ${ARGN}) 14 SET (MODE_CHANGED 0) 15 IF ("${ARG}" MATCHES SOURCES) 16 SET (MODE SOURCE_LIST) 17 SET(MODE_CHANGED 1) 18 ENDIF () 19 IF ("${ARG}" MATCHES COMMANDS) 20 SET (MODE COMMANDS) 21 SET(MODE_CHANGED 1) 22 ENDIF () 23 IF (NOT MODE_CHANGED) 24 IF (MODE MATCHES SOURCES) 25 SET(SOURCES ${SOURCES} ${ARG}) 26 ENDIF () 27 IF (MODE MATCHES COMMANDS) 28 SET(COMMANDS ${COMMANDS} ${ARG}) 29 ENDIF () 30 IF (MODE MATCHES SOURCE_LIST) 31 SET(SOURCE_LIST_NAME "${ARG}") 32 SET (MODE SOURCES) 33 ENDIF () 34 ENDIF () 35 ENDFOREACH() 36 37 VTK_WRAP_TCL3(${TARGET} ${SOURCE_LIST_NAME} "${SOURCES}" "${COMMANDS}") 38ENDMACRO() 39 40MACRO(VTK_WRAP_TCL3 TARGET SRC_LIST_NAME SOURCES COMMANDS) 41 if(NOT VTK_WRAP_TCL_INIT_EXE) 42 if(TARGET vtkWrapTclInit) 43 set(VTK_WRAP_TCL_INIT_EXE vtkWrapTclInit) 44 else() 45 message(SEND_ERROR 46 "VTK_WRAP_TCL_INIT_EXE not specified when calling VTK_WRAP_TCL3") 47 endif() 48 endif() 49 if(NOT VTK_WRAP_TCL_EXE) 50 if(TARGET vtkWrapTcl) 51 set(VTK_WRAP_TCL_EXE vtkWrapTcl) 52 else() 53 message(SEND_ERROR 54 "VTK_WRAP_TCL_EXE not specified when calling VTK_WRAP_TCL3") 55 endif() 56 endif() 57 58 IF(CMAKE_GENERATOR MATCHES "NMake Makefiles") 59 SET(verbatim "") 60 SET(quote "\"") 61 ELSE() 62 SET(verbatim "VERBATIM") 63 SET(quote "") 64 ENDIF() 65 66 # Initialize the custom target counter. 67 IF(VTK_WRAP_TCL_NEED_CUSTOM_TARGETS) 68 SET(VTK_WRAP_TCL_CUSTOM_COUNT "") 69 SET(VTK_WRAP_TCL_CUSTOM_NAME ${TARGET}) 70 SET(VTK_WRAP_TCL_CUSTOM_LIST) 71 ENDIF() 72 73 # start writing the input file for the init file 74 SET(VTK_WRAPPER_INIT_DATA "${TARGET}") 75 IF (${ARGC} GREATER 4) 76 SET(VTK_WRAPPER_INIT_DATA 77 "${VTK_WRAPPER_INIT_DATA}\nVERSION ${ARGV4}") 78 ENDIF () 79 80 # all the include directories 81 if(VTK_WRAP_INCLUDE_DIRS) 82 set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS}) 83 else() 84 set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS}) 85 endif() 86 87 # collect the common wrapper-tool arguments 88 set(_common_args) 89 get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS) 90 foreach(TMP_DEF ${_def_list}) 91 set(_common_args "${_common_args}-D${TMP_DEF}\n") 92 endforeach() 93 foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS}) 94 set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n") 95 endforeach() 96 if(VTK_WRAP_HINTS) 97 set(_common_args "${_common_args}--hints \"${VTK_WRAP_HINTS}\"\n") 98 endif() 99 if(KIT_HIERARCHY_FILE) 100 set(_common_args "${_common_args}--types \"${KIT_HIERARCHY_FILE}\"\n") 101 endif() 102 103 # write wrapper-tool arguments to a file 104 string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT) 105 set(_args_file ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.args) 106 configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in 107 ${_args_file} @ONLY) 108 109 # for each class 110 FOREACH(FILE ${SOURCES}) 111 # should we wrap the file? 112 GET_SOURCE_FILE_PROPERTY(TMP_WRAP_EXCLUDE ${FILE} WRAP_EXCLUDE) 113 114 # if we should wrap it 115 IF (NOT TMP_WRAP_EXCLUDE) 116 117 # what is the filename without the extension 118 GET_FILENAME_COMPONENT(TMP_FILENAME ${FILE} NAME_WE) 119 120 # the input file might be full path so handle that 121 GET_FILENAME_COMPONENT(TMP_FILEPATH ${FILE} PATH) 122 123 # compute the input filename 124 IF (TMP_FILEPATH) 125 SET(TMP_INPUT ${TMP_FILEPATH}/${TMP_FILENAME}.h) 126 ELSE () 127 SET(TMP_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/${TMP_FILENAME}.h) 128 ENDIF () 129 130 # add the info to the init file 131 SET(VTK_WRAPPER_INIT_DATA 132 "${VTK_WRAPPER_INIT_DATA}\n${TMP_FILENAME}") 133 134 # new source file is nameTcl.cxx, add to resulting list 135 SET(${SRC_LIST_NAME} ${${SRC_LIST_NAME}} 136 ${TMP_FILENAME}Tcl.cxx) 137 138 # add custom command to output 139 ADD_CUSTOM_COMMAND( 140 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TMP_FILENAME}Tcl.cxx 141 DEPENDS ${VTK_WRAP_TCL_EXE} ${VTK_WRAP_HINTS} ${TMP_INPUT} ${_args_file} 142 ${KIT_HIERARCHY_FILE} 143 COMMAND ${VTK_WRAP_TCL_EXE} 144 ARGS 145 ${TMP_HINTS} 146 "${quote}@${_args_file}${quote}" 147 "-o" "${quote}${CMAKE_CURRENT_BINARY_DIR}/${TMP_FILENAME}Tcl.cxx${quote}" 148 "${quote}${TMP_INPUT}${quote}" 149 COMMENT "Tcl Wrapping - generating ${TMP_FILENAME}Tcl.cxx" 150 ${verbatim} 151 ) 152 153 # Add this output to a custom target if needed. 154 IF(VTK_WRAP_TCL_NEED_CUSTOM_TARGETS) 155 SET(VTK_WRAP_TCL_CUSTOM_LIST ${VTK_WRAP_TCL_CUSTOM_LIST} 156 ${CMAKE_CURRENT_BINARY_DIR}/${TMP_FILENAME}Tcl.cxx) 157 SET(VTK_WRAP_TCL_CUSTOM_COUNT ${VTK_WRAP_TCL_CUSTOM_COUNT}x) 158 IF(VTK_WRAP_TCL_CUSTOM_COUNT MATCHES "^${VTK_WRAP_TCL_CUSTOM_LIMIT}$") 159 SET(VTK_WRAP_TCL_CUSTOM_NAME ${VTK_WRAP_TCL_CUSTOM_NAME}Hack) 160 ADD_CUSTOM_TARGET(${VTK_WRAP_TCL_CUSTOM_NAME} DEPENDS ${VTK_WRAP_TCL_CUSTOM_LIST}) 161 SET(KIT_TCL_DEPS ${VTK_WRAP_TCL_CUSTOM_NAME}) 162 SET(VTK_WRAP_TCL_CUSTOM_LIST) 163 SET(VTK_WRAP_TCL_CUSTOM_COUNT) 164 ENDIF() 165 ENDIF() 166 ENDIF () 167 ENDFOREACH() 168 169 # finish the data file for the init file 170 FOREACH(CMD ${COMMANDS}) 171 SET(VTK_WRAPPER_INIT_DATA 172 "${VTK_WRAPPER_INIT_DATA}\nCOMMAND ${CMD}") 173 ENDFOREACH() 174 175 SET(dir ${CMAKE_CURRENT_SOURCE_DIR}) 176 CONFIGURE_FILE( 177 ${VTK_CMAKE_DIR}/vtkWrapperInit.data.in 178 ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.data 179 @ONLY 180 ) 181 182 ADD_CUSTOM_COMMAND( 183 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.cxx 184 DEPENDS ${VTK_WRAP_TCL_INIT_EXE} 185 ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.data 186 COMMAND ${VTK_WRAP_TCL_INIT_EXE} 187 ARGS 188 "${quote}${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.data${quote}" 189 "${quote}${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.cxx${quote}" 190 COMMENT "Tcl Wrapping - generating ${TARGET}Init.cxx" 191 ${verbatim} 192 ) 193 194 # Create the Init File 195 SET(${SRC_LIST_NAME} ${${SRC_LIST_NAME}} ${TARGET}Init.cxx) 196ENDMACRO() 197 198 199IF (VTK_WRAP_TCL_FIND_LIBS) 200 GET_FILENAME_COMPONENT(_CURRENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) 201 INCLUDE("${_CURRENT_DIR}/FindTCL.cmake") 202 203 IF(VTK_WRAP_TCL AND NOT TCL_FOUND) 204 MESSAGE(FATAL_ERROR "Tcl was not found. Install the Tcl development package (see http://tcl.tk or ActiveState Tcl) and set the appropriate variables (TCL_INCLUDE_PATH, TCL_LIBRARY, TCL_TCLSH) or disable VTK_WRAP_TCL.") 205 ENDIF() 206 207 IF(VTK_USE_TK AND NOT TK_FOUND) 208 MESSAGE(FATAL_ERROR "Tk was not found. Install the Tk development package (see http://tcl.tk or ActiveState Tcl) and set the appropriate variables (TK_INCLUDE_PATH, TK_LIBRARY, TK_WISH) or disable VTK_USE_TK.") 209 ENDIF() 210 211 SET(VTK_TCL_LIBRARIES ${TCL_LIBRARY}) 212 IF(TCL_LIBRARY_DEBUG) 213 SET(VTK_TCL_LIBRARIES optimized ${TCL_LIBRARY} debug ${TCL_LIBRARY_DEBUG}) 214 ENDIF() 215 IF(UNIX) 216 # The tcl library needs the math library on unix. 217 SET(VTK_TCL_LIBRARIES ${VTK_TCL_LIBRARIES} m) 218 ENDIF() 219 IF(TK_FOUND) 220 SET(VTK_TK_LIBRARIES ${TK_LIBRARY} ${VTK_TCL_LIBRARIES}) 221 IF(TK_LIBRARY_DEBUG) 222 SET(VTK_TK_LIBRARIES optimized ${TK_LIBRARY} debug ${TK_LIBRARY_DEBUG} ${VTK_TCL_LIBRARIES}) 223 ENDIF() 224 ENDIF() 225 INCLUDE(${VTK_CMAKE_DIR}/vtkTclTkMacros.cmake) 226 # Hide useless settings provided by FindTCL. 227 FOREACH(entry 228 TK_WISH) 229 SET(${entry} "${${entry}}" CACHE INTERNAL "This value is not used by VTK.") 230 ENDFOREACH() 231 232 # Need Tk sources on windows 233 IF(WIN32) 234 FIND_PATH(TK_XLIB_PATH 235 X11/Xlib.h ${TK_INCLUDE_PATH} 236 ${TK_INCLUDE_PATH}/../xlib) 237 MARK_AS_ADVANCED(TK_XLIB_PATH) 238 ENDIF() 239 240ENDIF () 241 242 243# VS 6 does not like needing to run a huge number of custom commands 244# when building a single target. Generate some extra custom targets 245# that run the custom commands before the main target is built. This 246# is a hack to work-around the limitation. The test to enable it is 247# done here since it does not need to be done for every macro 248# invocation. 249IF(CMAKE_GENERATOR STREQUAL "Visual Studio 6") 250 SET(VTK_WRAP_TCL_NEED_CUSTOM_TARGETS 1) 251 SET(VTK_WRAP_TCL_CUSTOM_LIMIT x) 252 # Limit the number of custom commands in each target 253 # to 2^7. 254 FOREACH(t 1 2 3 4 5 6 7) 255 SET(VTK_WRAP_TCL_CUSTOM_LIMIT 256 ${VTK_WRAP_TCL_CUSTOM_LIMIT}${VTK_WRAP_TCL_CUSTOM_LIMIT}) 257 ENDFOREACH() 258ENDIF() 259