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