#[==[ @file vtkObjectFactory.cmake In VTK, certain classes can have what are called "implementations". When the base class is requested, it instead looks into a list of available implementations. One of the implementations is then constructed and returned instead. For instance, there is a `vtkRenderWindow` class in VTK. When this is constructed, it instead actually returns a window for the X window system, Cocoa, or Win32 depending on what is available. VTK's implementation utilizes the [autoinit](@ref module-autoinit) logic of the module system. A module which contains an object factory must declare itself as `IMPLEMENTABLE` and modules which contain an implementation of an object factory must claim that they `IMPLEMENTS` modules containing those base object factories (a module may contain the object factory and an implementation; it then says that it `IMPLEMENTS` itself). #]==] set(_vtkObjectFactory_source_dir "${CMAKE_CURRENT_LIST_DIR}") #[==[ @brief Declare a factory override Declare that a class in this module (the implementation) is an `OVERRIDE` for a base class. ~~~ vtk_object_factory_declare( BASE OVERRIDE ) ~~~ #]==] function (vtk_object_factory_declare) cmake_parse_arguments(_vtk_object_factory_declare "" "BASE;OVERRIDE" "" ${ARGN}) if (_vtk_object_factory_declare_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unparsed arguments for vtk_object_factory_declare: " "${_vtk_object_factory_declare_UNPARSED_ARGUMENTS}") endif () if (NOT DEFINED _vtk_object_factory_declare_BASE) message(FATAL_ERROR "The `BASE` argument is required.") endif () if (NOT DEFINED _vtk_object_factory_declare_OVERRIDE) message(FATAL_ERROR "The `OVERRIDE` argument is required.") endif () set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY _vtk_object_factory_overrides "${_vtk_object_factory_declare_OVERRIDE}") set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY "_vtk_object_factory_override_${_vtk_object_factory_declare_OVERRIDE}" "${_vtk_object_factory_declare_BASE}") endfunction () #[==[ @brief Generate source for overrides in a module A module may only have a single declaration of all its object factory implementations. This function generates the source for all of the overrides declared using @ref vtk_object_factory_declare. ~~~ vtk_object_factory_configure( SOURCE_FILE [HEADER_FILE ] [EXPORT_MACRO ] [INITIAL_CODE ] [EXTRA_INCLUDES ...]) ~~~ - `SOURCE_FILE`: (Required) A variable to set to the path to generated source file. - `HEADER_FILE`: (Recommended) A variable to set to the path to generated header file. This should not be treated as a public header. - `EXPORT_MACRO`: (Recommended) The export macro to add to the generated class. - `INITIAL_CODE`: C++ code to run when the object factory is initialized. - `EXTRA_INCLUDES`: A list of headers to include. The header names need to include the `<>` or `""` quoting. #]==] function (vtk_object_factory_configure) if (NOT DEFINED _vtk_build_module) message(FATAL_ERROR "The `vtk_object_factory_configure` function needs to be run within a module context.") endif () cmake_parse_arguments(_vtk_object_factory_configure "" "SOURCE_FILE;HEADER_FILE;INITIAL_CODE;EXPORT_MACRO" "EXTRA_INCLUDES" ${ARGN}) if (_vtk_object_factory_configure_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unparsed arguments for vtk_object_factory_configure: " "${_vtk_object_factory_configure_UNPARSED_ARGUMENTS}") endif () get_property(_vtk_object_factory_done GLOBAL PROPERTY "_vtk_object_factory_${_vtk_build_module}" SET) if (_vtk_object_factory_done) message(FATAL_ERROR "An object factory has already been created for ${_vtk_build_module}.") else () set_property(GLOBAL PROPERTY "_vtk_object_factory_${_vtk_build_module}" 1) endif () get_property(_vtk_object_factory_overrides DIRECTORY PROPERTY _vtk_object_factory_overrides) if (NOT _vtk_object_factory_overrides) message(WARNING "The ${_vtk_build_module} is generating an object factory, but does not have any declared overrides.") endif () set(_vtk_object_factory_doc "Override for ${_vtk_build_module} module") set(_vtk_object_factory_includes "") set(_vtk_object_factory_functions "") set(_vtk_object_factory_calls "") foreach (_vtk_object_factory_extra_include IN LISTS _vtk_object_factory_configure_EXTRA_INCLUDES) set(_vtk_object_factory_includes "${_vtk_object_factory_includes}#include ${_vtk_object_factory_extra_include}\n") endforeach () foreach (_vtk_object_factory_override IN LISTS _vtk_object_factory_overrides) get_property(_vtk_object_factory_base DIRECTORY PROPERTY "_vtk_object_factory_override_${_vtk_object_factory_override}") set(_vtk_object_factory_includes "${_vtk_object_factory_includes}#include \"${_vtk_object_factory_override}.h\"\n") set(_vtk_object_factory_functions "${_vtk_object_factory_functions}VTK_CREATE_CREATE_FUNCTION(${_vtk_object_factory_override})\n") set(_vtk_object_factory_calls "${_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") endforeach () get_property(_vtk_object_factory_library_name GLOBAL PROPERTY "_vtk_module_${_vtk_build_module}_library_name") set(_vtk_object_factory_overrides_header "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.h") set(_vtk_object_factory_overrides_source "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.cxx") configure_file( "${_vtkObjectFactory_source_dir}/vtkObjectFactory.h.in" "${_vtk_object_factory_overrides_header}" @ONLY) configure_file( "${_vtkObjectFactory_source_dir}/vtkObjectFactory.cxx.in" "${_vtk_object_factory_overrides_source}" @ONLY) if (_vtk_object_factory_configure_HEADER_FILE) set("${_vtk_object_factory_configure_HEADER_FILE}" "${_vtk_object_factory_overrides_header}" PARENT_SCOPE) endif () set("${_vtk_object_factory_configure_SOURCE_FILE}" "${_vtk_object_factory_overrides_source}" PARENT_SCOPE) endfunction ()