VTK  9.4.20250504
vtkObjectFactory.cmake
Go to the documentation of this file.
1#[==[
2@file vtkObjectFactory.cmake
3
4In VTK, certain classes can have what are called "implementations". When the
5base class is requested, it instead looks into a list of available
6implementations. One of the implementations is then constructed and returned
7instead.
8
9For instance, there is a `vtkRenderWindow` class in VTK. When this is
10constructed, it instead actually returns a window for the X window system,
11Cocoa, or Win32 depending on what is available.
12
13VTK's implementation utilizes the
14[autoinit](https://docs.vtk.org/en/latest/api/cmake/ModuleSystem.html#autoinit)
15logic of the
16module system. A module which contains an object factory must declare itself as
17`IMPLEMENTABLE` and modules which contain an implementation of an object
18factory must claim that they `IMPLEMENTS` modules containing those base object
19factories (a module may contain the object factory and an implementation; it
20then says that it `IMPLEMENTS` itself).
21#]==]
22
23set(_vtkObjectFactory_source_dir "${CMAKE_CURRENT_LIST_DIR}")
24
25#[==[
26@brief Declare a factory override
27
28Declare that a class in this module (the implementation) is an `OVERRIDE` for a
29base 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}")
65endfunction ()
66
67#[==[
68@brief Generate source for overrides in a module
69
70A module may only have a single declaration of all its object factory
71implementations. This function generates the source for all of the overrides
72declared using @ref vtk_object_factory_declare.
73
74~~~
75vtk_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#]==]
95function (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)
196endfunction ()
if(abs(tt - 1.0)< eps)
Definition PyrC1Basis.h:1
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.