VTK  9.0.2
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 [autoinit](@ref module-autoinit) logic of the
14 module system. A module which contains an object factory must declare itself as
15 `IMPLEMENTABLE` and modules which contain an implementation of an object
16 factory must claim that they `IMPLEMENTS` modules containing those base object
17 factories (a module may contain the object factory and an implementation; it
18 then says that it `IMPLEMENTS` itself).
19 #]==]
20 
21 set(_vtkObjectFactory_source_dir "${CMAKE_CURRENT_LIST_DIR}")
22 
23 #[==[
24 @brief Declare a factory override
25 
26 Declare that a class in this module (the implementation) is an `OVERRIDE` for a
27 base class.
28 
29 ~~~
31  BASE <base>
32  OVERRIDE <implementation>)
33 ~~~
34 #]==]
36  cmake_parse_arguments(_vtk_object_factory_declare
37  ""
38  "BASE;OVERRIDE"
39  ""
40  ${ARGN})
41 
42  if (_vtk_object_factory_declare_UNPARSED_ARGUMENTS)
43  message(FATAL_ERROR
44  "Unparsed arguments for vtk_object_factory_declare: "
45  "${_vtk_object_factory_declare_UNPARSED_ARGUMENTS}")
46  endif ()
47 
48  if (NOT DEFINED _vtk_object_factory_declare_BASE)
49  message(FATAL_ERROR
50  "The `BASE` argument is required.")
51  endif ()
52 
53  if (NOT DEFINED _vtk_object_factory_declare_OVERRIDE)
54  message(FATAL_ERROR
55  "The `OVERRIDE` argument is required.")
56  endif ()
57 
58  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND
59  PROPERTY
60  _vtk_object_factory_overrides "${_vtk_object_factory_declare_OVERRIDE}")
61  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND
62  PROPERTY
63  "_vtk_object_factory_override_${_vtk_object_factory_declare_OVERRIDE}" "${_vtk_object_factory_declare_BASE}")
64 endfunction ()
65 
66 #[==[
67 @brief Generate source for overrides in a module
68 
69 A module may only have a single declaration of all its object factory
70 implementations. This function generates the source for all of the overrides
71 declared using @ref vtk_object_factory_declare.
72 
73 ~~~
74 vtk_object_factory_configure(
75  SOURCE_FILE <variable>
76  [HEADER_FILE <variable>]
77  [EXPORT_MACRO <macro>]
78  [INITIAL_CODE <code>]
79  [EXTRA_INCLUDES <include>...])
80 ~~~
81 
82  - `SOURCE_FILE`: (Required) A variable to set to the path to generated source
83  file.
84  - `HEADER_FILE`: (Recommended) A variable to set to the path to generated
85  header file. This should not be treated as a public header.
86  - `EXPORT_MACRO`: (Recommended) The export macro to add to the generated
87  class.
88  - `INITIAL_CODE`: C++ code to run when the object factory is initialized.
89  - `EXTRA_INCLUDES`: A list of headers to include. The header names need to
90  include the `<>` or `""` quoting.
91 #]==]
92 function (vtk_object_factory_configure)
93  if (NOT DEFINED _vtk_build_module)
94  message(FATAL_ERROR
95  "The `vtk_object_factory_configure` function needs to be run within a module context.")
96  endif ()
97 
98  cmake_parse_arguments(_vtk_object_factory_configure
99  ""
100  "SOURCE_FILE;HEADER_FILE;INITIAL_CODE;EXPORT_MACRO"
101  "EXTRA_INCLUDES"
102  ${ARGN})
103 
104  if (_vtk_object_factory_configure_UNPARSED_ARGUMENTS)
105  message(FATAL_ERROR
106  "Unparsed arguments for vtk_object_factory_configure: "
107  "${_vtk_object_factory_configure_UNPARSED_ARGUMENTS}")
108  endif ()
109 
110  get_property(_vtk_object_factory_done
111  GLOBAL
112  PROPERTY "_vtk_object_factory_${_vtk_build_module}"
113  SET)
114  if (_vtk_object_factory_done)
115  message(FATAL_ERROR
116  "An object factory has already been created for ${_vtk_build_module}.")
117  else ()
118  set_property(GLOBAL
119  PROPERTY
120  "_vtk_object_factory_${_vtk_build_module}" 1)
121  endif ()
122 
123  get_property(_vtk_object_factory_overrides
124  DIRECTORY
125  PROPERTY _vtk_object_factory_overrides)
126 
127  if (NOT _vtk_object_factory_overrides)
128  message(WARNING
129  "The ${_vtk_build_module} is generating an object factory, but does not have any declared overrides.")
130  endif ()
131 
132  set(_vtk_object_factory_doc
133  "Override for ${_vtk_build_module} module")
134 
135  set(_vtk_object_factory_includes "")
136  set(_vtk_object_factory_functions "")
137  set(_vtk_object_factory_calls "")
138 
139  foreach (_vtk_object_factory_extra_include IN LISTS _vtk_object_factory_configure_EXTRA_INCLUDES)
140  set(_vtk_object_factory_includes
141  "${_vtk_object_factory_includes}#include ${_vtk_object_factory_extra_include}\n")
142  endforeach ()
143 
144  foreach (_vtk_object_factory_override IN LISTS _vtk_object_factory_overrides)
145  get_property(_vtk_object_factory_base
146  DIRECTORY
147  PROPERTY "_vtk_object_factory_override_${_vtk_object_factory_override}")
148  set(_vtk_object_factory_includes
149  "${_vtk_object_factory_includes}#include \"${_vtk_object_factory_override}.h\"\n")
150  set(_vtk_object_factory_functions
151  "${_vtk_object_factory_functions}VTK_CREATE_CREATE_FUNCTION(${_vtk_object_factory_override})\n")
152  set(_vtk_object_factory_calls
153  "${_vtk_object_factory_calls}this->RegisterOverride(\"${_vtk_object_factory_base}\", \"${_vtk_object_factory_override}\", \"${_vtk_object_factory_doc}\", 1, vtkObjectFactoryCreate${_vtk_object_factory_override});\n")
154  endforeach ()
155 
156  get_property(_vtk_object_factory_library_name GLOBAL
157  PROPERTY "_vtk_module_${_vtk_build_module}_library_name")
158 
159  set(_vtk_object_factory_overrides_header
160  "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.h")
161  set(_vtk_object_factory_overrides_source
162  "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.cxx")
163 
164  configure_file(
165  "${_vtkObjectFactory_source_dir}/vtkObjectFactory.h.in"
166  "${_vtk_object_factory_overrides_header}"
167  @ONLY)
168  configure_file(
169  "${_vtkObjectFactory_source_dir}/vtkObjectFactory.cxx.in"
170  "${_vtk_object_factory_overrides_source}"
171  @ONLY)
172 
173  if (_vtk_object_factory_configure_HEADER_FILE)
174  set("${_vtk_object_factory_configure_HEADER_FILE}"
175  "${_vtk_object_factory_overrides_header}"
176  PARENT_SCOPE)
177  endif ()
178 
179  set("${_vtk_object_factory_configure_SOURCE_FILE}"
180  "${_vtk_object_factory_overrides_source}"
181  PARENT_SCOPE)
182 endfunction ()
abstract base class for vtkObjectFactories
create a window for renderers to draw into
@ on
Definition: vtkX3D.h:445
function vtk_object_factory_configure()
Generate source for overrides in a module.
function vtk_object_factory_declare()
Declare a factory override.