ParaViewPlugin.cmake
Go to the documentation of this file.
1 cmake_policy(PUSH)
2 cmake_policy(SET CMP0057 NEW)
3 
4 set(_ParaViewPlugin_cmake_dir "${CMAKE_CURRENT_LIST_DIR}")
5 
6 #[==[.md
7 # ParaView Plugin CMake API
8 
9 # TODO
10 
11 #]==]
12 
13 #[==[
14 ## Conditionally output debug statements
15 
16 The `_paraview_plugin_debug` function is provided to assist in debugging. It is
17 controlled by the `_paraview_plugin_log` variable which contains a list of
18 "domains" to debug.
19 
20 ~~~
21 _paraview_plugin_debug(<domain> <format>)
22 ~~~
23 
24 If the `domain` is enabled for debugging, the `format` argument is configured
25 and printed. It should contain `@` variable expansions to replace rather than
26 it being done outside. This helps to avoid the cost of generating large strings
27 when debugging is disabled.
28 #]==]
29 function (_paraview_plugin_debug domain format)
30  if (NOT _paraview_plugin_log STREQUAL "ALL" AND
31  NOT domain IN_LIST _paraview_plugin_log)
32  return ()
33  endif ()
34 
35  string(CONFIGURE "${format}" _paraview_plugin_debug_msg)
36  if (_paraview_plugin_debug_msg)
37  message(STATUS
38  "ParaView plugin debug ${domain}: ${_paraview_plugin_debug_msg}")
39  endif ()
40 endfunction ()
41 
42 #[==[.md
43 ## Finding plugins
44 
45 Similar to VTK modules, plugins first have to be discovered. The
46 `paraview_plugin_find_plugins` function does this. The output variable is the
47 list of discovered `paraview.plugin` files.
48 
49 ```
50 paraview_plugin_find_plugins(<output> [<directory>...])
51 ```
52 #]==]
53 function (paraview_plugin_find_plugins output)
54  set(_paraview_find_plugins_all)
55  foreach (_paraview_find_plugins_directory IN LISTS ARGN)
56  file(GLOB_RECURSE _paraview_find_plugins_plugins
57  "${_paraview_find_plugins_directory}/paraview.plugin")
58  list(APPEND _paraview_find_plugins_all
59  ${_paraview_find_plugins_plugins})
60  endforeach ()
61  set("${output}" ${_paraview_find_plugins_all} PARENT_SCOPE)
62 endfunction ()
63 
64 #[==[.md
65 ## Plugin files
66 
67 The `paraview.plugin` file is parsed and used as arguments to a CMake function.
68 
69 Example:
70 
71 ```
72 NAME
73  AdiosReaderPixie
74 CONDITION
75  PARAVIEW_USE_MPI
76 DESCRIPTION
77  Pixie file reader using ADIOS
78 REQUIRES_MODULES
79  VTK:CommonCore
80 ```
81 
82 The supported arguments are:
83 
84  * `NAME`: (Required) The name of the plugin.
85  * `DESCRIPTION`: (Recommended) Short text describing what the plugin does.
86  * `CONDITION`: Arguments to CMake's `if` command which may be used to hide
87  the plugin for certain platforms or other reasons. If the expression is
88  false, the module is completely ignored.
89  * `REQUIRES_MODULES`: If the plugin is enabled, these modules will be listed
90  as those required to build the enabled plugins.
91 #]==]
92 macro (_paraview_plugin_parse_args name_output)
93  cmake_parse_arguments("_name"
94  ""
95  "NAME"
96  ""
97  ${ARGN})
98 
99  if (NOT _name_NAME)
100  message(FATAL_ERROR
101  "A ParaView plugin requires a name (from ${_paraview_scan_plugin_file}).")
102  endif ()
103  set("${name_output}" "${_name_NAME}")
104 
105  cmake_parse_arguments("${_name_NAME}"
106  ""
107  "NAME"
108  "DESCRIPTION;REQUIRES_MODULES;CONDITION"
109  ${ARGN})
110 
111  if (${_name_NAME}_UNPARSED_ARGUMENTS)
112  message(FATAL_ERROR
113  "Unparsed arguments for ${_name_NAME}: "
114  "${${_name_NAME}_UNPARSED_ARGUMENTS}")
115  endif ()
116 
117  if (NOT ${_name_NAME}_DESCRIPTION)
118  message(WARNING "The ${_name_NAME} module should have a description")
119  endif ()
120  string(REPLACE ";" " " "${_name_NAME}_DESCRIPTION" "${${_name_NAME}_DESCRIPTION}")
121 endmacro ()
122 
123 #[==[.md
124 ## Scanning plugins
125 
126 Once the `paraview.plugin` files have been found, they need to be scanned to
127 determine which should be built. Generally, plugins should be scanned first in
128 order to use the `REQUIRES_MODULES` list to enable them during the scan for
129 their required modules.
130 
131 ```
132 paraview_plugin_scan(
133  PLUGIN_FILES <file>...
134  PROVIDES_PLUGINS <variable>
135  [ENABLE_BY_DEFAULT <ON|OFF>]
136  [HIDE_PLUGINS_FROM_CACHE <ON|OFF>]
137  [REQUIRES_MODULES <module>...])
138 ```
139 
140  * `PLUGIN_FILES`: (Required) The list of plugin files to scan.
141  * `PROVIDES_PLUGINS`: (Required) This variable contains a list of the plugins
142  to be built.
143  * `ENABLE_BY_DEFAULT`: (Defaults to `OFF`) Whether to enable plugins by
144  default or not.
145  * `HIDE_PLUGINS_FROM_CACHE`: (Defaults to `OFF`) Whether to display options
146  to enable and disable plugins in the cache or not.
147  * `REQUIRES_MODULES`: The list of modules required by the enabled plugins.
148 #]==]
149 
150 function (paraview_plugin_scan)
151  cmake_parse_arguments(_paraview_scan
152  ""
153  "ENABLE_BY_DEFAULT;HIDE_PLUGINS_FROM_CACHE;REQUIRES_MODULES;PROVIDES_PLUGINS"
154  "PLUGIN_FILES"
155  ${ARGN})
156 
157  if (_paraview_scan_UNPARSED_ARGUMENTS)
158  message(FATAL_ERROR
159  "Unparsed arguments for paraview_plugin_scan: "
160  "${_paraview_scan_UNPARSED_ARGUMENTS}")
161  endif ()
162 
163  if (NOT DEFINED _paraview_scan_ENABLE_BY_DEFAULT)
164  set(_paraview_scan_ENABLE_BY_DEFAULT OFF)
165  endif ()
166 
167  if (NOT DEFINED _paraview_scan_HIDE_PLUGINS_FROM_CACHE)
168  set(_paraview_scan_HIDE_PLUGINS_FROM_CACHE OFF)
169  endif ()
170 
171  if (NOT DEFINED _paraview_scan_PROVIDES_PLUGINS)
172  message(FATAL_ERROR
173  "The `PROVIDES_PLUGINS` argument is required.")
174  endif ()
175 
176  if (NOT _paraview_scan_PLUGIN_FILES)
177  message(FATAL_ERROR
178  "No plugin files given to scan.")
179  endif ()
180 
181  set(_paraview_scan_option_default_type BOOL)
182  if (_paraview_scan_HIDE_PLUGINS_FROM_CACHE)
183  set(_paraview_scan_option_default_type INTERNAL)
184  endif ()
185 
186  set(_paraview_scan_provided_plugins)
187  set(_paraview_scan_required_modules)
188 
189  foreach (_paraview_scan_plugin_file IN LISTS _paraview_scan_PLUGIN_FILES)
190  if (NOT IS_ABSOLUTE "${_paraview_scan_plugin_file}")
191  set(_paraview_scan_plugin_file
192  "${CMAKE_CURRENT_SOURCE_DIR}/${_paraview_scan_plugin_file}")
193  endif ()
194 
195  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND
196  PROPERTY
197  CMAKE_CONFIGURE_DEPENDS "${_paraview_scan_plugin_file}")
198 
199  file(READ "${_paraview_scan_plugin_file}" _paraview_scan_plugin_args)
200  # Replace comments.
201  string(REGEX REPLACE "#[^\n]*\n" "\n" _paraview_scan_plugin_args "${_paraview_scan_plugin_args}")
202  # Use argument splitting.
203  string(REGEX REPLACE "( |\n)+" ";" _paraview_scan_plugin_args "${_paraview_scan_plugin_args}")
204  _paraview_plugin_parse_args(_paraview_scan_plugin_name ${_paraview_scan_plugin_args})
205  _paraview_plugin_debug(plugin "@_paraview_scan_plugin_name@ declared by @_paraview_scan_plugin_file@")
206 
207  list(APPEND _paraview_scan_all_plugins
208  "${_paraview_scan_plugin_name}")
209 
210  set(_paraview_scan_plugin_default "${_paraview_scan_ENABLE_BY_DEFAULT}")
211  if (DEFINED "_paraview_plugin_default_${_paraview_scan_plugin_name}")
212  set(_paraview_scan_plugin_default "${_paraview_plugin_default_${_paraview_scan_plugin_name}}")
213  endif ()
214  option("PARAVIEW_PLUGIN_ENABLE_${_paraview_scan_plugin_name}"
215  "Enable the ${_paraview_scan_plugin_name} plugin. ${${_paraview_scan_plugin_name}_DESCRIPTION}"
216  "${_paraview_scan_plugin_default}")
217  set("_paraview_scan_enable_${_paraview_scan_plugin_name}"
218  "${PARAVIEW_PLUGIN_ENABLE_${_paraview_scan_plugin_name}}")
219 
220  set_property(CACHE "PARAVIEW_PLUGIN_ENABLE_${_paraview_scan_plugin_name}"
221  PROPERTY
222  TYPE "${_paraview_scan_option_default_type}")
223 
224  if (DEFINED ${_paraview_scan_plugin_name}_CONDITION)
225  if (NOT (${${_paraview_scan_plugin_name}_CONDITION}))
226  if (DEFINED "PARAVIEW_PLUGIN_ENABLE_${_paraview_scan_plugin_name}")
227  set_property(CACHE "PARAVIEW_PLUGIN_ENABLE_${_paraview_scan_plugin_name}"
228  PROPERTY
229  TYPE INTERNAL)
230  endif ()
231  _paraview_plugin_debug(plugin "@_paraview_scan_plugin_name@ hidden by its `CONDITION`")
232  continue ()
233  endif ()
234  endif ()
235 
236  if (_paraview_scan_enable_${_paraview_scan_plugin_name})
237  _paraview_plugin_debug(plugin "@_paraview_scan_plugin_name@ requested via cache value")
238  list(APPEND _paraview_scan_provided_plugins
239  "${_paraview_scan_plugin_name}")
240  list(APPEND _paraview_scan_required_modules
241  ${${_paraview_scan_plugin_name}_REQUIRES_MODULES})
242  endif ()
243 
244  set_property(GLOBAL
245  PROPERTY
246  "_paraview_plugin_${_paraview_scan_plugin_name}_file" "${_paraview_scan_plugin_file}")
247  set_property(GLOBAL
248  PROPERTY
249  "_paraview_plugin_${_paraview_scan_plugin_name}_description" "${${_paraview_scan_plugin_name}_DESCRIPTION}")
250  set_property(GLOBAL
251  PROPERTY
252  "_paraview_plugin_${_paraview_scan_plugin_name}_required_modules" "${${_paraview_scan_plugin_name}_REQUIRES_MODULES}")
253  endforeach ()
254 
255  if (DEFINED _paraview_scan_REQUIRES_MODULES)
256  set("${_paraview_scan_REQUIRES_MODULES}"
257  ${_paraview_scan_required_modules}
258  PARENT_SCOPE)
259  endif ()
260 
261  set("${_paraview_scan_PROVIDES_PLUGINS}"
262  ${_paraview_scan_provided_plugins}
263  PARENT_SCOPE)
264 endfunction ()
265 
266 function (_paraview_plugin_check_destdir variable)
267  if (NOT DEFINED "${variable}")
268  message(FATAL_ERROR
269  "It appears as though ${variable} is not defined, but is needed to "
270  "default a destination directory for build artifacts. Usually this is "
271  "resolved by `include(GNUInstallDirs)` at the top of the project.")
272  endif ()
273 endfunction ()
274 
275 #[==[.md
276 ## Building plugins
277 
278 Once all plugins have been scanned, they need to be built.
279 
280 ```
281 paraview_plugin_build(
282  PLUGINS <plugin>...
283  [AUTOLOAD <plugin>...]
284  [PLUGINS_COMPONENT <component>]
285 
286  [TARGET <target>]
287  [INSTALL_EXPORT <export>]
288  [CMAKE_DESTINATION <destination>]
289  [TARGET_COMPONENT <component>]
290  [INSTALL_HEADERS <ON|OFF>]
291  [USE_FILE_SETS <ON|OFF>]
292 
293  [HEADERS_DESTINATION <destination>]
294  [RUNTIME_DESTINATION <destination>]
295  [LIBRARY_DESTINATION <destination>]
296  [LIBRARY_SUBDIRECTORY <subdirectory>]
297  [ADD_INSTALL_RPATHS <ON|OFF>]
298 
299  [PLUGINS_FILE_NAME <filename>]
300  [DISABLE_XML_DOCUMENTATION <ON|OFF>])
301 
302  [GENERATE_SPDX <ON|OFF>]
303  [SPDX_DOCUMENT_NAMESPACE <uri>]
304  [SPDX_DOWNLOAD_LOCATION <url>]
305 ```
306 
307  * `PLUGINS`: (Required) The list of plugins to build. May be empty.
308  * `AUTOLOAD`: A list of plugins to mark for autoloading.
309  * `PLUGINS_COMPONENT`: (Defaults to `paraview_plugins`) The installation
310  component to use for installed plugins.
311  * `TARGET`: (Recommended) The name of an interface target to generate. This
312  provides. an initialization function `<TARGET>_initialize` which
313  initializes static plugins. The function is provided, but is a no-op for
314  shared plugin builds.
315  * `INSTALL_EXPORT`: If provided, the generated target will be added to the
316  named export set.
317  * `CMAKE_DESTINATION`: If provided, the plugin target's properties will be
318  written to a file named `<TARGET>-paraview-plugin-properties.cmake` in the
319  specified destination.
320  * `TARGET_COMPONENT`: (Defaults to `development`) The component to use for
321  `<TARGET>`.
322  * `INSTALL_HEADERS`: (Defaults to `ON`) Whether to install headers or not.
323  * `USE_FILE_SETS`: (Defaults to `OFF`) Whether to use `FILE_SET` source
324  specification or not.
325  * `HEADERS_DESTINATION`: (Defaults to `${CMAKE_INSTALL_INCLUDEDIR}`) Where to
326  install include files.
327  * `RUNTIME_DESTINATION`: (Defaults to `${CMAKE_INSTALL_BINDIR}`) Where to
328  install runtime files.
329  * `LIBRARY_DESTINATION`: (Defaults to `${CMAKE_INSTALL_LIBDIR}`) Where to
330  install modules built by plugins.
331  * `LIBRARY_SUBDIRECTORY`: (Defaults to `""`) Where to install the plugins
332  themselves. Each plugin lives in a directory of its name in
333  `<RUNTIME_DESTINATION>/<LIBRARY_SUBDIRECTORY>` (for Windows) or
334  `<LIBRARY_DESTINATION>/<LIBRARY_SUBDIRECTORY>` for other platforms.
335  * `ADD_INSTALL_RPATHS`: (Defaults to `ON`) If specified, an RPATH to load
336  dependent libraries from the `LIBRARY_DESTINATION` from the plugins will be
337  added.
338  * `PLUGINS_FILE_NAME`: The name of the XML plugin file to generate for the
339  built plugins. This file will be placed under
340  `<LIBRARY_DESTINATION>/<LIBRARY_SUBDIRECTORY>`. It will be installed with
341  the `plugin` component.
342  * `DISABLE_XML_DOCUMENTATION`: (Defaults to `OFF`) Whether to forcefully
343  disable XML documentation or not.
344  * ``GENERATE_SPDX``: (Defaults to ``OFF``) Whether or not to generate and install
345  SPDX file for each modules.
346  * ``SPDX_DOCUMENT_NAMESPACE``: (Defaults to ``""``) Document namespace to use when
347  generating SPDX files.
348  * ``SPDX_DOWNLOAD_LOCATION``: (Defaults to ``""``) Download location to use when
349  generating SPDX files.
350 #]==]
351 function (paraview_plugin_build)
352  cmake_parse_arguments(_paraview_build
353  ""
354  "HEADERS_DESTINATION;RUNTIME_DESTINATION;LIBRARY_DESTINATION;LIBRARY_SUBDIRECTORY;TARGET;PLUGINS_FILE_NAME;INSTALL_EXPORT;CMAKE_DESTINATION;PLUGINS_COMPONENT;TARGET_COMPONENT;ADD_INSTALL_RPATHS;INSTALL_HEADERS;DISABLE_XML_DOCUMENTATION;GENERATE_SPDX;SPDX_DOCUMENT_NAMESPACE;SPDX_DOWNLOAD_LOCATION;USE_FILE_SETS"
355  "PLUGINS;AUTOLOAD"
356  ${ARGN})
357 
358  if (_paraview_build_UNPARSED_ARGUMENTS)
359  message(FATAL_ERROR
360  "Unparsed arguments for paraview_plugin_build: "
361  "${_paraview_build_UNPARSED_ARGUMENTS}")
362  endif ()
363 
364  if (NOT DEFINED _paraview_build_HEADERS_DESTINATION)
365  _paraview_plugin_check_destdir(CMAKE_INSTALL_INCLUDEDIR)
366  set(_paraview_build_HEADERS_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
367  endif ()
368 
369  if (NOT DEFINED _paraview_build_RUNTIME_DESTINATION)
370  _paraview_plugin_check_destdir(CMAKE_INSTALL_BINDIR)
371  set(_paraview_build_RUNTIME_DESTINATION "${CMAKE_INSTALL_BINDIR}")
372  endif ()
373 
374  if (NOT DEFINED _paraview_build_LIBRARY_DESTINATION)
375  _paraview_plugin_check_destdir(CMAKE_INSTALL_LIBDIR)
376  set(_paraview_build_LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}")
377  endif ()
378 
379  if (NOT DEFINED _paraview_build_LIBRARY_SUBDIRECTORY)
380  set(_paraview_build_LIBRARY_SUBDIRECTORY "")
381  endif ()
382 
383  if (NOT _paraview_build_DISABLE_XML_DOCUMENTATION)
384  set(_paraview_build_DISABLE_XML_DOCUMENTATION OFF)
385  endif ()
386 
387  if (NOT DEFINED _paraview_build_GENERATE_SPDX)
388  set(_paraview_build_GENERATE_SPDX OFF)
389  endif ()
390 
391  if (NOT _paraview_build_SPDX_DOCUMENT_NAMESPACE)
392  set(_paraview_build_SPDX_DOCUMENT_NAMESPACE "")
393  endif ()
394 
395  if (NOT _paraview_build_SPDX_DOWNLOAD_LOCATION)
396  set(_paraview_build_SPDX_DOWNLOAD_LOCATION "")
397  endif ()
398 
399  if (NOT DEFINED _paraview_build_INSTALL_HEADERS)
400  set(_paraview_build_INSTALL_HEADERS ON)
401  endif ()
402 
403  if (NOT DEFINED _paraview_build_USE_FILE_SETS)
404  set(_paraview_build_USE_FILE_SETS OFF)
405  endif ()
406 
407  if (NOT DEFINED _paraview_build_ADD_INSTALL_RPATHS)
408  set(_paraview_build_ADD_INSTALL_RPATHS ON)
409  endif ()
410  if (_paraview_build_ADD_INSTALL_RPATHS)
411  if (NOT _paraview_build_LIBRARY_SUBDIRECTORY STREQUAL "")
412  file(RELATIVE_PATH _paraview_build_relpath
413  "/prefix/${_paraview_build_LIBRARY_DESTINATION}/${_paraview_build_LIBRARY_SUBDIRECTORY}/plugin"
414  "/prefix/${_paraview_build_LIBRARY_DESTINATION}")
415  else ()
416  file(RELATIVE_PATH _paraview_build_relpath
417  "/prefix/${_paraview_build_LIBRARY_DESTINATION}/plugin"
418  "/prefix/${_paraview_build_LIBRARY_DESTINATION}")
419  endif ()
420  if (APPLE)
421  list(APPEND CMAKE_INSTALL_RPATH
422  "@loader_path/${_paraview_build_relpath}")
423  elseif (UNIX)
424  list(APPEND CMAKE_INSTALL_RPATH
425  "$ORIGIN/${_paraview_build_relpath}")
426  endif ()
427  endif ()
428 
429  if (DEFINED _paraview_build_INSTALL_EXPORT
430  AND NOT DEFINED _paraview_build_TARGET)
431  message(FATAL_ERROR
432  "The `INSTALL_EXPORT` argument requires the `TARGET` argument.")
433  endif ()
434 
435  if (DEFINED _paraview_build_INSTALL_EXPORT
436  AND NOT DEFINED _paraview_build_CMAKE_DESTINATION)
437  message(FATAL_ERROR
438  "The `INSTALL_EXPORT` argument requires the `CMAKE_DESTINATION` argument.")
439  endif ()
440 
441  set(_paraview_build_extra_destinations)
442  if (DEFINED _paraview_build_CMAKE_DESTINATION)
443  list(APPEND _paraview_build_extra_destinations
444  CMAKE_DESTINATION)
445  if (NOT DEFINED _paraview_build_TARGET)
446  message(FATAL_ERROR
447  "The `CMAKE_DESTINATION` argument requires the `TARGET` argument.")
448  endif ()
449  endif ()
450 
451  if (DEFINED _paraview_build_TARGET)
452  _vtk_module_split_module_name("${_paraview_build_TARGET}" _paraview_build)
453  string(REPLACE "::" "_" _paraview_build_target_safe "${_paraview_build_TARGET}")
454  endif ()
455 
456  _vtk_module_check_destinations(_paraview_build_
457  HEADERS_DESTINATION
458  RUNTIME_DESTINATION
459  LIBRARY_DESTINATION
460  LIBRARY_SUBDIRECTORY
461  ${_paraview_build_extra_destinations})
462 
463  if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
464  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_paraview_build_RUNTIME_DESTINATION}")
465  endif ()
466  if (NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
467  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_paraview_build_LIBRARY_DESTINATION}")
468  endif ()
469  if (NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
470  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_paraview_build_LIBRARY_DESTINATION}")
471  endif ()
472 
473  if (WIN32)
474  set(_paraview_build_plugin_destination "${_paraview_build_RUNTIME_DESTINATION}")
475  else ()
476  set(_paraview_build_plugin_destination "${_paraview_build_LIBRARY_DESTINATION}")
477  endif ()
478  if (NOT _paraview_build_LIBRARY_SUBDIRECTORY STREQUAL "")
479  string(APPEND _paraview_build_plugin_destination "/${_paraview_build_LIBRARY_SUBDIRECTORY}")
480  endif ()
481 
482  foreach (_paraview_build_plugin IN LISTS _paraview_build_PLUGINS)
483  get_property(_paraview_build_plugin_file GLOBAL
484  PROPERTY "_paraview_plugin_${_paraview_build_plugin}_file")
485  if (NOT _paraview_build_plugin_file)
486  message(FATAL_ERROR
487  "The requested ${_paraview_build_plugin} plugin is not a ParaView plugin.")
488  endif ()
489 
490  _paraview_plugin_debug(building "@_paraview_build_plugin@ is being built")
491 
492  # Make a variable for where the plugin should go.
493  set(_paraview_build_plugin_directory
494  "${_paraview_build_plugin_destination}/${_paraview_build_plugin}")
495 
496  # TODO: Support external plugins?
497  get_filename_component(_paraview_build_plugin_dir "${_paraview_build_plugin_file}" DIRECTORY)
498  file(RELATIVE_PATH _paraview_build_plugin_subdir "${CMAKE_SOURCE_DIR}" "${_paraview_build_plugin_dir}")
499  add_subdirectory(
500  "${CMAKE_SOURCE_DIR}/${_paraview_build_plugin_subdir}"
501  "${CMAKE_BINARY_DIR}/${_paraview_build_plugin_subdir}")
502  endforeach ()
503 
504  if (DEFINED _paraview_build_TARGET)
505  add_library("${_paraview_build_TARGET_NAME}" INTERFACE)
506  if (_paraview_build_NAMESPACE)
507  add_library("${_paraview_build_TARGET}" ALIAS "${_paraview_build_TARGET_NAME}")
508  endif ()
509  target_include_directories("${_paraview_build_TARGET_NAME}"
510  INTERFACE
511  "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_paraview_build_target_safe}>"
512  "$<INSTALL_INTERFACE:${_paraview_build_HEADERS_DESTINATION}>")
513  set(_paraview_build_include_file
514  "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_paraview_build_target_safe}/${_paraview_build_target_safe}.h")
515 
516  set(_paraview_static_plugins)
517  foreach (_paraview_build_plugin IN LISTS _paraview_build_PLUGINS)
518  get_property(_paraview_build_plugin_type
519  TARGET "${_paraview_build_plugin}"
520  PROPERTY TYPE)
521  if (_paraview_build_plugin_type STREQUAL "STATIC_LIBRARY")
522  list(APPEND _paraview_static_plugins
523  "${_paraview_build_plugin}")
524  endif ()
525  endforeach ()
526 
527  if (_paraview_static_plugins)
528  target_link_libraries("${_paraview_build_TARGET_NAME}"
529  INTERFACE
530  ParaView::RemotingCore
531  ${_paraview_static_plugins})
532 
533  set(_paraview_build_declarations)
534  set(_paraview_build_calls)
535  set(_paraview_build_names)
536  foreach (_paraview_build_plugin IN LISTS _paraview_static_plugins)
537  string(APPEND _paraview_build_declarations
538  "PV_PLUGIN_IMPORT_INIT(${_paraview_build_plugin});\n")
539  string(APPEND _paraview_build_calls
540  " if (sname == \"${_paraview_build_plugin}\")
541  {
542  if (load)
543  {
544  static bool loaded = false;
545  if (!loaded)
546  {
547  loaded = PV_PLUGIN_IMPORT(${_paraview_build_plugin});
548  }
549  }
550  return true;
551  }\n\n")
552  string(APPEND _paraview_build_names
553  " names.emplace_back(\"${_paraview_build_plugin}\");\n")
554  endforeach ()
555 
556  set(_paraview_build_include_content
557  "#ifndef ${_paraview_build_target_safe}_h
558 #define ${_paraview_build_target_safe}_h
559 
560 #define PARAVIEW_BUILDING_PLUGIN
561 #define PARAVIEW_PLUGIN_BUILT_SHARED 0
562 #include \"vtkPVPlugin.h\"
563 #include \"vtkPVPluginLoader.h\"
564 #include \"vtkPVPluginTracker.h\"
565 #include <string>
566 
567 ${_paraview_build_declarations}
568 static bool ${_paraview_build_target_safe}_static_plugins_load(const char* name);
569 static bool ${_paraview_build_target_safe}_static_plugins_search(const char* name);
570 static void ${_paraview_build_target_safe}_static_plugins_list(const char* appname, std::vector<std::string>& names);
571 
572 static void ${_paraview_build_target_safe}_initialize()
573 {
574  vtkPVPluginLoader::RegisterLoadPluginCallback(${_paraview_build_target_safe}_static_plugins_load);
575  vtkPVPluginTracker::RegisterStaticPluginSearchFunction(${_paraview_build_target_safe}_static_plugins_search);
576  vtkPVPluginTracker::RegisterStaticPluginListFunction(${_paraview_build_target_safe}_static_plugins_list);
577 }
578 
579 static bool ${_paraview_build_target_safe}_static_plugins_func(const char* name, bool load);
580 
581 static bool ${_paraview_build_target_safe}_static_plugins_load(const char* name)
582 {
583  return ${_paraview_build_target_safe}_static_plugins_func(name, true);
584 }
585 
586 static bool ${_paraview_build_target_safe}_static_plugins_search(const char* name)
587 {
588  return ${_paraview_build_target_safe}_static_plugins_func(name, false);
589 }
590 
591 static void ${_paraview_build_target_safe}_static_plugins_list(const char* appname, std::vector<std::string>& names)
592 {
593 ${_paraview_build_names}
594  (void) appname;
595  (void) names;
596 }
597 
598 static bool ${_paraview_build_target_safe}_static_plugins_func(const char* name, bool load)
599 {
600  std::string const sname = name;
601 
602 ${_paraview_build_calls}
603  return false;
604 }
605 
606 #endif\n")
607  else ()
608  set(_paraview_build_include_content
609  "#ifndef ${_paraview_build_target_safe}_h
610 #define ${_paraview_build_target_safe}_h
611 
612 static void ${_paraview_build_target_safe}_initialize()
613 {
614 }
615 
616 #endif\n")
617  endif ()
618 
619  file(GENERATE
620  OUTPUT "${_paraview_build_include_file}"
621  CONTENT "${_paraview_build_include_content}")
622  if (_paraview_build_INSTALL_HEADERS)
623  install(
624  FILES "${_paraview_build_include_file}"
625  DESTINATION "${_paraview_build_HEADERS_DESTINATION}"
626  COMPONENT "${_paraview_build_TARGET_COMPONENT}")
627  endif ()
628 
629  if (DEFINED _paraview_build_INSTALL_EXPORT)
630  install(
631  TARGETS "${_paraview_build_TARGET_NAME}"
632  EXPORT "${_paraview_build_INSTALL_EXPORT}"
633  COMPONENT "${_paraview_build_TARGET_COMPONENT}")
634 
635  set(_paraview_build_required_exports_include_file_name "${_paraview_build_INSTALL_EXPORT}-${_paraview_build_TARGET_NAME}-targets-depends.cmake")
636  set(_paraview_build_required_exports_include_build_file
637  "${CMAKE_BINARY_DIR}/${_paraview_build_CMAKE_DESTINATION}/${_paraview_build_required_exports_include_file_name}")
638  set(_paraview_build_required_exports_include_contents "")
639  get_property(_paraview_build_required_exports GLOBAL
640  PROPERTY "paraview_plugin_${_paraview_build_TARGET}_required_exports")
641  if (_paraview_build_required_exports)
642  foreach (_paraview_build_required_export IN LISTS _paraview_build_required_exports)
643  string(APPEND _paraview_build_required_exports_include_contents
644  "include(\"\${CMAKE_CURRENT_LIST_DIR}/${_paraview_build_required_export}-targets.cmake\")\n"
645  "include(\"\${CMAKE_CURRENT_LIST_DIR}/${_paraview_build_required_export}-vtk-module-properties.cmake\")\n"
646  "\n")
647 
648  get_property(_paraview_build_modules GLOBAL
649  PROPERTY "paraview_plugin_${_paraview_build_required_export}_modules")
650  if (_paraview_build_modules)
651  vtk_module_export_find_packages(
652  CMAKE_DESTINATION "${_paraview_build_CMAKE_DESTINATION}"
653  FILE_NAME "${_paraview_build_required_export}-vtk-module-find-packages.cmake"
654  MODULES ${_paraview_build_modules})
655 
656  # TODO: The list of modules should be checked for their `_FOUND`
657  # variables being false and propagate it up through the parent
658  # project's `_FOUND` variable.
659  string(APPEND _paraview_build_required_exports_include_contents
660  "set(CMAKE_FIND_PACKAGE_NAME_save \"\${CMAKE_FIND_PACKAGE_NAME}\")\n"
661  "set(${_paraview_build_required_export}_FIND_QUIETLY \"\${\${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY}\")\n"
662  "set(${_paraview_build_required_export}_FIND_COMPONENTS)\n"
663  "set(CMAKE_FIND_PACKAGE_NAME \"${_paraview_build_required_export}\")\n"
664  "include(\"\${CMAKE_CURRENT_LIST_DIR}/${_paraview_build_required_export}-vtk-module-find-packages.cmake\")\n"
665  "set(CMAKE_FIND_PACKAGE_NAME \"\${CMAKE_FIND_PACKAGE_NAME_save}\")\n"
666  "unset(${_paraview_build_required_export}_FIND_QUIETLY)\n"
667  "unset(${_paraview_build_required_export}_FIND_COMPONENTS)\n"
668  "unset(CMAKE_FIND_PACKAGE_NAME_save)\n"
669  "\n"
670  "\n")
671  endif ()
672  endforeach ()
673  endif ()
674  file(GENERATE
675  OUTPUT "${_paraview_build_required_exports_include_build_file}"
676  CONTENT "${_paraview_build_required_exports_include_contents}")
677  if (_paraview_build_INSTALL_HEADERS)
678  install(
679  FILES "${_paraview_build_required_exports_include_build_file}"
680  DESTINATION "${_paraview_build_CMAKE_DESTINATION}"
681  COMPONENT "${_paraview_build_TARGET_COMPONENT}")
682  endif ()
683 
684  set(_paraview_build_namespace_args)
685  if (_paraview_build_NAMESPACE)
686  list(APPEND _paraview_build_namespace_args
687  NAMESPACE "${_paraview_build_NAMESPACE}::")
688  endif ()
689 
690  if (_paraview_build_INSTALL_HEADERS)
691  export(
692  EXPORT "${_paraview_build_INSTALL_EXPORT}"
693  ${_paraview_build_namespace_args}
694  FILE "${CMAKE_BINARY_DIR}/${_paraview_build_CMAKE_DESTINATION}/${_paraview_build_INSTALL_EXPORT}-targets.cmake")
695  install(
696  EXPORT "${_paraview_build_INSTALL_EXPORT}"
697  DESTINATION "${_paraview_build_CMAKE_DESTINATION}"
698  ${_paraview_build_namespace_args}
699  FILE "${_paraview_build_INSTALL_EXPORT}-targets.cmake"
700  COMPONENT "${_paraview_build_TARGET_COMPONENT}")
701  endif ()
702  endif ()
703  endif ()
704 
705  if (DEFINED _paraview_build_PLUGINS_FILE_NAME)
706  set(_paraview_build_xml_file
707  "${CMAKE_BINARY_DIR}/${_paraview_build_plugin_destination}/${_paraview_build_PLUGINS_FILE_NAME}")
708  set(_paraview_build_xml_content
709  "<?xml version=\"1.0\"?>\n<Plugins>\n")
710  foreach (_paraview_build_plugin IN LISTS _paraview_build_PLUGINS)
711  set(_paraview_build_autoload 0)
712  if (_paraview_build_plugin IN_LIST _paraview_build_AUTOLOAD)
713  set(_paraview_build_autoload 1)
714  endif ()
715  string(APPEND _paraview_build_xml_content
716  " <Plugin name=\"${_paraview_build_plugin}\" auto_load=\"${_paraview_build_autoload}\"/>\n")
717  endforeach ()
718  string(APPEND _paraview_build_xml_content
719  "</Plugins>\n")
720 
721  file(GENERATE
722  OUTPUT "${_paraview_build_xml_file}"
723  CONTENT "${_paraview_build_xml_content}")
724  install(
725  FILES "${_paraview_build_xml_file}"
726  DESTINATION "${_paraview_build_plugin_destination}"
727  COMPONENT "${_paraview_build_TARGET_COMPONENT}")
728 
729  if (DEFINED _paraview_build_INSTALL_EXPORT)
730  set_property(TARGET "${_paraview_build_TARGET_NAME}"
731  PROPERTY
732  "INTERFACE_paraview_plugin_plugins_file" "${_paraview_build_xml_file}")
733 
734  if (DEFINED _paraview_build_RUNTIME_DESTINATION)
735  set_property(TARGET "${_paraview_build_TARGET_NAME}"
736  PROPERTY
737  "INTERFACE_paraview_plugin_plugins_file_install" "${_paraview_build_plugin_destination}/${_paraview_build_PLUGINS_FILE_NAME}")
738  endif ()
739 
740  if (DEFINED _paraview_build_CMAKE_DESTINATION)
741  set(_paraview_build_properties_filename "${_paraview_build_INSTALL_EXPORT}-paraview-plugin-properties.cmake")
742  set(_paraview_build_properties_build_file
743  "${CMAKE_BINARY_DIR}/${_paraview_build_CMAKE_DESTINATION}/${_paraview_build_properties_filename}")
744  set(_paraview_build_properties_install_file
745  "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_paraview_build_properties_filename}.install")
746 
747  file(WRITE "${_paraview_build_properties_build_file}")
748  file(WRITE "${_paraview_build_properties_install_file}")
749 
750  _vtk_module_write_import_prefix(
751  "${_paraview_build_properties_install_file}"
752  "${_paraview_build_CMAKE_DESTINATION}")
753 
754  file(APPEND "${_paraview_build_properties_build_file}"
755  "set_property(TARGET \"${_paraview_build_TARGET}\"
756  PROPERTY
757  INTERFACE_paraview_plugin_plugins_file \"${_paraview_build_xml_file}\")\n")
758  file(APPEND "${_paraview_build_properties_install_file}"
759  "set_property(TARGET \"${_paraview_build_TARGET}\"
760  PROPERTY
761  INTERFACE_paraview_plugin_plugins_file \"\${_vtk_module_import_prefix}/${_paraview_build_plugin_destination}/${_paraview_build_PLUGINS_FILE_NAME}\")
762 unset(_vtk_module_import_prefix)\n")
763 
764  if (_paraview_build_INSTALL_HEADERS)
765  install(
766  FILES "${_paraview_build_properties_install_file}"
767  DESTINATION "${_paraview_build_CMAKE_DESTINATION}"
768  RENAME "${_paraview_build_properties_filename}"
769  COMPONENT "${_paraview_build_TARGET_COMPONENT}")
770  endif ()
771  endif ()
772  endif ()
773  endif ()
774 endfunction ()
775 
776 #[==[.md
777 ## Plugin configuration files
778 
779 Applications will want to consume plugin targets by discovering their locations
780 at runtime. In order to facilitate this, ParaView supports loading a `conf`
781 file which contains the locations of plugin targets' XML files. The plugins
782 specified in that file is then
783 
784 ```
786  NAME <name>
787  PLUGINS_TARGETS <target>...
788  BUILD_DESTINATION <destination>
789 
790  [INSTALL_DESTINATION <destination>]
791  [COMPONENT <component>])
792 ```
793 
794  * `NAME`: (Required) The base name of the configuration file.
795  * `PLUGINS_TARGETS`: (Required) The list of plugin targets to add to the
796  configuration file.
797  * `BUILD_DESTINATION`: (Required) Where to place the configuration file in
798  the build tree.
799  * `INSTALL_DESTINATION`: Where to install the configuration file in the
800  install tree. If not provided, the configuration file will not be
801  installed.
802  * `COMPONENT`: (Defaults to `runtime`) The component to use when installing
803  the configuration file.
804 #]==]
806  cmake_parse_arguments(_paraview_plugin_conf
807  ""
808  "NAME;BUILD_DESTINATION;INSTALL_DESTINATION;COMPONENT"
809  "PLUGINS_TARGETS"
810  ${ARGN})
811 
812  if (_paraview_plugin_conf_UNPARSED_ARGUMENTS)
813  message(FATAL_ERROR
814  "Unparsed arguments for paraview_plugin_write_conf: "
815  "${_paraview_plugin_conf_UNPARSED_ARGUMENTS}")
816  endif ()
817 
818  if (NOT _paraview_plugin_conf_NAME)
819  message(FATAL_ERROR
820  "The `NAME` must not be empty.")
821  endif ()
822 
823  if (NOT DEFINED _paraview_plugin_conf_BUILD_DESTINATION)
824  message(FATAL_ERROR
825  "The `BUILD_DESTINATION` argument is required.")
826  endif ()
827 
828  if (NOT DEFINED _paraview_plugin_conf_PLUGINS_TARGETS)
829  message(FATAL_ERROR
830  "The `PLUGINS_TARGETS` argument is required.")
831  endif ()
832 
833  if (NOT DEFINED _paraview_plugin_conf_COMPONENT)
834  set(_paraview_plugin_conf_COMPONENT "runtime")
835  endif ()
836 
837  set(_paraview_plugin_conf_file_name
838  "${_paraview_plugin_conf_NAME}.conf")
839  set(_paraview_plugin_conf_build_file
840  "${CMAKE_BINARY_DIR}/${_paraview_plugin_conf_BUILD_DESTINATION}/${_paraview_plugin_conf_file_name}")
841  set(_paraview_plugin_conf_install_file
842  "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_paraview_plugin_conf_file_name}.install")
843  set(_paraview_plugin_conf_build_contents)
844  set(_paraview_plugin_conf_install_contents)
845  foreach (_paraview_plugin_conf_target IN LISTS _paraview_plugin_conf_PLUGINS_TARGETS)
846  get_property(_paraview_plugin_conf_plugins_target_is_imported
847  TARGET "${_paraview_plugin_conf_target}"
848  PROPERTY IMPORTED)
849  if (_paraview_plugin_conf_plugins_target_is_imported)
850  get_property(_paraview_plugin_conf_plugins_target_xml_build
851  TARGET "${_paraview_plugin_conf_target}"
852  PROPERTY "INTERFACE_paraview_plugin_plugins_file")
853  set(_paraview_plugin_conf_plugins_target_xml_install
854  "${_paraview_plugin_conf_plugins_target_xml_build}")
855 
856  file(RELATIVE_PATH _paraview_plugin_conf_rel_path
857  "/prefix/${CMAKE_INSTALL_PREFIX}"
858  "/prefix/${_paraview_plugin_conf_plugins_target_xml_install}")
859  # If the external plugins XML file is under our installation destination,
860  # use a relative path to it, otherwise keep the absolute path.
861  if (NOT _paraview_plugin_conf_rel_path MATCHES "^\.\./")
862  file(RELATIVE_PATH _paraview_plugin_conf_plugins_target_xml_install
863  "/prefix/${CMAKE_INSTALL_PREFIX}/${_paraview_plugin_conf_INSTALL_DESTINATION}"
864  "/prefix/${_paraview_plugin_conf_plugins_target_xml_install}")
865  endif ()
866  else ()
867  get_property(_paraview_plugin_conf_plugins_target_is_alias
868  TARGET "${_paraview_plugin_conf_target}"
869  PROPERTY ALIASED_TARGET
870  SET)
871  if (_paraview_plugin_conf_plugins_target_is_alias)
872  get_property(_paraview_plugin_conf_target
873  TARGET "${_paraview_plugin_conf_target}"
874  PROPERTY ALIASED_TARGET)
875  endif ()
876  get_property(_paraview_plugin_conf_plugins_target_xml_build
877  TARGET "${_paraview_plugin_conf_target}"
878  PROPERTY "INTERFACE_paraview_plugin_plugins_file")
879  get_property(_paraview_plugin_conf_plugins_target_xml_install
880  TARGET "${_paraview_plugin_conf_target}"
881  PROPERTY "INTERFACE_paraview_plugin_plugins_file_install")
882 
883  if (_paraview_plugin_conf_plugins_target_xml_install)
884  # Compute the relative path within the install tree.
885  file(RELATIVE_PATH _paraview_plugin_conf_plugins_target_xml_install
886  "/prefix/${_paraview_plugin_conf_INSTALL_DESTINATION}"
887  "/prefix/${_paraview_plugin_conf_plugins_target_xml_install}")
888  endif ()
889  endif ()
890 
891  # TODO: Write out in JSON instead.
892  if (_paraview_plugin_conf_plugins_target_xml_build)
893  string(APPEND _paraview_plugin_conf_build_contents
894  "${_paraview_plugin_conf_plugins_target_xml_build}\n")
895  endif ()
896  if (_paraview_plugin_conf_plugins_target_xml_install)
897  string(APPEND _paraview_plugin_conf_install_contents
898  "${_paraview_plugin_conf_plugins_target_xml_install}\n")
899  endif ()
900  endforeach ()
901 
902  file(GENERATE
903  OUTPUT "${_paraview_plugin_conf_build_file}"
904  CONTENT "${_paraview_plugin_conf_build_contents}")
905 
906  if (_paraview_plugin_conf_INSTALL_DESTINATION)
907  file(GENERATE
908  OUTPUT "${_paraview_plugin_conf_install_file}"
909  CONTENT "${_paraview_plugin_conf_install_contents}")
910  install(
911  FILES "${_paraview_plugin_conf_install_file}"
912  DESTINATION "${_paraview_plugin_conf_INSTALL_DESTINATION}"
913  RENAME "${_paraview_plugin_conf_file_name}"
914  COMPONENT "${_paraview_plugin_conf_COMPONENT}")
915  endif ()
916 endfunction ()
917 
918 set(_paraview_plugin_source_dir "${CMAKE_CURRENT_LIST_DIR}")
919 
920 #[==[.md
921 ## Adding a plugin
922 
923 TODO: Describe.
924 
925 ```
927  [REQUIRED_ON_SERVER] [REQUIRED_ON_CLIENT]
928  VERSION <version>
929 
930  [MODULE_FILES <vtk.module>...]
931  [MODULE_ARGS <arg>...]
932  [MODULES <module>...]
933  [SOURCES <source>...]
934  [SERVER_MANAGER_XML <xml>...]
935  [MODULE_INSTALL_EXPORT <export>]
936 
937  [UI_INTERFACES <interface>...]
938  [UI_RESOURCES <resource>...]
939  [UI_FILES <file>...]
940 
941  [PYTHON_MODULES <module>...]
942 
943  [INITIALIZERS <initializerFunction>...]
944 
945  [EXTRA_INCLUDES <file>...]
946 
947  [REQUIRED_PLUGINS <plugin>...]
948 
949  [EULA <eula>]
950  [XML_DOCUMENTATION <ON|OFF>]
951  [DOCUMENTATION_DIR <directory>]
952  [DOCUMENTATION_ADD_PATTERNS <pattern>...]
953  [DOCUMENTATION_TOC <string>]
954  [DOCUMENTATION_DEPENDENCIES <target>...]
955 
956  [FORCE_STATIC <ON|OFF>])
957 
958  [TRANSLATIONS_DIRECTORY <directory>]
959  [TRANSLATIONS_TARGET <target>]
960 ```
961 
962  * `REQUIRED_ON_SERVER`: The plugin is required to be loaded on the server for
963  proper functionality.
964  * `REQUIRED_ON_CLIENT`: The plugin is required to be loaded on the client for
965  proper functionality.
966  * `VERSION`: (Required) The version number of the plugin.
967  * `MODULE_FILES`: Paths to `vtk.module` files describing modules to include
968  in the plugin.
969  * `MODULE_ARGS`: Arguments to pass to `vtk_module_build` for included modules.
970  * `MODULES`: Modules to include in the plugin. These modules will be wrapped
971  using client server and have their server manager XML files processed.
972  * `SOURCES`: Source files for the plugin.
973  * `SERVER_MANAGER_XML`: Server manager XML files for the plugin.
974  * `UI_INTERFACES`: Interfaces to initialize, in the given order. See the
975  plugin interfaces section for more details.
976  * `MODULE_INSTALL_EXPORT`: (Defaults to `<name>`) If provided, any modules
977  will be added to the given export set.
978  * `UI_RESOURCES`: Qt resource files to include with the plugin.
979  * `UI_FILES`: Qt `.ui` files to include with the plugin.
980  * `PYTHON_MODULES`: Python modules to embed into the plugin.
981  * `INITIALIZERS`: An ordered list of free functions (declared in `EXTRA_INCLUDES`
982  if needed) to be invoked when the plugin is loaded. Each function must be
983  callable with no arguments.
984  * `EXTRA_INCLUDES`: Headers needed by the generated plugin code (such as `INITIALIZERS`).
985  Filename paths passed without quotes will be double-quoted (e.g., \verbatim`#include "foo.h"`\endverbatim),
986  while paths that start with angle- or double-quotes will not be.
987  * `REQUIRED_PLUGINS`: Plugins which must be loaded for this plugin to
988  function. These plugins do not need to be available at build time and are
989  therefore their existence is not checked here.
990  * `EULA`: A file with content to display as an end-user license agreement
991  before the plugin is initialized at runtime.
992  * `XML_DOCUMENTATION`: (Defaults to `ON`) If set, documentation will be
993  generated for the associated XML files.
994  * `DOCUMENTATION_DIR`: If specified, `*.html`, `*.css`, `*.png`, `*.js`, and `*.jpg`
995  files in this directory will be copied and made available to the
997  * `DOCUMENTATION_ADD_PATTERNS`: If specified, adds patterns for the documentation files
998  within `DOCUMENTATION_DIR` other than the default ones (see `DOCUMENTATION_DIR` help)
999  * `DOCUMENTATION_TOC`: If specified, use this string for describing the table of
1000  content for the documentation.
1001  * `DOCUMENTATION_DEPENDENCIES`: Targets that are needed to be built before
1002  building the documentation.
1003  * `EXPORT`: (Deprecated) Use `paraview_plugin_build(INSTALL_EXPORT)` instead.
1004  * `FORCE_STATIC`: (Defaults to `OFF`) If set, the plugin will be built
1005  statically so that it can be embedded into an application.
1006  * `TRANSLATIONS_DIRECTORY`: (Defaults to `${CMAKE_CURRENT_BINARY_DIR}/Translations`)
1007  The path of the directory where translation source files are stored.
1008  * `TRANSLATION_TARGET` : The name of the target on which to add the ts file as
1009  dependency.
1010 #]==]
1012  if (NOT name STREQUAL _paraview_build_plugin)
1013  message(FATAL_ERROR
1014  "The ${_paraview_build_plugin}'s CMakeLists.txt may not add the ${name} "
1015  "plugin.")
1016  endif ()
1017 
1018  cmake_parse_arguments(_paraview_add_plugin
1019  "REQUIRED_ON_SERVER;REQUIRED_ON_CLIENT"
1020  "VERSION;EULA;EXPORT;MODULE_INSTALL_EXPORT;XML_DOCUMENTATION;DOCUMENTATION_DIR;FORCE_STATIC;DOCUMENTATION_TOC;TRANSLATIONS_DIRECTORY;TRANSLATIONS_TARGET"
1021  "REQUIRED_PLUGINS;SERVER_MANAGER_XML;SOURCES;MODULES;UI_INTERFACES;UI_RESOURCES;UI_FILES;PYTHON_MODULES;MODULE_FILES;MODULE_ARGS;DOCUMENTATION_ADD_PATTERNS;DOCUMENTATION_DEPENDENCIES;INITIALIZERS;EXTRA_INCLUDES"
1022  ${ARGN})
1023 
1024  if (_paraview_add_plugin_UNPARSED_ARGUMENTS)
1025  message(FATAL_ERROR
1026  "Unparsed arguments for paraview_add_plugin: "
1027  "${_paraview_add_plugin_UNPARSED_ARGUMENTS}")
1028  endif ()
1029 
1030  if (NOT DEFINED _paraview_add_plugin_VERSION)
1031  message(FATAL_ERROR
1032  "The `VERSION` argument is required.")
1033  endif ()
1034 
1035  if (NOT DEFINED _paraview_add_plugin_XML_DOCUMENTATION)
1036  set(_paraview_add_plugin_XML_DOCUMENTATION ON)
1037  endif ()
1038  if (DEFINED _paraview_add_plugin_DOCUMENTATION_DIR AND
1039  NOT _paraview_add_plugin_XML_DOCUMENTATION)
1040  message(FATAL_ERROR
1041  "Specifying `DOCUMENTATION_DIR` and turning off `XML_DOCUMENTATION` "
1042  "makes no sense.")
1043  endif ()
1044  if (_paraview_build_DISABLE_XML_DOCUMENTATION)
1045  set(_paraview_add_plugin_XML_DOCUMENTATION OFF)
1046  endif ()
1047 
1048  if (NOT DEFINED _paraview_add_plugin_FORCE_STATIC)
1049  set(_paraview_add_plugin_FORCE_STATIC OFF)
1050  endif ()
1051 
1052  if (DEFINED _paraview_add_plugin_EXPORT)
1053  message(FATAL_ERROR
1054  "The `paraview_add_plugin(EXPORT)` argument is ignored in favor of "
1055  "`paraview_plugin_build(INSTALL_EXPORT)`.")
1056  endif ()
1057 
1058  if (_paraview_add_plugin_MODULE_ARGS)
1059  if (NOT _paraview_add_plugin_MODULE_FILES OR
1060  NOT _paraview_add_plugin_MODULES)
1061  message(FATAL_ERROR
1062  "The `MODULE_ARGS` argument requires `MODULE_FILES` and `MODULES` to be provided.")
1063  endif ()
1064  endif ()
1065 
1066  if (_paraview_add_plugin_UI_INTERFACES OR _paraview_add_plugin_UI_FILES OR _paraview_add_plugin_UI_RESOURCES)
1067  if (NOT PARAVIEW_USE_QT)
1068  message(FATAL_ERROR "UI_INTERFACES, UI_FILES and UI_RESOURCES require ParaView to be built with Qt enabled.")
1069  endif()
1070  endif()
1071 
1072  if (DEFINED _paraview_build_INSTALL_EXPORT AND
1073  NOT DEFINED _paraview_add_plugin_MODULE_INSTALL_EXPORT)
1074  set(_paraview_add_plugin_MODULE_INSTALL_EXPORT
1075  "${name}")
1076  endif ()
1077 
1078  if (_paraview_add_plugin_MODULE_FILES)
1079  if (NOT _paraview_add_plugin_MODULES)
1080  message(FATAL_ERROR
1081  "The `MODULE_FILES` argument requires `MODULES` to be provided.")
1082  endif ()
1083 
1084  if (_paraview_build_ADD_INSTALL_RPATHS)
1085  if (APPLE)
1086  list(INSERT CMAKE_INSTALL_RPATH 0
1087  "@loader_path")
1088  elseif (UNIX)
1089  list(INSERT CMAKE_INSTALL_RPATH 0
1090  "$ORIGIN")
1091  endif ()
1092  endif ()
1093 
1094  set(_paraview_add_plugin_module_install_export_args)
1095  if (DEFINED _paraview_add_plugin_MODULE_INSTALL_EXPORT)
1096  list(APPEND _paraview_add_plugin_module_install_export_args
1097  INSTALL_EXPORT "${_paraview_add_plugin_MODULE_INSTALL_EXPORT}")
1098  if (DEFINED _paraview_build_TARGET)
1099  set_property(GLOBAL APPEND
1100  PROPERTY
1101  "paraview_plugin_${_paraview_build_TARGET}_required_exports" "${_paraview_add_plugin_MODULE_INSTALL_EXPORT}")
1102  endif ()
1103  endif ()
1104 
1105  vtk_module_scan(
1106  MODULE_FILES ${_paraview_add_plugin_MODULE_FILES}
1107  REQUEST_MODULES ${_paraview_add_plugin_MODULES}
1108  PROVIDES_MODULES plugin_modules
1109  REQUIRES_MODULES required_modules
1110  HIDE_MODULES_FROM_CACHE ON)
1111 
1112  if (required_modules)
1113  foreach (required_module IN LISTS required_modules)
1114  if (NOT TARGET "${required_module}")
1115  message(FATAL_ERROR
1116  "Failed to find the required module ${required_module}.")
1117  endif ()
1118  endforeach ()
1119  endif ()
1120 
1121  if (WIN32)
1122  set(_paraview_plugin_subdir "${_paraview_build_RUNTIME_DESTINATION}")
1123  else ()
1124  set(_paraview_plugin_subdir "${_paraview_build_LIBRARY_DESTINATION}")
1125  endif ()
1126  if (NOT _paraview_build_LIBRARY_SUBDIRECTORY STREQUAL "")
1127  string(APPEND _paraview_plugin_subdir "/${_paraview_build_LIBRARY_SUBDIRECTORY}")
1128  endif ()
1129  string(APPEND _paraview_plugin_subdir "/${_paraview_build_plugin}")
1130  set(_paraview_plugin_CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
1131  set(_paraview_plugin_CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
1132  set(_paraview_plugin_CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
1133  set(_paraview_plugin_CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_NAME_DIR}")
1134  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_paraview_plugin_subdir}")
1135  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_paraview_plugin_subdir}")
1136  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${_paraview_plugin_subdir}")
1137  set(CMAKE_INSTALL_NAME_DIR "@loader_path")
1138 
1139  vtk_module_build(
1140  MODULES ${plugin_modules}
1141  PACKAGE "${_paraview_build_plugin}"
1142  USE_FILE_SETS "${_paraview_build_USE_FILE_SETS}"
1143  ${_paraview_add_plugin_module_install_export_args}
1144  INSTALL_HEADERS "${_paraview_build_INSTALL_HEADERS}"
1145  TARGETS_COMPONENT "${_paraview_build_PLUGINS_COMPONENT}"
1146  HEADERS_DESTINATION "${_paraview_build_HEADERS_DESTINATION}/${_paraview_build_target_safe}"
1147  ARCHIVE_DESTINATION "${_paraview_plugin_subdir}"
1148  LIBRARY_DESTINATION "${_paraview_plugin_subdir}"
1149  RUNTIME_DESTINATION "${_paraview_plugin_subdir}"
1150  CMAKE_DESTINATION "${_paraview_build_CMAKE_DESTINATION}"
1151  ${_paraview_add_plugin_MODULE_ARGS}
1152  GENERATE_SPDX "${_paraview_build_GENERATE_SPDX}"
1153  SPDX_DOCUMENT_NAMESPACE "${_paraview_build_SPDX_DOCUMENT_NAMESPACE}"
1154  SPDX_DOWNLOAD_LOCATION "${_paraview_build_SPDX_DOWNLOAD_LOCATION}")
1155 
1156  set_property(GLOBAL APPEND
1157  PROPERTY
1158  "paraview_plugin_${_paraview_add_plugin_MODULE_INSTALL_EXPORT}_modules" "${plugin_modules}")
1159 
1160  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${_paraview_plugin_CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
1161  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${_paraview_plugin_CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
1162  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${_paraview_plugin_CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
1163  set(CMAKE_INSTALL_NAME_DIR "${_paraview_plugin_CMAKE_INSTALL_NAME_DIR}")
1164  unset(_paraview_plugin_CMAKE_RUNTIME_OUTPUT_DIRECTORY)
1165  unset(_paraview_plugin_CMAKE_LIBRARY_OUTPUT_DIRECTORY)
1166  unset(_paraview_plugin_CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
1167  unset(_paraview_plugin_CMAKE_INSTALL_NAME_DIR)
1168  endif ()
1169 
1170  # TODO: resource initialization for static builds
1171 
1172  if (_paraview_add_plugin_REQUIRED_ON_SERVER)
1173  set(_paraview_add_plugin_required_on_server "true")
1174  else ()
1175  set(_paraview_add_plugin_required_on_server "false")
1176  endif ()
1177 
1178  if (_paraview_add_plugin_REQUIRED_ON_CLIENT)
1179  set(_paraview_add_plugin_required_on_client "true")
1180  else ()
1181  set(_paraview_add_plugin_required_on_client "false")
1182  endif ()
1183 
1184  set(_paraview_add_plugin_export_args)
1185  set(_paraview_add_plugin_install_export_args)
1186  if (DEFINED _paraview_build_INSTALL_EXPORT)
1187  list(APPEND _paraview_add_plugin_export_args
1188  EXPORT "${_paraview_build_INSTALL_EXPORT}")
1189  list(APPEND _paraview_add_plugin_install_export_args
1190  INSTALL_EXPORT "${_paraview_build_INSTALL_EXPORT}")
1191  endif ()
1192 
1193  set(_paraview_add_plugin_includes)
1194  set(_paraview_add_plugin_required_libraries)
1195 
1196  if (_paraview_add_plugin_EXTRA_INCLUDES)
1197  foreach (_include IN LISTS _paraview_add_plugin_EXTRA_INCLUDES)
1198  if ((${_include} MATCHES "^\".*\"$") OR (${_include} MATCHES "^<.*>$"))
1199  string(APPEND _paraview_add_plugin_includes "#include ${_include}\n")
1200  else ()
1201  string(APPEND _paraview_add_plugin_includes "#include \"${_include}\"\n")
1202  endif ()
1203  endforeach ()
1204  endif ()
1205 
1206  set(_paraview_add_plugin_module_xmls)
1208  if (_paraview_add_plugin_MODULES)
1210 
1211  list(APPEND _paraview_add_plugin_required_libraries
1212  ${_paraview_add_plugin_MODULES})
1213 
1215  MODULES ${_paraview_add_plugin_MODULES}
1216  TARGET "${_paraview_build_plugin}_client_server"
1217  ${_paraview_add_plugin_install_export_args})
1218 
1219  if (NOT DEFINED _paraview_add_plugin_TRANSLATIONS_DIRECTORY)
1220  set(_paraview_add_plugin_TRANSLATIONS_DIRECTORY
1221  "${CMAKE_CURRENT_BINARY_DIR}/Translations")
1222  endif ()
1223  set(_paraview_add_plugin_translation_args)
1224  if (_paraview_add_plugin_TRANSLATIONS_DIRECTORY AND _paraview_add_plugin_TRANSLATIONS_TARGET)
1225  list(APPEND _paraview_add_plugin_translation_args
1226  TRANSLATIONS_DIRECTORY "${_paraview_add_plugin_TRANSLATIONS_DIRECTORY}")
1227  list(APPEND _paraview_add_plugin_translation_args
1228  TRANSLATIONS_TARGET "${_paraview_add_plugin_TRANSLATIONS_TARGET}")
1229  endif ()
1230 
1232  MODULES ${_paraview_add_plugin_MODULES}
1233  TARGET "${_paraview_build_plugin}_server_manager_modules"
1234  ${_paraview_add_plugin_install_export_args}
1235  XML_FILES _paraview_add_plugin_module_xmls
1236  ${_paraview_add_plugin_translation_args})
1237 
1238  list(APPEND _paraview_add_plugin_required_libraries
1239  "${_paraview_build_plugin}_client_server"
1240  "${_paraview_build_plugin}_server_manager_modules")
1241  endif ()
1242 
1243  set(_paraview_add_plugin_binary_resources "")
1244  set(_paraview_add_plugin_binary_headers)
1245  if (_paraview_add_plugin_SERVER_MANAGER_XML)
1247 
1248  set(_paraview_add_plugin_xmls)
1249  foreach (_paraview_add_plugin_xml IN LISTS _paraview_add_plugin_SERVER_MANAGER_XML)
1250  if (NOT IS_ABSOLUTE "${_paraview_add_plugin_xml}")
1251  set(_paraview_add_plugin_xml "${CMAKE_CURRENT_SOURCE_DIR}/${_paraview_add_plugin_xml}")
1252  endif ()
1253 
1254  list(APPEND _paraview_add_plugin_xmls
1255  "${_paraview_add_plugin_xml}")
1256  endforeach ()
1257 
1259  TARGET "${_paraview_build_plugin}_server_manager"
1260  ${_paraview_add_plugin_install_export_args}
1261  FILES ${_paraview_add_plugin_xmls})
1262  list(APPEND _paraview_add_plugin_required_libraries
1263  "${_paraview_build_plugin}_server_manager")
1264  endif ()
1265 
1266  if ((_paraview_add_plugin_module_xmls OR _paraview_add_plugin_xmls) AND
1267  PARAVIEW_USE_QT AND _paraview_add_plugin_XML_DOCUMENTATION)
1268 
1269  if (PARAVIEW_QT_MAJOR_VERSION VERSION_GREATER "5")
1270  # see https://gitlab.kitware.com/paraview/paraview/-/issues/19742
1271  if (NOT DEFINED ENV{CI})
1272  message(AUTHOR_WARNING "Building the plugin documentation with Qt6 is not supported")
1273  endif ()
1274  else ()
1275 
1276  set(_paraview_build_plugin_docdir
1277  "${CMAKE_CURRENT_BINARY_DIR}/paraview_help")
1278 
1280  TARGET "${_paraview_build_plugin}_doc"
1281  OUTPUT_DIR "${_paraview_build_plugin_docdir}"
1282  XMLS ${_paraview_add_plugin_module_xmls}
1283  ${_paraview_add_plugin_xmls})
1284 
1285  set(_paraview_build_plugin_doc_source_args)
1286  if (DEFINED _paraview_add_plugin_DOCUMENTATION_DIR)
1287  list(APPEND _paraview_build_plugin_doc_source_args
1288  SOURCE_DIR "${_paraview_add_plugin_DOCUMENTATION_DIR}")
1289  endif ()
1290 
1292  NAME "${_paraview_build_plugin}"
1293  OUTPUT_PATH _paraview_build_plugin_qch_path
1294  OUTPUT_DIR "${_paraview_build_plugin_docdir}"
1295  TARGET "${_paraview_build_plugin}_qch"
1296  ${_paraview_build_plugin_doc_source_args}
1297  TABLE_OF_CONTENTS "${_paraview_add_plugin_DOCUMENTATION_TOC}"
1298  DEPENDS "${_paraview_build_plugin}_doc"
1299  "${_paraview_add_plugin_DOCUMENTATION_DEPENDENCIES}"
1300  PATTERNS "*.html" "*.css" "*.png" "*.jpg" "*.js"
1301  ${_paraview_add_plugin_DOCUMENTATION_ADD_PATTERNS})
1302 
1303  set(_paraview_add_plugin_depends_args)
1304  if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.27")
1305  list(APPEND _paraview_add_plugin_depends_args
1306  DEPENDS_EXPLICIT_ONLY)
1307  endif ()
1308 
1309  list(APPEND _paraview_add_plugin_extra_include_dirs
1310  "${CMAKE_CURRENT_BINARY_DIR}")
1311  set(_paraview_add_plugin_qch_output
1312  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_build_plugin}_qch.h")
1313  list(APPEND _paraview_add_plugin_binary_headers
1314  "${_paraview_add_plugin_qch_output}")
1315  add_custom_command(
1316  OUTPUT "${_paraview_add_plugin_qch_output}"
1317  COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR}
1318  "$<TARGET_FILE:ParaView::ProcessXML>"
1319  -base64
1320  "${_paraview_add_plugin_qch_output}"
1321  \"\"
1322  "_qch"
1323  "_qch"
1324  "${_paraview_build_plugin_qch_path}"
1325  DEPENDS "${_paraview_build_plugin_qch_path}"
1326  "${_paraview_build_plugin}_qch"
1327  "$<TARGET_FILE:ParaView::ProcessXML>"
1328  COMMENT "Generating header for ${_paraview_build_plugin} documentation"
1329  ${_paraview_add_plugin_depends_args})
1330  set_property(SOURCE "${_paraview_add_plugin_qch_output}"
1331  PROPERTY
1332  SKIP_AUTOMOC 1)
1333 
1334  string(APPEND _paraview_add_plugin_includes
1335  "#include \"${_paraview_build_plugin}_qch.h\"\n")
1336  string(APPEND _paraview_add_plugin_binary_resources
1337  " {
1338  const char *text = ${_paraview_build_plugin}_qch();
1339  resources.emplace_back(text);
1340  delete [] text;
1341  }\n")
1342  endif ()
1343  endif ()
1344 
1345  set(_paraview_add_plugin_eula_sources)
1346  if (_paraview_add_plugin_EULA)
1347  vtk_encode_string(
1348  INPUT "${_paraview_add_plugin_EULA}"
1349  NAME "${_paraview_build_plugin}_EULA"
1350  HEADER_OUTPUT _paraview_add_plugin_eula_header
1351  SOURCE_OUTPUT _paraview_add_plugin_eula_source)
1352  list(APPEND _paraview_add_plugin_eula_sources
1353  "${_paraview_add_plugin_eula_header}"
1354  "${_paraview_add_plugin_eula_source}")
1355  endif ()
1356 
1358  set(_paraview_add_plugin_ui_sources)
1359  if (_paraview_add_plugin_UI_INTERFACES)
1361  set(CMAKE_AUTOMOC 1)
1362  set(_paraview_add_plugin_push_back_interfaces
1363  "#define PARAVIEW_ADD_INTERFACES(arg) \\\n")
1364  set(_paraview_add_plugin_include_interfaces "")
1365 
1366  foreach (_paraview_add_plugin_ui_interface IN LISTS _paraview_add_plugin_UI_INTERFACES)
1367  string(APPEND _paraview_add_plugin_push_back_interfaces
1368  " (arg).push_back(new ${_paraview_add_plugin_ui_interface}(this)); \\\n")
1369  string(APPEND _paraview_add_plugin_include_interfaces
1370  "#include \"${_paraview_add_plugin_ui_interface}.h\"\n")
1371  endforeach ()
1372  list(APPEND _paraview_add_plugin_required_libraries
1373  ParaView::pqComponents)
1374  endif ()
1375 
1377  if (_paraview_add_plugin_INITIALIZERS)
1379  set(_paraview_add_plugin_invoke_initializers)
1380 
1381  foreach (_paraview_add_plugin_initializer IN LISTS _paraview_add_plugin_INITIALIZERS)
1382  string(APPEND _paraview_add_plugin_invoke_initializers
1383  " ${_paraview_add_plugin_initializer}();\n")
1384  endforeach ()
1385  endif ()
1386 
1387  set(_paraview_add_plugin_with_resources 0)
1388  set(_paraview_add_plugin_resources_init)
1389  if (_paraview_add_plugin_UI_RESOURCES)
1390  set(_paraview_add_plugin_with_resources 1)
1391  set(CMAKE_AUTORCC 1)
1392  if (NOT BUILD_SHARED_LIBS OR _paraview_add_plugin_FORCE_STATIC)
1393  foreach (_paraview_add_plugin_ui_resource IN LISTS _paraview_add_plugin_UI_RESOURCES)
1394  get_filename_component(_paraview_add_plugin_ui_resource_base "${_paraview_add_plugin_ui_resource}" NAME_WE)
1395  string(APPEND _paraview_add_plugin_resources_init
1396  " Q_INIT_RESOURCE(${_paraview_add_plugin_ui_resource_base});\n")
1397  endforeach ()
1398  endif ()
1399  list(APPEND _paraview_add_plugin_ui_sources
1400  ${_paraview_add_plugin_UI_RESOURCES})
1401  endif ()
1402 
1403  set(_paraview_add_plugin_qt_extra_components)
1404  if (_paraview_add_plugin_UI_FILES)
1406  set(CMAKE_AUTOUIC 1)
1407  list(APPEND _paraview_add_plugin_qt_extra_components
1408  Widgets)
1409  list(APPEND _paraview_add_plugin_required_libraries
1410  "Qt${PARAVIEW_QT_MAJOR_VERSION}::Widgets")
1411  list(APPEND _paraview_add_plugin_ui_sources
1412  ${_paraview_add_plugin_UI_FILES})
1413  endif ()
1414 
1415  if (_paraview_add_plugin_with_ui OR _paraview_add_plugin_with_resources)
1416  include("${_ParaViewPlugin_cmake_dir}/paraview-find-package-helpers.cmake" OPTIONAL)
1417  find_package("Qt${PARAVIEW_QT_MAJOR_VERSION}" QUIET REQUIRED COMPONENTS Core ${_paraview_add_plugin_qt_extra_components})
1418  list(APPEND _paraview_add_plugin_required_libraries
1419  "Qt${PARAVIEW_QT_MAJOR_VERSION}::Core")
1421  list(APPEND _paraview_add_plugin_required_libraries
1422  ParaView::pqCore)
1423  endif ()
1424 
1425  # CMake 3.13 started using Qt5's version variables to detect what version
1426  # of Qt's tools to run for automoc, autouic, and autorcc. However, they are
1427  # looked up using the target's directory scope, but these are here in a
1428  # local scope and unset when AutoGen gets around to asking about the
1429  # variables at generate time.
1430 
1431  # Fix for 3.13.0–3.13.3. Does not work if `paraview_add_plugin` is called
1432  # from another function.
1433  set("Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MAJOR" "${Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MAJOR}" PARENT_SCOPE)
1434  set("Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MINOR" "${Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MINOR}" PARENT_SCOPE)
1435  # Fix for 3.13.4+.
1436  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
1437  PROPERTY
1438  "Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MAJOR" "${Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MAJOR}")
1439  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
1440  PROPERTY
1441  "Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MINOR" "${Qt${PARAVIEW_QT_MAJOR_VERSION}Core_VERSION_MAJOR}")
1442  endif ()
1443 
1445  set(_paraview_add_plugin_python_sources)
1446  set(_paraview_add_plugin_python_includes)
1447  set(_paraview_add_plugin_python_modules)
1448  set(_paraview_add_plugin_python_module_sources)
1449  set(_paraview_add_plugin_python_package_flags)
1450  if (_paraview_add_plugin_PYTHON_MODULES)
1452  foreach (_paraview_add_plugin_python_module IN LISTS _paraview_add_plugin_PYTHON_MODULES)
1453  set(_paraview_add_plugin_python_path
1454  "${CMAKE_CURRENT_SOURCE_DIR}/${_paraview_add_plugin_python_module}")
1455  get_filename_component(_paraview_add_plugin_python_package "${_paraview_add_plugin_python_module}" PATH)
1456  get_filename_component(_paraview_add_plugin_python_name "${_paraview_add_plugin_python_module}" NAME_WE)
1457  if (_paraview_add_plugin_python_package)
1458  set(_paraview_add_plugin_python_full_name
1459  "${_paraview_add_plugin_python_package}.${_paraview_add_plugin_python_name}")
1460  else ()
1461  set(_paraview_add_plugin_python_full_name
1462  "${_paraview_add_plugin_python_name}")
1463  endif ()
1464  string(REPLACE "." "_" _paraview_add_plugin_python_module_mangled "${_paraview_add_plugin_python_full_name}")
1465  set(_paraview_add_plugin_python_is_package 0)
1466  set(_paraview_add_plugin_python_import
1467  "${_paraview_add_plugin_python_full_name}")
1468  if (_paraview_add_plugin_python_name STREQUAL "__init__")
1469  set(_paraview_add_plugin_python_is_package 1)
1470  set(_paraview_add_plugin_python_import
1471  "${_paraview_add_plugin_python_package}")
1472  endif ()
1473  set(_paraview_add_plugin_python_header_name
1474  "WrappedPython_${_paraview_build_plugin}_${_paraview_add_plugin_python_module_mangled}.h")
1475  set(_paraview_add_plugin_python_header
1476  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_add_plugin_python_header_name}")
1477 
1478  set(_paraview_add_plugin_python_depends_args)
1479  if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.27")
1480  list(APPEND _paraview_add_plugin_python_depends_args
1481  DEPENDS_EXPLICIT_ONLY)
1482  endif ()
1483 
1484  add_custom_command(
1485  OUTPUT "${_paraview_add_plugin_python_header}"
1486  COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR}
1487  "$<TARGET_FILE:ParaView::ProcessXML>"
1488  "${_paraview_add_plugin_python_header}"
1489  "module_${_paraview_add_plugin_python_module_mangled}_"
1490  "_string"
1491  "_source"
1492  "${_paraview_add_plugin_python_path}"
1493  DEPENDS "${_paraview_add_plugin_python_path}"
1494  "$<TARGET_FILE:ParaView::ProcessXML>"
1495  COMMENT "Convert Python module ${_paraview_add_plugin_python_module_name} for ${_paraview_build_plugin}"
1496  ${_paraview_add_plugin_python_depends_args})
1497 
1498  list(APPEND _paraview_add_plugin_python_sources
1499  "${_paraview_add_plugin_python_header}")
1500  string(APPEND _paraview_add_plugin_python_includes
1501  "#include \"${_paraview_add_plugin_python_header_name}\"\n")
1502  string(APPEND _paraview_add_plugin_python_modules
1503  " \"${_paraview_add_plugin_python_import}\",\n")
1504  string(APPEND _paraview_add_plugin_python_module_sources
1505  " module_${_paraview_add_plugin_python_module_mangled}_${_paraview_add_plugin_python_name}_source(),\n")
1506  string(APPEND _paraview_add_plugin_python_package_flags
1507  " ${_paraview_add_plugin_python_is_package},\n")
1508  endforeach ()
1509 
1510  # Add terminators to the list.
1511  string(APPEND _paraview_add_plugin_python_modules
1512  " nullptr")
1513  string(APPEND _paraview_add_plugin_python_module_sources
1514  " nullptr")
1515  string(APPEND _paraview_add_plugin_python_package_flags
1516  " -1")
1517  endif ()
1518 
1519  set(_paraview_add_plugin_header
1520  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_build_plugin}Plugin.h")
1521  set(_paraview_add_plugin_source
1522  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_build_plugin}Plugin.cxx")
1523 
1524  get_property(_paraview_add_plugin_description GLOBAL
1525  PROPERTY "_paraview_plugin_${_paraview_build_plugin}_description")
1526 
1527  set(_paraview_build_plugin_type MODULE)
1529  if (NOT BUILD_SHARED_LIBS OR _paraview_add_plugin_FORCE_STATIC)
1530  set(_paraview_build_plugin_type STATIC)
1532  endif ()
1533 
1534  configure_file(
1535  "${_paraview_plugin_source_dir}/paraview_plugin.h.in"
1536  "${_paraview_add_plugin_header}")
1537  configure_file(
1538  "${_paraview_plugin_source_dir}/paraview_plugin.cxx.in"
1539  "${_paraview_add_plugin_source}")
1540 
1541  if (WIN32)
1542  # On Windows, we want `MODULE` libraries to go to the runtime directory,
1543  # but CMake always uses `CMAKE_LIBRARY_OUTPUT_DIRECTORY`.
1544  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
1545  endif ()
1546  if (NOT _paraview_build_LIBRARY_SUBDIRECTORY STREQUAL "")
1547  string(APPEND CMAKE_LIBRARY_OUTPUT_DIRECTORY "/${_paraview_build_LIBRARY_SUBDIRECTORY}")
1548  endif ()
1549  string(APPEND CMAKE_LIBRARY_OUTPUT_DIRECTORY "/${_paraview_build_plugin}")
1550 
1551  # Place static plugins in the same place they would be if they were shared.
1552  if (NOT _paraview_build_LIBRARY_SUBDIRECTORY STREQUAL "")
1553  string(APPEND CMAKE_ARCHIVE_OUTPUT_DIRECTORY "/${_paraview_build_LIBRARY_SUBDIRECTORY}")
1554  endif ()
1555  string(APPEND CMAKE_ARCHIVE_OUTPUT_DIRECTORY "/${_paraview_build_plugin}")
1556 
1557  add_library("${_paraview_build_plugin}" "${_paraview_build_plugin_type}")
1558  target_sources("${_paraview_build_plugin}"
1559  PRIVATE
1560  ${_paraview_add_plugin_source}
1561  ${_paraview_add_plugin_eula_sources}
1562  ${_paraview_add_plugin_ui_sources}
1563  ${_paraview_add_plugin_python_sources}
1564  ${_paraview_add_plugin_SOURCES})
1565  # Forward the file set option internally.
1566  set(_vtk_build_USE_FILE_SETS "${_paraview_build_USE_FILE_SETS}")
1567  _vtk_module_add_file_set("${_paraview_build_plugin}"
1568  NAME paraview_plugin_headers
1569  VIS PRIVATE
1570  BASE_DIRS "${CMAKE_CURRENT_BINARY_DIR}"
1571  FILES ${_paraview_add_plugin_header}
1572  ${_paraview_add_plugin_binary_headers})
1573  if (NOT BUILD_SHARED_LIBS OR _paraview_add_plugin_FORCE_STATIC)
1574  target_compile_definitions("${_paraview_build_plugin}"
1575  PRIVATE
1576  QT_STATICPLUGIN)
1577  endif ()
1578  target_link_libraries("${_paraview_build_plugin}"
1579  PRIVATE
1580  ParaView::RemotingCore
1581  ${_paraview_add_plugin_required_libraries})
1582  target_include_directories("${_paraview_build_plugin}"
1583  PRIVATE
1584  "${CMAKE_CURRENT_SOURCE_DIR}"
1585  ${_paraview_add_plugin_extra_include_dirs})
1586  set_property(TARGET "${_paraview_build_plugin}"
1587  PROPERTY
1588  PREFIX "")
1589 
1590  set(_paraview_add_plugin_destination
1591  "${_paraview_build_plugin_destination}/${_paraview_build_plugin}")
1592  install(
1593  TARGETS "${_paraview_build_plugin}"
1594  ${_paraview_add_plugin_export_args}
1595  COMPONENT "${_paraview_build_PLUGINS_COMPONENT}"
1596  ARCHIVE DESTINATION "${_paraview_add_plugin_destination}"
1597  LIBRARY DESTINATION "${_paraview_add_plugin_destination}")
1598 endfunction ()
1599 
1600 #[==[.md
1601 ## Plugin interfaces
1602 
1603 ParaView plugins may satisfy a number of interfaces. These functions all take a
1604 `INTERFACES` argument which takes the name of a variable to set with the name
1605 of the interface generated. This variable's should be passed to
1606 `paraview_add_plugin`'s `UI_INTERFACES` argument.
1607 #]==]
1608 
1609 #[==[.md
1610 ### Property widget
1611 
1612 TODO: What is a property widget?
1613 
1614 ```
1616  KIND <WIDGET|GROUP_WIDGET|WIDGET_DECORATOR>
1617  TYPE <type>
1618  CLASS_NAME <name>
1619  INTERFACES <variable>
1620  SOURCES <variable>)
1621 ```
1622 
1623  * `KIND`: The kind of widget represented.
1624  * `TYPE`: The name of the property type.
1625  * `CLASS_NAME`: The name of the property widget class.
1626  * `INTERFACES`: The name of the generated interface.
1627  * `SOURCES`: The source files generated by the interface.
1628 #]==]
1630  cmake_parse_arguments(_paraview_property_widget
1631  ""
1632  "KIND;TYPE;CLASS_NAME;INTERFACES;SOURCES"
1633  ""
1634  ${ARGN})
1635 
1636  if (_paraview_property_widget_UNPARSED_ARGUMENTS)
1637  message(FATAL_ERROR
1638  "Unparsed arguments for paraview_plugin_add_property_widget: "
1639  "${_paraview_property_widget_UNPARSED_ARGUMENTS}")
1640  endif ()
1641 
1642  set(_paraview_property_widget_kind_widget 0)
1643  set(_paraview_property_widget_kind_group_widget 0)
1644  set(_paraview_property_widget_kind_widget_decorator 0)
1645  if (_paraview_property_widget_KIND STREQUAL "WIDGET")
1646  set(_paraview_property_widget_kind_widget 1)
1647  elseif (_paraview_property_widget_KIND STREQUAL "GROUP_WIDGET")
1648  set(_paraview_property_widget_kind_group_widget 1)
1649  elseif (_paraview_property_widget_KIND STREQUAL "WIDGET_DECORATOR")
1650  set(_paraview_property_widget_kind_widget_decorator 1)
1651  else ()
1652  message(FATAL_ERROR
1653  "The `KIND` argument must be one of `WIDGET`, `GROUP_WIDGET`, or "
1654  "`WIDGET_DECORATOR`.")
1655  endif ()
1656 
1657  if (NOT DEFINED _paraview_property_widget_TYPE)
1658  message(FATAL_ERROR
1659  "The `TYPE` argument is required.")
1660  endif ()
1661 
1662  if (NOT DEFINED _paraview_property_widget_CLASS_NAME)
1663  message(FATAL_ERROR
1664  "The `CLASS_NAME` argument is required.")
1665  endif ()
1666 
1667  if (NOT DEFINED _paraview_property_widget_INTERFACES)
1668  message(FATAL_ERROR
1669  "The `INTERFACES` argument is required.")
1670  endif ()
1671 
1672  if (NOT DEFINED _paraview_property_widget_SOURCES)
1673  message(FATAL_ERROR
1674  "The `SOURCES` argument is required.")
1675  endif ()
1676 
1677  configure_file(
1678  "${_ParaViewPlugin_cmake_dir}/pqPropertyWidgetInterface.h.in"
1679  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_property_widget_CLASS_NAME}PWIImplementation.h"
1680  @ONLY)
1681  configure_file(
1682  "${_ParaViewPlugin_cmake_dir}/pqPropertyWidgetInterface.cxx.in"
1683  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_property_widget_CLASS_NAME}PWIImplementation.cxx"
1684  @ONLY)
1685 
1686  set("${_paraview_property_widget_INTERFACES}"
1687  "${_paraview_property_widget_CLASS_NAME}PWIImplementation"
1688  PARENT_SCOPE)
1689 
1690  set("${_paraview_property_widget_SOURCES}"
1691  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_property_widget_CLASS_NAME}PWIImplementation.cxx"
1692  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_property_widget_CLASS_NAME}PWIImplementation.h"
1693  PARENT_SCOPE)
1694 endfunction ()
1695 
1696 #[==[.md
1697 ### Dock window
1698 
1699 TODO: What is a dock window?
1700 
1701 ```
1703  CLASS_NAME <name>
1704  [DOCK_AREA <Right|Left|Top|Bottom>]
1705  INTERFACES <variable>
1706  SOURCES <variable>)
1707 ```
1708 
1709  * `CLASS_NAME`: The name of the dock window class.
1710  * `DOCK_AREA`: (Default `Left`) Where to dock the window within the
1711  application.
1712  * `INTERFACES`: The name of the generated interface.
1713  * `SOURCES`: The source files generated by the interface.
1714 #]==]
1716  cmake_parse_arguments(_paraview_dock_window
1717  ""
1718  "DOCK_AREA;CLASS_NAME;INTERFACES;SOURCES"
1719  ""
1720  ${ARGN})
1721 
1722  if (_paraview_dock_window_UNPARSED_ARGUMENTS)
1723  message(FATAL_ERROR
1724  "Unparsed arguments for paraview_plugin_add_dock_window: "
1725  "${_paraview_dock_window_UNPARSED_ARGUMENTS}")
1726  endif ()
1727 
1728  if (NOT DEFINED _paraview_dock_window_CLASS_NAME)
1729  message(FATAL_ERROR
1730  "The `CLASS_NAME` argument is required.")
1731  endif ()
1732 
1733  if (NOT DEFINED _paraview_dock_window_INTERFACES)
1734  message(FATAL_ERROR
1735  "The `INTERFACES` argument is required.")
1736  endif ()
1737 
1738  if (NOT DEFINED _paraview_dock_window_SOURCES)
1739  message(FATAL_ERROR
1740  "The `SOURCES` argument is required.")
1741  endif ()
1742 
1743  if (NOT DEFINED _paraview_dock_window_DOCK_AREA)
1744  set(_paraview_dock_window_DOCK_AREA "Left")
1745  endif ()
1746 
1747  if (NOT _paraview_dock_window_DOCK_AREA STREQUAL "Left" AND
1748  NOT _paraview_dock_window_DOCK_AREA STREQUAL "Right" AND
1749  NOT _paraview_dock_window_DOCK_AREA STREQUAL "Top" AND
1750  NOT _paraview_dock_window_DOCK_AREA STREQUAL "Bottom")
1751  message(FATAL_ERROR
1752  "`DOCK_AREA` must be one of `Left`, `Right`, `Top`, or `Bottom`. Got "
1753  "`${_paraview_dock_window_DOCK_AREA}`.")
1754  endif ()
1755 
1756  configure_file(
1757  "${_ParaViewPlugin_cmake_dir}/pqDockWindowImplementation.h.in"
1758  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_dock_window_CLASS_NAME}Implementation.h"
1759  @ONLY)
1760  configure_file(
1761  "${_ParaViewPlugin_cmake_dir}/pqDockWindowImplementation.cxx.in"
1762  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_dock_window_CLASS_NAME}Implementation.cxx"
1763  @ONLY)
1764 
1765  set("${_paraview_dock_window_INTERFACES}"
1766  "${_paraview_dock_window_CLASS_NAME}Implementation"
1767  PARENT_SCOPE)
1768 
1769  set("${_paraview_dock_window_SOURCES}"
1770  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_dock_window_CLASS_NAME}Implementation.cxx"
1771  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_dock_window_CLASS_NAME}Implementation.h"
1772  PARENT_SCOPE)
1773 endfunction ()
1774 
1775 #[==[.md
1776 ### Action group
1777 
1778 TODO: What is an action group?
1779 
1780 ```
1782  CLASS_NAME <name>
1783  GROUP_NAME <name>
1784  INTERFACES <variable>
1785  SOURCES <variable>)
1786 ```
1787 
1788  * `CLASS_NAME`: The name of the action group class.
1789  * `GROUP_NAME`: The name of the action group.
1790  * `INTERFACES`: The name of the generated interface.
1791  * `SOURCES`: The source files generated by the interface.
1792 #]==]
1794  cmake_parse_arguments(_paraview_action_group
1795  ""
1796  "CLASS_NAME;GROUP_NAME;INTERFACES;SOURCES"
1797  ""
1798  ${ARGN})
1799 
1800  if (_paraview_action_group_UNPARSED_ARGUMENTS)
1801  message(FATAL_ERROR
1802  "Unparsed arguments for paraview_plugin_add_action_group: "
1803  "${_paraview_action_group_UNPARSED_ARGUMENTS}")
1804  endif ()
1805 
1806  if (NOT DEFINED _paraview_action_group_CLASS_NAME)
1807  message(FATAL_ERROR
1808  "The `CLASS_NAME` argument is required.")
1809  endif ()
1810 
1811  if (NOT DEFINED _paraview_action_group_GROUP_NAME)
1812  message(FATAL_ERROR
1813  "The `GROUP_NAME` argument is required.")
1814  endif ()
1815 
1816  if (NOT DEFINED _paraview_action_group_INTERFACES)
1817  message(FATAL_ERROR
1818  "The `INTERFACES` argument is required.")
1819  endif ()
1820 
1821  if (NOT DEFINED _paraview_action_group_SOURCES)
1822  message(FATAL_ERROR
1823  "The `SOURCES` argument is required.")
1824  endif ()
1825 
1826  configure_file(
1827  "${_ParaViewPlugin_cmake_dir}/pqActionGroupImplementation.h.in"
1828  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_action_group_CLASS_NAME}Implementation.h"
1829  @ONLY)
1830  configure_file(
1831  "${_ParaViewPlugin_cmake_dir}/pqActionGroupImplementation.cxx.in"
1832  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_action_group_CLASS_NAME}Implementation.cxx"
1833  @ONLY)
1834 
1835  set("${_paraview_action_group_INTERFACES}"
1836  "${_paraview_action_group_CLASS_NAME}Implementation"
1837  PARENT_SCOPE)
1838 
1839  set("${_paraview_action_group_SOURCES}"
1840  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_action_group_CLASS_NAME}Implementation.cxx"
1841  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_action_group_CLASS_NAME}Implementation.h"
1842  PARENT_SCOPE)
1843 endfunction ()
1844 
1845 #[==[.md
1846 ### Toolbar
1847 
1848 TODO: What is a toolbar?
1849 
1850 ```
1852  CLASS_NAME <name>
1853  INTERFACES <variable>
1854  SOURCES <variable>)
1855 ```
1856 
1857  * `CLASS_NAME`: The name of the toolbar class.
1858  * `INTERFACES`: The name of the generated interface.
1859  * `SOURCES`: The source files generated by the interface.
1860 #]==]
1862  cmake_parse_arguments(_paraview_toolbar
1863  ""
1864  "CLASS_NAME;INTERFACES;SOURCES"
1865  ""
1866  ${ARGN})
1867 
1868  if (_paraview_toolbar_UNPARSED_ARGUMENTS)
1869  message(FATAL_ERROR
1870  "Unparsed arguments for paraview_plugin_add_toolbar: "
1871  "${_paraview_toolbar_UNPARSED_ARGUMENTS}")
1872  endif ()
1873 
1874  if (NOT DEFINED _paraview_toolbar_CLASS_NAME)
1875  message(FATAL_ERROR
1876  "The `CLASS_NAME` argument is required.")
1877  endif ()
1878 
1879  if (NOT DEFINED _paraview_toolbar_INTERFACES)
1880  message(FATAL_ERROR
1881  "The `INTERFACES` argument is required.")
1882  endif ()
1883 
1884  if (NOT DEFINED _paraview_toolbar_SOURCES)
1885  message(FATAL_ERROR
1886  "The `SOURCES` argument is required.")
1887  endif ()
1888 
1889  configure_file(
1890  "${_ParaViewPlugin_cmake_dir}/pqToolBarImplementation.h.in"
1891  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_toolbar_CLASS_NAME}Implementation.h"
1892  @ONLY)
1893  configure_file(
1894  "${_ParaViewPlugin_cmake_dir}/pqToolBarImplementation.cxx.in"
1895  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_toolbar_CLASS_NAME}Implementation.cxx"
1896  @ONLY)
1897 
1898  set("${_paraview_toolbar_INTERFACES}"
1899  "${_paraview_toolbar_CLASS_NAME}Implementation"
1900  PARENT_SCOPE)
1901 
1902  set("${_paraview_toolbar_SOURCES}"
1903  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_toolbar_CLASS_NAME}Implementation.cxx"
1904  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_toolbar_CLASS_NAME}Implementation.h"
1905  PARENT_SCOPE)
1906 endfunction ()
1907 
1908 #[==[.md
1909 ### Auto start
1910 
1911 TODO: What is an auto start?
1912 
1913 ```
1915  CLASS_NAME <name>
1916  [STARTUP <function>]
1917  [SHUTDOWN <function>]
1918  INTERFACES <variable>
1919  SOURCES <variable>)
1920 ```
1921 
1922  * `CLASS_NAME`: The name of the auto start class.
1923  * `STARTUP`: (Defaults to `startup`) The name of the method to call on
1924  startup.
1925  * `SHUTDOWN`: (Defaults to `shutdown`) The name of the method to call on
1926  shutdown.
1927  * `INTERFACES`: The name of the generated interface.
1928  * `SOURCES`: The source files generated by the interface.
1929 #]==]
1931  cmake_parse_arguments(_paraview_auto_start
1932  ""
1933  "CLASS_NAME;INTERFACES;SOURCES;STARTUP;SHUTDOWN"
1934  ""
1935  ${ARGN})
1936 
1937  if (_paraview_auto_start_UNPARSED_ARGUMENTS)
1938  message(FATAL_ERROR
1939  "Unparsed arguments for paraview_plugin_add_auto_start: "
1940  "${_paraview_auto_start_UNPARSED_ARGUMENTS}")
1941  endif ()
1942 
1943  if (NOT DEFINED _paraview_auto_start_CLASS_NAME)
1944  message(FATAL_ERROR
1945  "The `CLASS_NAME` argument is required.")
1946  endif ()
1947 
1948  if (NOT DEFINED _paraview_auto_start_INTERFACES)
1949  message(FATAL_ERROR
1950  "The `INTERFACES` argument is required.")
1951  endif ()
1952 
1953  if (NOT DEFINED _paraview_auto_start_SOURCES)
1954  message(FATAL_ERROR
1955  "The `SOURCES` argument is required.")
1956  endif ()
1957 
1958  if (NOT DEFINED _paraview_auto_start_STARTUP)
1959  set(_paraview_auto_start_STARTUP "startup")
1960  endif ()
1961 
1962  if (NOT DEFINED _paraview_auto_start_SHUTDOWN)
1963  set(_paraview_auto_start_SHUTDOWN "shutdown")
1964  endif ()
1965 
1966  configure_file(
1967  "${_ParaViewPlugin_cmake_dir}/pqAutoStartImplementation.h.in"
1968  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_auto_start_CLASS_NAME}Implementation.h"
1969  @ONLY)
1970  configure_file(
1971  "${_ParaViewPlugin_cmake_dir}/pqAutoStartImplementation.cxx.in"
1972  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_auto_start_CLASS_NAME}Implementation.cxx"
1973  @ONLY)
1974 
1975  set("${_paraview_auto_start_INTERFACES}"
1976  "${_paraview_auto_start_CLASS_NAME}Implementation"
1977  PARENT_SCOPE)
1978 
1979  set("${_paraview_auto_start_SOURCES}"
1980  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_auto_start_CLASS_NAME}Implementation.cxx"
1981  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_auto_start_CLASS_NAME}Implementation.h"
1982  PARENT_SCOPE)
1983 endfunction ()
1984 
1985 #[==[.md
1986 ### Location
1987 
1988 The filesystem location of dynamically-loaded plugin.
1989 
1990 ```
1992  CLASS_NAME <name>
1993  [STORE <function>]
1994  INTERFACES <variable>
1995  SOURCES <variable>)
1996 ```
1997 
1998  * `CLASS_NAME`: The name of the location class.
1999  * `STORE`: (Defaults to `StoreLocation`) The name of the method to call on
2000  startup, passing in the plugin location (const char*).
2001  * `INTERFACES`: The name of the generated interface.
2002  * `SOURCES`: The source files generated by the interface.
2003 #]==]
2005  cmake_parse_arguments(_paraview_location
2006  ""
2007  "CLASS_NAME;INTERFACES;SOURCES;STORE"
2008  ""
2009  ${ARGN})
2010 
2011  if (_paraview_location_UNPARSED_ARGUMENTS)
2012  message(FATAL_ERROR
2013  "Unparsed arguments for paraview_plugin_add_location: "
2014  "${_paraview_location_UNPARSED_ARGUMENTS}")
2015  endif ()
2016 
2017  if (NOT DEFINED _paraview_location_CLASS_NAME)
2018  message(FATAL_ERROR
2019  "The `CLASS_NAME` argument is required.")
2020  endif ()
2021 
2022  if (NOT DEFINED _paraview_location_INTERFACES)
2023  message(FATAL_ERROR
2024  "The `INTERFACES` argument is required.")
2025  endif ()
2026 
2027  if (NOT DEFINED _paraview_location_SOURCES)
2028  message(FATAL_ERROR
2029  "The `SOURCES` argument is required.")
2030  endif ()
2031 
2032  if (NOT DEFINED _paraview_location_STORE)
2033  set(_paraview_location_STORE "StoreLocation")
2034  endif ()
2035 
2036  configure_file(
2037  "${_ParaViewPlugin_cmake_dir}/pqPluginLocationImplementation.h.in"
2038  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_location_CLASS_NAME}Implementation.h"
2039  @ONLY)
2040  configure_file(
2041  "${_ParaViewPlugin_cmake_dir}/pqPluginLocationImplementation.cxx.in"
2042  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_location_CLASS_NAME}Implementation.cxx"
2043  @ONLY)
2044 
2045  set("${_paraview_location_INTERFACES}"
2046  "${_paraview_location_CLASS_NAME}Implementation"
2047  PARENT_SCOPE)
2048 
2049  set("${_paraview_location_SOURCES}"
2050  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_location_CLASS_NAME}Implementation.cxx"
2051  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_location_CLASS_NAME}Implementation.h"
2052  PARENT_SCOPE)
2053 endfunction ()
2054 
2055 #[==[.md
2056 ### Tree layout strategy
2057 
2058 TODO: What is a tree layout strategy?
2059 
2060 ```
2062  STRATEGY_TYPE <type>
2063  STRATEGY_LABEL <label>
2064  INTERFACES <variable>
2065  SOURCES <variable>)
2066 ```
2067 
2068  * `STRATEGY_TYPE`: The name of the tree layout strategy class.
2069  * `STRATEGY_LABEL`: The label to use for the strategy.
2070  * `INTERFACES`: The name of the generated interface.
2071  * `SOURCES`: The source files generated by the interface.
2072 #]==]
2074  cmake_parse_arguments(_paraview_tree_layout_strategy
2075  ""
2076  "INTERFACES;SOURCES;STRATEGY_TYPE;STRATEGY_LABEL"
2077  ""
2078  ${ARGN})
2079 
2080  if (_paraview_tree_layout_strategy_UNPARSED_ARGUMENTS)
2081  message(FATAL_ERROR
2082  "Unparsed arguments for paraview_plugin_add_tree_layout_strategy: "
2083  "${_paraview_tree_layout_strategy_UNPARSED_ARGUMENTS}")
2084  endif ()
2085 
2086  if (NOT DEFINED _paraview_tree_layout_strategy_STRATEGY_TYPE)
2087  message(FATAL_ERROR
2088  "The `STRATEGY_TYPE` argument is required.")
2089  endif ()
2090 
2091  if (NOT DEFINED _paraview_tree_layout_strategy_STRATEGY_LABEL)
2092  message(FATAL_ERROR
2093  "The `STRATEGY_LABEL` argument is required.")
2094  endif ()
2095 
2096  if (NOT DEFINED _paraview_tree_layout_strategy_INTERFACES)
2097  message(FATAL_ERROR
2098  "The `INTERFACES` argument is required.")
2099  endif ()
2100 
2101  if (NOT DEFINED _paraview_tree_layout_strategy_SOURCES)
2102  message(FATAL_ERROR
2103  "The `SOURCES` argument is required.")
2104  endif ()
2105 
2106  configure_file(
2107  "${_ParaViewPlugin_cmake_dir}/pqTreeLayoutStrategyImplementation.h.in"
2108  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_tree_layout_strategy_STRATEGY_TYPE}Implementation.h"
2109  @ONLY)
2110  configure_file(
2111  "${_ParaViewPlugin_cmake_dir}/pqTreeLayoutStrategyImplementation.cxx.in"
2112  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_tree_layout_strategy_STRATEGY_TYPE}Implementation.cxx"
2113  @ONLY)
2114 
2115  set("${_paraview_tree_layout_strategy_INTERFACES}"
2116  "${_paraview_tree_layout_strategy_STRATEGY_TYPE}Implementation"
2117  PARENT_SCOPE)
2118 
2119  set("${_paraview_tree_layout_strategy_SOURCES}"
2120  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_tree_layout_strategy_STRATEGY_TYPE}Implementation.cxx"
2121  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_tree_layout_strategy_STRATEGY_TYPE}Implementation.h"
2122  PARENT_SCOPE)
2123 endfunction ()
2124 
2125 #[==[.md
2126 ### Proxy
2127 
2128 TODO: What is a proxy?
2129 
2130 ```
2132  NAME <name>
2133  INTERFACES <variable>
2134  SOURCES <variable>
2135  [PROXY_TYPE <type>
2136  [CLASS_NAME <class>]
2137  XML_GROUP <group>
2138  <XML_NAME|XML_NAME_REGEX> <name>]...)
2139 ```
2140 
2141  * `NAME`: The name of the proxy.
2142  * `INTERFACES`: The name of the generated interface.
2143  * `SOURCES`: The source files generated by the interface.
2144 
2145 At least one `PROXY_TYPE` must be specified. Each proxy type must be given an
2146 `XML_GROUP` and either an `XML_NAME` or `XML_NAME_REGEX`. If `CLASS_NAME` is
2147 not given, the `PROXY_TYPE` name is used instead.
2148 #]==]
2150  cmake_parse_arguments(_paraview_proxy
2151  ""
2152  "INTERFACES;SOURCES;NAME"
2153  ""
2154  ${ARGN})
2155 
2156  if (NOT DEFINED _paraview_proxy_INTERFACES)
2157  message(FATAL_ERROR
2158  "The `INTERFACES` argument is required.")
2159  endif ()
2160 
2161  if (NOT DEFINED _paraview_proxy_SOURCES)
2162  message(FATAL_ERROR
2163  "The `SOURCES` argument is required.")
2164  endif ()
2165 
2166  if (NOT DEFINED _paraview_proxy_NAME)
2167  message(FATAL_ERROR
2168  "The `NAME` argument is required.")
2169  endif ()
2170 
2171  set(_paraview_proxy_parse "")
2172  set(_paraview_proxy_type)
2173  set(_paraview_proxy_types)
2174  foreach (_paraview_proxy_arg IN LISTS _paraview_proxy_UNPARSED_ARGUMENTS)
2175  if (_paraview_proxy_parse STREQUAL "")
2176  set(_paraview_proxy_parse "${_paraview_proxy_arg}")
2177  elseif (_paraview_proxy_parse STREQUAL "PROXY_TYPE")
2178  set(_paraview_proxy_type "${_paraview_proxy_arg}")
2179  list(APPEND _paraview_proxy_types "${_paraview_proxy_type}")
2180  set(_paraview_proxy_parse "")
2181  elseif (_paraview_proxy_parse STREQUAL "CLASS_NAME")
2182  if (NOT _paraview_proxy_type)
2183  message(FATAL_ERROR
2184  "Missing `PROXY_TYPE` for `CLASS_NAME`")
2185  endif ()
2186  if (DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_class_name")
2187  message(FATAL_ERROR
2188  "Duplicate `CLASS_NAME` for `${_paraview_proxy_type}`")
2189  endif ()
2190  set("_paraview_proxy_type_${_paraview_proxy_type}_class_name"
2191  "${_paraview_proxy_arg}")
2192  set(_paraview_proxy_parse "")
2193  elseif (_paraview_proxy_parse STREQUAL "XML_GROUP")
2194  if (NOT _paraview_proxy_type)
2195  message(FATAL_ERROR
2196  "Missing `PROXY_TYPE` for `XML_GROUP`")
2197  endif ()
2198  if (DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_group")
2199  message(FATAL_ERROR
2200  "Duplicate `XML_GROUP` for `${_paraview_proxy_type}`")
2201  endif ()
2202  set("_paraview_proxy_type_${_paraview_proxy_type}_xml_group"
2203  "${_paraview_proxy_arg}")
2204  set(_paraview_proxy_parse "")
2205  elseif (_paraview_proxy_parse STREQUAL "XML_NAME")
2206  if (NOT _paraview_proxy_type)
2207  message(FATAL_ERROR
2208  "Missing `PROXY_TYPE` for `XML_NAME`")
2209  endif ()
2210  if (DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_name" OR
2211  DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_name_regex")
2212  message(FATAL_ERROR
2213  "Duplicate `XML_NAME` or `XML_NAME_REGEX` for `${_paraview_proxy_type}`")
2214  endif ()
2215  set("_paraview_proxy_type_${_paraview_proxy_type}_xml_name"
2216  "${_paraview_proxy_arg}")
2217  set(_paraview_proxy_parse "")
2218  elseif (_paraview_proxy_parse STREQUAL "XML_NAME_REGEX")
2219  if (NOT _paraview_proxy_type)
2220  message(FATAL_ERROR
2221  "Missing `PROXY_TYPE` for `XML_NAME_REGEX`")
2222  endif ()
2223  if (DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_name" OR
2224  DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_name_regex")
2225  message(FATAL_ERROR
2226  "Duplicate `XML_NAME` or `XML_NAME_REGEX` for `${_paraview_proxy_type}`")
2227  endif ()
2228  set("_paraview_proxy_type_${_paraview_proxy_type}_xml_name_regex"
2229  "${_paraview_proxy_arg}")
2230  set(_paraview_proxy_parse "")
2231  else ()
2232  message(FATAL_ERROR
2233  "Unknown argument `${_paraview_proxy_parse}`")
2234  endif ()
2235  endforeach ()
2236 
2237  if (_paraview_proxy_parse)
2238  message(FATAL_ERROR
2239  "Missing argument for `${_paraview_proxy_parse}`")
2240  endif ()
2241 
2242  if (NOT _paraview_proxy_types)
2243  message(FATAL_ERROR
2244  "No `PROXY_TYPE` arguments given")
2245  endif ()
2246 
2247  set(_paraview_proxy_includes)
2248  set(_paraview_proxy_body)
2249  foreach (_paraview_proxy_type IN LISTS _paraview_proxy_types)
2250  if (NOT DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_group")
2251  message(FATAL_ERROR
2252  "Missing `XML_GROUP` for `${_paraview_proxy_type}`")
2253  endif ()
2254  if (NOT DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_name" AND
2255  NOT DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_name_regex")
2256  message(FATAL_ERROR
2257  "Missing `XML_NAME` or `XML_NAME_REGEX` for `${_paraview_proxy_type}`")
2258  endif ()
2259  if (DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_class_name")
2260  set(_paraview_proxy_class
2261  "${_paraview_proxy_type_${_paraview_proxy_type}_class_name}")
2262  else ()
2263  set(_paraview_proxy_class
2264  "${_paraview_proxy_type}")
2265  endif ()
2266 
2267  set(_paraview_proxy_group "${_paraview_proxy_type_${_paraview_proxy_type}_xml_group}")
2268  if (DEFINED "_paraview_proxy_type_${_paraview_proxy_type}_xml_name")
2269  set(_paraview_proxy_name "${_paraview_proxy_type_${_paraview_proxy_type}_xml_name}")
2270  set(_paraview_proxy_name_type "QString")
2271  set(_paraview_proxy_cmp "name == proxy->GetXMLName()")
2272  else ()
2273  set(_paraview_proxy_name "${_paraview_proxy_type_${_paraview_proxy_type}_xml_name_regex}")
2274  set(_paraview_proxy_name_type "QRegularExpression")
2275  set(_paraview_proxy_cmp "QString(proxy->GetXMLName()).contains(name)")
2276  endif ()
2277 
2278  if (NOT DEFINED "_paraview_proxy_included_${_paraview_proxy_class}")
2279  string(APPEND _paraview_proxy_includes
2280  "#include \"${_paraview_proxy_class}.h\"\n")
2281  set("_paraview_proxy_included_${_paraview_proxy_class}" 1)
2282  endif ()
2283  string(APPEND _paraview_proxy_body
2284  " {
2285  static const QString group(\"${_paraview_proxy_group}\");
2286  static const ${_paraview_proxy_name_type} name(\"${_paraview_proxy_name}\");
2287  if (group == proxy->GetXMLGroup() && ${_paraview_proxy_cmp})
2288  {
2289  return new ${_paraview_proxy_class}(regGroup, regName, proxy, server, nullptr);
2290  }
2291  }\n")
2292  endforeach ()
2293 
2294  configure_file(
2295  "${_ParaViewPlugin_cmake_dir}/pqServerManagerModelImplementation.h.in"
2296  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_proxy_NAME}ServerManagerModelImplementation.h"
2297  @ONLY)
2298  configure_file(
2299  "${_ParaViewPlugin_cmake_dir}/pqServerManagerModelImplementation.cxx.in"
2300  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_proxy_NAME}ServerManagerModelImplementation.cxx"
2301  @ONLY)
2302 
2303  set("${_paraview_proxy_INTERFACES}"
2304  "${_paraview_proxy_NAME}ServerManagerModelImplementation"
2305  PARENT_SCOPE)
2306 
2307  set("${_paraview_proxy_SOURCES}"
2308  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_proxy_NAME}ServerManagerModelImplementation.cxx"
2309  "${CMAKE_CURRENT_BINARY_DIR}/${_paraview_proxy_NAME}ServerManagerModelImplementation.h"
2310  PARENT_SCOPE)
2311 endfunction ()
2312 
2313 cmake_policy(POP)
function paraview_plugin_scan()
.md Scanning plugins
description
function _paraview_plugin_debug(domain, format)
.md ParaView Plugin CMake API
location
component
content
#define _paraview_add_plugin_with_ui
order
#define _paraview_add_plugin_with_initializers
#define _paraview_add_plugin_with_xml
function paraview_client_documentation()
.md Documentation from XML files
type
function vtk_module_wrap_client_server()
.md Wrapping a set of VTK modules for ClientServer
function paraview_plugin_add_property_widget()
.md Plugin interfaces
on
version
function paraview_plugin_build()
.md Building plugins
#define _paraview_add_plugin_built_shared
EXPORT
string
std::string replace(std::string source, const std::string &search, const std::string &replace, bool all)
function paraview_plugin_add_tree_layout_strategy()
.md Tree layout strategy
function paraview_server_manager_process()
.md Building XML files
function paraview_server_manager_process_files()
.md The second way to process XML files directly.
name
function paraview_plugin_add_dock_window()
.md Dock window
function paraview_plugin_add_auto_start()
.md Auto start
function
function paraview_plugin_add_location()
.md Location
time
#define VERSION
Definition: jconfigint.h:17
#define BUILD_SHARED_LIBS
Definition: config.h:45
source
function paraview_client_generate_help()
.md Generating help documentation
#define PACKAGE
Definition: expat_config.h:64
function paraview_plugin_add_action_group()
.md Action group
enabled
top
documentation
value
function paraview_plugin_add_proxy()
.md Proxy
function paraview_add_plugin(name)
.md Adding a plugin
#define _paraview_add_plugin_with_python
function paraview_plugin_write_conf()
.md Plugin configuration files
function paraview_plugin_add_toolbar()
.md Toolbar