VTK  9.7.1
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 ~~~
32 vtk_object_factory_declare(
33  BASE <base>
34  OVERRIDE <implementation>)
35 ~~~
36 #]==]
37 function (vtk_object_factory_declare)
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}\",
168  \"${_vtk_object_factory_override}\",
169  \"${_vtk_object_factory_doc}\",
170  1,
171  vtkObjectFactoryCreate${_vtk_object_factory_override},
172  #if defined(${_vtk_object_factory_override}_OVERRIDE_ATTRIBUTES)
173  ${_vtk_object_factory_override}_OVERRIDE_ATTRIBUTES
174  #else
175  nullptr
176  #endif
177  );\n")
178  endforeach ()
179 
180  get_property(_vtk_object_factory_library_name GLOBAL
181  PROPERTY "_vtk_module_${_vtk_build_module}_library_name")
182 
183  set(_vtk_object_factory_overrides_header
184  "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.h")
185  set(_vtk_object_factory_overrides_source
186  "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.cxx")
187 
188  configure_file(
189  "${_vtkObjectFactory_source_dir}/vtkObjectFactory.h.in"
190  "${_vtk_object_factory_overrides_header}"
191  @ONLY)
192  configure_file(
193  "${_vtkObjectFactory_source_dir}/vtkObjectFactory.cxx.in"
194  "${_vtk_object_factory_overrides_source}"
195  @ONLY)
196 
197  if (_vtk_object_factory_configure_HEADER_FILE)
198  set("${_vtk_object_factory_configure_HEADER_FILE}"
199  "${_vtk_object_factory_overrides_header}"
200  PARENT_SCOPE)
201  endif ()
202 
203  set("${_vtk_object_factory_configure_SOURCE_FILE}"
204  "${_vtk_object_factory_overrides_source}"
205  PARENT_SCOPE)
206 endfunction ()
if(abs(tt-1.0)< eps)
Definition: PyrC1Basis.h:1
create a window for renderers to draw into
abstract base class for vtkObjectFactories