VTK  9.3.20240418
vtkObjectFactory.cmake
Go to the documentation of this file.
1 #[==[
2 @file vtkObjectFactory.cmake
3 
4 In VTK, certain classes can have what are called "implementations". When the
5 base class is requested, it instead looks into a list of available
6 implementations. One of the implementations is then constructed and returned
7 instead.
8 
9 For instance, there is a `vtkRenderWindow` class in VTK. When this is
10 constructed, it instead actually returns a window for the X window system,
11 Cocoa, or Win32 depending on what is available.
12 
13 VTK's implementation utilizes the
14 [autoinit](https://docs.vtk.org/en/latest/api/cmake/ModuleSystem.html#autoinit)
15 logic of the
16 module system. A module which contains an object factory must declare itself as
17 `IMPLEMENTABLE` and modules which contain an implementation of an object
18 factory must claim that they `IMPLEMENTS` modules containing those base object
19 factories (a module may contain the object factory and an implementation; it
20 then says that it `IMPLEMENTS` itself).
21 #]==]
22 
23 set(_vtkObjectFactory_source_dir "${CMAKE_CURRENT_LIST_DIR}")
24 
25 #[==[
26 @brief Declare a factory override
27 
28 Declare that a class in this module (the implementation) is an `OVERRIDE` for a
29 base class.
30 
31 ~~~
33  BASE <base>
34  OVERRIDE <implementation>)
35 ~~~
36 #]==]
38  cmake_parse_arguments(PARSE_ARGV 0 _vtk_object_factory_declare
39  ""
40  "BASE;OVERRIDE"
41  "")
42 
43  if (_vtk_object_factory_declare_UNPARSED_ARGUMENTS)
44  message(FATAL_ERROR
45  "Unparsed arguments for vtk_object_factory_declare: "
46  "${_vtk_object_factory_declare_UNPARSED_ARGUMENTS}")
47  endif ()
48 
49  if (NOT DEFINED _vtk_object_factory_declare_BASE)
50  message(FATAL_ERROR
51  "The `BASE` argument is required.")
52  endif ()
53 
54  if (NOT DEFINED _vtk_object_factory_declare_OVERRIDE)
55  message(FATAL_ERROR
56  "The `OVERRIDE` argument is required.")
57  endif ()
58 
59  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND
60  PROPERTY
61  _vtk_object_factory_overrides "${_vtk_object_factory_declare_OVERRIDE}")
62  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND
63  PROPERTY
64  "_vtk_object_factory_override_${_vtk_object_factory_declare_OVERRIDE}" "${_vtk_object_factory_declare_BASE}")
65 endfunction ()
66 
67 #[==[
68 @brief Generate source for overrides in a module
69 
70 A module may only have a single declaration of all its object factory
71 implementations. This function generates the source for all of the overrides
72 declared using @ref vtk_object_factory_declare.
73 
74 ~~~
75 vtk_object_factory_configure(
76  SOURCE_FILE <variable>
77  [HEADER_FILE <variable>]
78  [EXPORT_MACRO <macro>]
79  [INITIAL_CODE <code>]
80  [INITIAL_CODE_FILE <path>]
81  [EXTRA_INCLUDES <include>...])
82 ~~~
83 
84  - `SOURCE_FILE`: (Required) A variable to set to the path to generated source
85  file.
86  - `HEADER_FILE`: (Recommended) A variable to set to the path to generated
87  header file. This should not be treated as a public header.
88  - `EXPORT_MACRO`: (Recommended) The export macro to add to the generated
89  class.
90  - `INITIAL_CODE`: C++ code to run when the object factory is initialized.
91  - `INITIAL_CODE_FILE`: Read `INITIAL_CODE` from a file.
92  - `EXTRA_INCLUDES`: A list of headers to include. The header names need to
93  include the `<>` or `""` quoting.
94 #]==]
95 function (vtk_object_factory_configure)
96  if (NOT DEFINED _vtk_build_module)
97  message(FATAL_ERROR
98  "The `vtk_object_factory_configure` function needs to be run within a module context.")
99  endif ()
100 
101  cmake_parse_arguments(PARSE_ARGV 0 _vtk_object_factory_configure
102  ""
103  "SOURCE_FILE;HEADER_FILE;INITIAL_CODE;EXPORT_MACRO;INITIAL_CODE_FILE"
104  "EXTRA_INCLUDES")
105 
106  if (_vtk_object_factory_configure_UNPARSED_ARGUMENTS)
107  message(FATAL_ERROR
108  "Unparsed arguments for vtk_object_factory_configure: "
109  "${_vtk_object_factory_configure_UNPARSED_ARGUMENTS}")
110  endif ()
111 
112  if (DEFINED _vtk_object_factory_configure_INITIAL_CODE AND
113  DEFINED _vtk_object_factory_configure_INITIAL_CODE_FILE)
114  message(FATAL_ERROR
115  "At most one of `INITIAL_CODE` and `INITIAL_CODE_FILE` may be specified "
116  "at a time.")
117  endif ()
118 
119  if (_vtk_object_factory_configure_INITIAL_CODE_FILE)
120  file(READ "${_vtk_object_factory_configure_INITIAL_CODE_FILE}"
121  _vtk_object_factory_configure_INITIAL_CODE)
122  endif ()
123 
124  get_property(_vtk_object_factory_done
125  GLOBAL
126  PROPERTY "_vtk_object_factory_${_vtk_build_module}"
127  SET)
128  if (_vtk_object_factory_done)
129  message(FATAL_ERROR
130  "An object factory has already been created for ${_vtk_build_module}.")
131  else ()
132  set_property(GLOBAL
133  PROPERTY
134  "_vtk_object_factory_${_vtk_build_module}" 1)
135  endif ()
136 
137  get_property(_vtk_object_factory_overrides
138  DIRECTORY
139  PROPERTY _vtk_object_factory_overrides)
140 
141  if (NOT _vtk_object_factory_overrides)
142  message(WARNING
143  "The ${_vtk_build_module} is generating an object factory, but does not have any declared overrides.")
144  endif ()
145 
146  set(_vtk_object_factory_doc
147  "Override for ${_vtk_build_module} module")
148 
149  set(_vtk_object_factory_includes "")
150  set(_vtk_object_factory_functions "")
151  set(_vtk_object_factory_calls "")
152 
153  foreach (_vtk_object_factory_extra_include IN LISTS _vtk_object_factory_configure_EXTRA_INCLUDES)
154  string(APPEND _vtk_object_factory_includes
155  "#include ${_vtk_object_factory_extra_include}\n")
156  endforeach ()
157 
158  foreach (_vtk_object_factory_override IN LISTS _vtk_object_factory_overrides)
159  get_property(_vtk_object_factory_base
160  DIRECTORY
161  PROPERTY "_vtk_object_factory_override_${_vtk_object_factory_override}")
162  string(APPEND _vtk_object_factory_includes
163  "#include \"${_vtk_object_factory_override}.h\"\n")
164  string(APPEND _vtk_object_factory_functions
165  "VTK_CREATE_CREATE_FUNCTION(${_vtk_object_factory_override})\n")
166  string(APPEND _vtk_object_factory_calls
167  "this->RegisterOverride(\"${_vtk_object_factory_base}\", \"${_vtk_object_factory_override}\", \"${_vtk_object_factory_doc}\", 1, vtkObjectFactoryCreate${_vtk_object_factory_override});\n")
168  endforeach ()
169 
170  get_property(_vtk_object_factory_library_name GLOBAL
171  PROPERTY "_vtk_module_${_vtk_build_module}_library_name")
172 
173  set(_vtk_object_factory_overrides_header
174  "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.h")
175  set(_vtk_object_factory_overrides_source
176  "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.cxx")
177 
178  configure_file(
179  "${_vtkObjectFactory_source_dir}/vtkObjectFactory.h.in"
180  "${_vtk_object_factory_overrides_header}"
181  @ONLY)
182  configure_file(
183  "${_vtkObjectFactory_source_dir}/vtkObjectFactory.cxx.in"
184  "${_vtk_object_factory_overrides_source}"
185  @ONLY)
186 
187  if (_vtk_object_factory_configure_HEADER_FILE)
188  set("${_vtk_object_factory_configure_HEADER_FILE}"
189  "${_vtk_object_factory_overrides_header}"
190  PARENT_SCOPE)
191  endif ()
192 
193  set("${_vtk_object_factory_configure_SOURCE_FILE}"
194  "${_vtk_object_factory_overrides_source}"
195  PARENT_SCOPE)
196 endfunction ()
abstract base class for vtkObjectFactories
create a window for renderers to draw into
@ on
Definition: vtkX3D.h:439
@ time
Definition: vtkX3D.h:497
@ string
Definition: vtkX3D.h:490
function vtk_object_factory_configure()
Generate source for overrides in a module.
function vtk_object_factory_declare()
Declare a factory override.