2 # `vtkModuleWrapClientServer` 4 This module includes logic necessary in
order to wrap VTK modules
using 5 ParaView
's ClientServer "language". This allows for classes in the module to be 6 used as proxies between ParaView client and server programs. 10 ## Wrapping a single module 12 This function generates the wrapped sources for a module. It places the list of 13 generated source files and classes in variables named in the second and third 14 arguments, respectively. 17 _vtk_module_wrap_client_server_sources(<module> <sources> <classes>) 22 cmake_policy(SET CMP0053 NEW) 25 cmake_policy(SET CMP0116 NEW) 28 function (_vtk_module_wrap_client_server_sources module sources classes) 29 _vtk_module_get_module_property("${module}" 30 PROPERTY "exclude_wrap" 31 VARIABLE _vtk_client_server_exclude_wrap) 32 if (_vtk_client_server_exclude_wrap) 35 _vtk_module_get_module_property("${module}" 36 PROPERTY "client_server_exclude" 37 VARIABLE _vtk_client_server_exclude) 38 if (_vtk_client_server_exclude) 42 set(_vtk_client_server_args_file "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_client_server_library_name}-client-server.$<CONFIGURATION>.args") 44 set(_vtk_client_server_genex_allowed 1) 45 if (CMAKE_VERSION VERSION_LESS "3.19") 46 get_property(_vtk_client_server_target_type 47 TARGET "${_vtk_client_server_target_name}" 49 if (_vtk_client_server_target_type STREQUAL "INTERFACE_LIBRARY") 50 set(_vtk_client_server_genex_allowed 0) 54 set(_vtk_client_server_genex_compile_definitions "") 55 set(_vtk_client_server_genex_include_directories "") 56 if (_vtk_client_server_genex_allowed) 57 set(_vtk_client_server_genex_compile_definitions 58 "$<TARGET_PROPERTY:${_vtk_client_server_target_name},COMPILE_DEFINITIONS>") 59 set(_vtk_client_server_genex_include_directories 60 "$<TARGET_PROPERTY:${_vtk_client_server_target_name},INCLUDE_DIRECTORIES>") 61 set(_vtk_client_server_genex_interface_compile_definitions 62 "$<TARGET_PROPERTY:${_vtk_client_server_target_name},INTERFACE_COMPILE_DEFINITIONS>") 63 set(_vtk_client_server_genex_interface_include_directories 64 "$<TARGET_PROPERTY:${_vtk_client_server_target_name},INTERFACE_INCLUDE_DIRECTORIES>") 65 set(_vtk_client_server_genex_compile_definitions_all 66 "$<IF:$<BOOL:${_vtk_client_server_genex_compile_definitions}>,${_vtk_client_server_genex_compile_definitions},${_vtk_client_server_genex_interface_compile_definitions}>") 67 set(_vtk_client_server_genex_include_directories_all 68 "$<IF:$<BOOL:${_vtk_client_server_genex_include_directories}>,${_vtk_client_server_genex_include_directories},${_vtk_client_server_genex_interface_include_directories}>") 71 if (NOT DEFINED ENV{CI}) 72 message(AUTHOR_WARNING 73 "ClientServer wrapping is not using target-local compile definitions " 74 "or include directories. This may affect generation of the Client " 75 "Server wrapper sources for the ${module} module. Use CMake 3.19+ to " 76 "guarantee intended behavior.") 79 file(GENERATE OUTPUT "compile_definitions_${_vtk_client_server_target_name}" CONTENT "${_vtk_client_server_genex_compile_definitions_all}") 80 file(GENERATE OUTPUT "include_directories_${_vtk_client_server_target_name}" CONTENT "${_vtk_client_server_genex_include_directories_all}") 82 OUTPUT "${_vtk_client_server_args_file}" 83 CONTENT "$<$<BOOL:${_vtk_client_server_genex_compile_definitions_all}>:\n-D\'$<JOIN:${_vtk_client_server_genex_compile_definitions_all},\'\n-D\'>\'>\n 84 $<$<BOOL:${_vtk_client_server_genex_include_directories_all}>:\n-I\'$<JOIN:${_vtk_client_server_genex_include_directories_all},\'\n-I\'>\'>\n") 86 _vtk_module_get_module_property("${module}" 88 VARIABLE _vtk_client_server_hierarchy_file) 90 get_property(_vtk_client_server_is_imported 91 TARGET "${_vtk_client_server_target_name}" 93 if (_vtk_client_server_is_imported OR CMAKE_GENERATOR MATCHES "Ninja") 94 set(_vtk_client_server_command_depend "${_vtk_client_server_hierarchy_file}") 96 if (TARGET "${_vtk_client_server_library_name}-hierarchy") 97 set(_vtk_client_server_command_depend "${_vtk_client_server_library_name}-hierarchy") 100 "The ${module} hierarchy file is attached to a non-imported target " 101 "and a hierarchy target " 102 "(${_vtk_client_server_library_name}-hierarchy) is missing.") 106 # create directory for wrapped source files 107 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_client_server_library_name}CS") 109 set(_vtk_client_server_sources) 111 _vtk_module_get_module_property("${module}" 113 VARIABLE _vtk_client_server_headers) 114 set(_vtk_client_server_classes) 115 foreach (_vtk_client_server_header IN LISTS _vtk_client_server_headers) 116 get_filename_component(_vtk_client_server_basename "${_vtk_client_server_header}" NAME_WE) 117 list(APPEND _vtk_client_server_classes 118 "${_vtk_client_server_basename}") 120 set(_vtk_client_server_source_output 121 "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_client_server_library_name}CS/${_vtk_client_server_basename}ClientServer.cxx") 122 set(_vtk_client_server_depfile_genex 123 "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_client_server_library_name}CS/${_vtk_client_server_basename}ClientServer.cxx.$<CONFIG>.d") 124 set(_vtk_client_server_depfile_nogenex 125 "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_client_server_library_name}CS/${_vtk_client_server_basename}ClientServer.cxx.d") 126 list(APPEND _vtk_client_server_sources 127 "${_vtk_client_server_source_output}") 129 _vtk_module_depfile_args( 130 MULTI_CONFIG_NEEDS_GENEX 131 TOOL_ARGS _vtk_client_server_depfile_flags 132 CUSTOM_COMMAND_ARGS _vtk_client_server_depfile_args 133 SOURCE "${_vtk_client_server_header}" 134 DEPFILE_PATH "${_vtk_client_server_depfile_genex}" 135 DEPFILE_NO_GENEX_PATH "${_vtk_client_server_depfile_nogenex}" 139 OUTPUT "${_vtk_client_server_source_output}" 140 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} 141 "$<TARGET_FILE:ParaView::WrapClientServer>" 142 ${_vtk_client_server_depfile_flags} 143 "@${_vtk_client_server_args_file}" 144 -o "${_vtk_client_server_source_output}" 145 "${_vtk_client_server_header}" 146 ${_vtk_client_server_warning_args} 147 --types "${_vtk_client_server_hierarchy_file}" 148 ${_vtk_client_server_depfile_args} 149 COMMENT "Generating client_server wrapper sources for ${_vtk_client_server_basename}" 151 "$<TARGET_FILE:ParaView::WrapClientServer>" 152 "${_vtk_client_server_header}" 153 "${_vtk_client_server_args_file}" 154 "${_vtk_client_server_command_depend}") 158 "${_vtk_client_server_sources}" 161 "${_vtk_client_server_classes}" 166 ## Generating a client server library 168 A client server library may consist of the wrappings of multiple VTK modules. 169 This is useful for kit-based builds where the modules part of the same kit 170 belong to the same client server library as well. 173 _vtk_module_wrap_client_server_library(<name> <module>...) 176 The first argument is the name of the client server library. The remaining 177 arguments are VTK modules to include in the library. 179 The remaining information it uses is assumed to be provided by the 180 `vtk_module_wrap_client_server` function. 182 function (_vtk_module_wrap_client_server_library name) 183 set(_vtk_client_server_library_sources) 184 set(_vtk_client_server_library_classes) 185 foreach (_vtk_client_server_module IN LISTS ARGN) 186 _vtk_module_get_module_property("${_vtk_client_server_module}" 187 PROPERTY "exclude_wrap" 188 VARIABLE _vtk_client_server_exclude_wrap) 189 if (_vtk_client_server_exclude_wrap) 192 _vtk_module_get_module_property("${_vtk_client_server_module}" 193 PROPERTY "client_server_exclude" 194 VARIABLE _vtk_client_server_exclude) 195 if (_vtk_client_server_exclude) 199 _vtk_module_wrap_client_server_sources("${_vtk_client_server_module}" _vtk_client_server_sources _vtk_client_server_classes) 200 list(APPEND _vtk_client_server_library_sources 201 ${_vtk_client_server_sources}) 202 list(APPEND _vtk_client_server_library_classes 203 ${_vtk_client_server_classes}) 206 if (NOT _vtk_client_server_library_sources) 210 set(_vtk_client_server_declarations) 211 set(_vtk_client_server_calls) 212 foreach (_vtk_client_server_class IN LISTS _vtk_client_server_library_classes) 213 string(APPEND _vtk_client_server_declarations 214 "extern void ${_vtk_client_server_class}_Init(vtkClientServerInterpreter*);\n") 215 string(APPEND _vtk_client_server_calls 216 " ${_vtk_client_server_class}_Init(csi);\n") 218 set(_vtk_client_server_init_content 219 "#include \"vtkABI.h\" 220 #include \"vtkClientServerInterpreter.h\" 222 ${_vtk_client_server_declarations} 223 extern \"C\" void VTK_ABI_EXPORT ${name}_Initialize(vtkClientServerInterpreter* csi) 226 ${_vtk_client_server_calls}}\n") 228 set(_vtk_client_server_init_file 229 "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${name}Init.cxx") 231 OUTPUT "${_vtk_client_server_init_file}" 232 CONTENT "${_vtk_client_server_init_content}") 233 # XXX(cmake): Why is this necessary? One would expect that `file(GENERATE)` 234 # would do this automatically. 235 set_property(SOURCE "${_vtk_client_server_init_file}" 239 add_library("${name}" STATIC) 240 target_sources("${name}" 242 ${_vtk_client_server_library_sources} 243 "${_vtk_client_server_init_file}") 244 # Add a dummy file set to optimize dependencies. See CMP0154. 245 _vtk_module_add_file_set("${name}" 246 BASE_DIRS "${CMAKE_CURRENT_BINARY_DIR}" 248 if (BUILD_SHARED_LIBS) 249 set_property(TARGET "${name}" 251 POSITION_INDEPENDENT_CODE 1) 253 set(_vtk_build_LIBRARY_NAME_SUFFIX "${_vtk_client_server_LIBRARY_NAME_SUFFIX}") 254 set(_vtk_build_ARCHIVE_DESTINATION "${_vtk_client_server_DESTINATION}") 255 _vtk_module_apply_properties("${name}") 261 target_link_libraries("${name}" 264 ParaView::RemotingClientServerStream 267 set(_vtk_client_server_export) 268 if (_vtk_client_server_INSTALL_EXPORT) 269 list(APPEND _vtk_client_server_export 270 EXPORT "${_vtk_client_server_INSTALL_EXPORT}") 275 ${_vtk_client_server_export} 276 COMPONENT "${_vtk_client_server_COMPONENT}" 277 ARCHIVE DESTINATION "${_vtk_client_server_DESTINATION}") 281 ## Wrapping a set of VTK modules for ClientServer 284 vtk_module_wrap_client_server( 287 [WRAPPED_MODULES <varname>] 289 [FUNCTION_NAME <function>] 290 [DESTINATION <destination>] 292 [INSTALL_EXPORT <export>] 293 [COMPONENT <component>] 295 [WARNINGS <warning>...] 299 * `MODULES`: (Required) The list of modules to wrap. 300 * `TARGET`: (Required) The target to create which represents all wrapped 301 ClientServer modules. This is used to provide the function used to 302 initialize the bindings. 303 * `WRAPPED_MODULES`: (Recommended) Not all modules are wrappable. This 304 variable will be set to contain the list of modules which were wrapped. 305 * `FUNCTION_NAME`: (Recommended) (Defaults to `<TARGET>_initialize`) The 306 function name to generate in order to initialize the client server 307 bindings.A header with the name `<TARGET>.h` should be included in order to 308 access the initialization function. 309 * `DESTINATION`: (Defaults to `${CMAKE_INSTALL_LIBDIR}`) Where to install the 311 * `INSTALL_EXPORT`: If provided, installs will add the installed 312 libraries and generated interface target to the provided export set. 313 * `COMPONENT`: (Defaults to `development`) All install rules created by this 314 function will use this installation component. 315 * ``WARNINGS``: Warnings to enable. Supported warnings: ``empty``. 317 function (vtk_module_wrap_client_server) 318 cmake_parse_arguments(_vtk_client_server 320 "DESTINATION;INSTALL_EXPORT;TARGET;COMPONENT;FUNCTION_NAME;WRAPPED_MODULES" 324 if (_vtk_client_server_UNPARSED_ARGUMENTS) 326 "Unparsed arguments for vtk_module_wrap_client_server: " 327 "${_vtk_client_server_UNPARSED_ARGUMENTS}") 330 if (NOT _vtk_client_server_MODULES) 332 "No modules were requested for client server wrapping.") 336 if (NOT _vtk_client_server_TARGET) 338 "The `TARGET` argument is required.") 341 set(_vtk_client_server_known_warnings 343 set(_vtk_client_server_warning_args) 344 foreach (_vtk_client_server_warning IN LISTS _vtk_client_server_WARNINGS) 345 if (NOT _vtk_client_server_warning IN_LIST _vtk_client_server_known_warnings) 347 "Unrecognized warning: ${_vtk_client_server_warning}") 349 list(APPEND _vtk_client_server_warning_args 350 "-W${_vtk_client_server_warning}") 353 if (NOT DEFINED _vtk_client_server_DESTINATION) 354 set(_vtk_client_server_DESTINATION "${CMAKE_INSTALL_LIBDIR}") 357 if (NOT DEFINED _vtk_client_server_COMPONENT) 358 set(_vtk_client_server_COMPONENT "development") 361 if (NOT DEFINED _vtk_client_server_FUNCTION_NAME) 362 set(_vtk_client_server_FUNCTION_NAME "${_vtk_client_server_TARGET}_initialize") 365 # Disable CMake's automoc support
for these targets.
370 # TODO: Install cmake properties?
372 set(_vtk_client_server_all_modules)
373 set(_vtk_client_server_all_wrapped_modules)
374 foreach (_vtk_client_server_module IN LISTS _vtk_client_server_MODULES)
375 _vtk_module_get_module_property(
"${_vtk_client_server_module}" 376 PROPERTY
"exclude_wrap" 377 VARIABLE _vtk_client_server_exclude_wrap)
378 if (_vtk_client_server_exclude_wrap)
381 _vtk_module_get_module_property("${_vtk_client_server_module}
" 382 PROPERTY "client_server_exclude
" 383 VARIABLE _vtk_client_server_exclude) 384 if (_vtk_client_server_exclude) 387 _vtk_module_real_target(_vtk_client_server_target_name "${_vtk_client_server_module}
") 388 _vtk_module_get_module_property("${_vtk_client_server_module}
" 389 PROPERTY "library_name
" 390 VARIABLE _vtk_client_server_library_name) 391 _vtk_module_wrap_client_server_library("${_vtk_client_server_library_name}CS
" "${_vtk_client_server_module}
") 393 if (TARGET "${_vtk_client_server_library_name}CS
") 394 list(APPEND _vtk_client_server_all_modules 395 "${_vtk_client_server_library_name}CS
") 396 list(APPEND _vtk_client_server_all_wrapped_modules 397 "${_vtk_client_server_module}
") 401 if (NOT _vtk_client_server_all_modules) 403 "No modules given could be wrapped.
") 406 if (DEFINED _vtk_client_server_WRAPPED_MODULES) 407 set("${_vtk_client_server_WRAPPED_MODULES}
" 408 "${_vtk_client_server_all_wrapped_modules}
" 412 if (_vtk_client_server_TARGET) 413 add_library("${_vtk_client_server_TARGET}
" INTERFACE) 414 target_include_directories("${_vtk_client_server_TARGET}
" 416 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_client_server_TARGET}>
") 418 set(_vtk_client_server_all_modules_include_file 419 "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_vtk_client_server_TARGET}/${_vtk_client_server_TARGET}.h
") 421 set(_vtk_client_server_declarations) 422 set(_vtk_client_server_calls) 423 foreach (_vtk_client_server_module IN LISTS _vtk_client_server_all_modules) 424 string(APPEND _vtk_client_server_declarations 425 "extern \
"C\" void ${_vtk_client_server_module}_Initialize(vtkClientServerInterpreter*);\n")
426 string(APPEND _vtk_client_server_calls
427 " ${_vtk_client_server_module}_Initialize(csi);\n")
430 set(_vtk_client_server_all_modules_include_content
431 "#ifndef ${_vtk_client_server_TARGET}_h 432 #define ${_vtk_client_server_TARGET}_h 434 #include \"vtkClientServerInterpreter.h\" 436 ${_vtk_client_server_declarations} 437 inline void ${_vtk_client_server_FUNCTION_NAME}(vtkClientServerInterpreter* csi) 440 ${_vtk_client_server_calls}} 445 OUTPUT
"${_vtk_client_server_all_modules_include_file}" 446 CONTENT
"${_vtk_client_server_all_modules_include_content}")
448 target_link_libraries(
"${_vtk_client_server_TARGET}" 450 ${_vtk_client_server_all_modules})
452 set(_vtk_client_server_export)
453 if (_vtk_client_server_INSTALL_EXPORT)
454 list(APPEND _vtk_client_server_export
455 EXPORT "${_vtk_client_server_INSTALL_EXPORT}")
459 TARGETS
"${_vtk_client_server_TARGET}" 460 ${_vtk_client_server_export}
461 COMPONENT
"${_vtk_client_server_COMPONENT}" 462 ARCHIVE DESTINATION
"${_vtk_client_server_DESTINATION}")
467 ## Excluding a module from wrapping 469 Some modules should not be wrapped
using client server bindings. Since
this is
470 independent of general wrapping facilities, an additional
property is used to
478 The `MODULE` defaults to the module currently being built. If a module is not
479 being built when
this function is called, it must be provided.
482 cmake_parse_arguments(_vtk_client_server_exclude
488 if (_vtk_client_server_exclude_UNPARSED_ARGUMENTS)
490 "Unparsed arguments for vtk_module_wrap_client_server_exclude: " 491 "${_vtk_client_server_exclude_UNPARSED_ARGUMENTS}")
494 if (NOT DEFINED _vtk_client_server_exclude_MODULE)
495 if (NOT DEFINED _vtk_build_module)
497 "The `MODULE` argument must be provided outside of a module build.")
499 set(_vtk_client_server_exclude_MODULE
"${_vtk_build_module}")
502 _vtk_module_set_module_property(
"${_vtk_client_server_exclude_MODULE}" 503 PROPERTY
"client_server_exclude"
function vtk_module_client_server_exclude()
.md Excluding a module from wrapping