Merge topic 'patch-FindOpenSceneGraph'

134095a4b3 FindOpenSceneGraph: Update documentation

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !10707
diff --git a/Modules/FindOpenSceneGraph.cmake b/Modules/FindOpenSceneGraph.cmake
index d4ffa10..607a836 100644
--- a/Modules/FindOpenSceneGraph.cmake
+++ b/Modules/FindOpenSceneGraph.cmake
@@ -5,112 +5,256 @@
 FindOpenSceneGraph
 ------------------
 
-Find OpenSceneGraph (3D graphics application programming interface)
+Finds `OpenSceneGraph`_ (OSG), a 3D graphics application programming interface.
 
-This module searches for the OpenSceneGraph core "osg" library as well
-as :module:`FindOpenThreads`, and whatever additional ``COMPONENTS``
-(nodekits) that you specify.
+.. note::
 
-::
+  OpenSceneGraph development has largely transitioned to its successor project,
+  VulkanSceneGraph, which should be preferred for new code.  Refer to the
+  upstream documentation for guidance on using VulkanSceneGraph with CMake.
 
-    See http://www.openscenegraph.org
+This module searches for the OpenSceneGraph core osg library, its dependency
+OpenThreads, and additional OpenSceneGraph libraries, some of which are also
+known as *NodeKits*, if specified.
 
+When working with OpenSceneGraph, its core library headers are intended to be
+included in C++ project source code as:
 
+.. code-block:: c++
 
-NOTE: To use this module effectively you must either require ``CMake >=
-2.6.3`` with  :command:`cmake_minimum_required(VERSION 2.6.3)` or download
-and place :module:`FindOpenThreads`, :module:`Findosg` functions,
-:module:`Findosg` and ``Find<etc>.cmake`` files into your
-:variable:`CMAKE_MODULE_PATH`.
+  #include <osg/PositionAttitudeTransform>
 
-==================================
+Headers for the OpenSceneGraph libraries and NodeKits follow a similar inclusion
+structure, for example:
 
-This module accepts the following variables (note mixed case)
+.. code-block:: c++
 
-::
+  #include <osgAnimation/Animation>
+  #include <osgDB/DatabasePager>
+  #include <osgFX/BumpMapping>
+  // ...
 
-    OpenSceneGraph_DEBUG - Enable debugging output
+.. _`OpenSceneGraph`: https://openscenegraph.github.io/openscenegraph.io/
 
+Components
+^^^^^^^^^^
 
+OpenSceneGraph toolkit consists of the core library osg, and additional
+libraries, which can be optionally specified as components with the
+:command:`find_package` command:
 
-::
+.. code-block:: cmake
 
-    OpenSceneGraph_MARK_AS_ADVANCED - Mark cache variables as advanced
-                                      automatically
+  find_package(OpenSceneGraph [COMPONENTS <components>...])
 
+Supported components include:
 
+``osg``
+  Finds the core osg library (``libosg``), required to use OpenSceneGraph.
+  This component is always automatically implied.
 
-The following environment variables are also respected for finding the
-OSG and it's various components.  :variable:`CMAKE_PREFIX_PATH` can also be
-used for this (see :command:`find_library` CMake documentation).
+``OpenThreads``
+  Finds the dependent OpenThreads library (``libOpenThreads``) via the
+  :module:`FindOpenThreads` module.  This component is always automatically
+  implied as it is required to use OpenSceneGraph.
 
-``<MODULE>_DIR``
-  (where ``MODULE`` is of the form "OSGVOLUME" and there is
-  a :module:`FindosgVolume`.cmake` file)
+``osgAnimation``
+  Finds the osgAnimation library, which provides general purpose utility classes
+  for animation.
+
+``osgDB``
+  Finds the osgDB library for reading and writing scene graphs support.
+
+``osgFX``
+  Finds the osgFX NodeKit, which provides a framework for implementing special
+  effects.
+
+``osgGA``
+  Finds the osgGA (GUI Abstraction) library, which provides facilities to work
+  with varying window systems.
+
+``osgIntrospection``
+  Finds the osgIntrospection library, which provides a reflection framework for
+  accessing and invoking class properties and methods at runtime without
+  modifying the classes.
+
+  .. note::
+    The osgIntrospection library has been removed from the OpenSceneGraph
+    toolkit as of OpenSceneGraph version 3.0.
+
+``osgManipulator``
+  Finds the osgManipulator NodeKit, which provides support for 3D interactive
+  manipulators.
+
+``osgParticle``
+  Finds the osgParticle NodeKit, which provides support for particle effects.
+
+``osgPresentation``
+  Finds the osgPresentation NodeKit, which provides support for 3D scene graph
+  based presentations.
+
+  .. note::
+    This NodeKit has been added in OpenSceneGraph 3.0.0.
+
+``osgProducer``
+  Finds the osgProducer utility library, which provides functionality for window
+  management and event handling.
+
+  .. note::
+    The osgProducer has been removed from early versions of OpenSceneGraph
+    toolkit 1.x, and has been superseded by the osgViewer library.
+
+``osgQt``
+  Finds the osgQt NodeKit, which provides various classes to aid the integration
+  of Qt.
+
+  .. note::
+    As of OpenSceneGraph version 3.6, this NodeKit has been moved to its own
+    repository.
+
+``osgShadow``
+  Finds the osgShadow NodeKit, which provides support for a range of shadow
+  techniques.
+
+``osgSim``
+  Finds the osgSim NodeKit, which adds support for simulation features like
+  navigation lights and OpenFlight-style movement controls.
+
+``osgTerrain``
+  Finds the osgTerrain NodeKit, which provides geospecifc terrain rendering
+  support.
+
+``osgText``
+  Finds the osgText NodeKit, which provides high quality text support.
+
+``osgUtil``
+  Finds the osgUtil library, which provides general-purpose utilities like
+  update, cull, and draw traversals, as well as scene graph tools such as
+  optimization, triangle stripping, and tessellation.
+
+``osgViewer``
+  Finds the osgViewer library, which provides high level viewer functionality.
+
+``osgVolume``
+  Finds the osgVolume NodeKit, which provides volume rendering support.
+
+``osgWidget``
+  Finds the osgWidget NodeKit, which provides support for 2D and 3D GUI widget
+  sets.
+
+If no components are specified, this module searches for the ``osg`` and
+``OpenThreads`` components by default.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module defines the following variables:
+
+``OpenSceneGraph_FOUND``
+  Boolean indicating whether the (requested version of) OpenSceneGraph with all
+  specified components is found.  For backward compatibility, the
+  ``OPENSCENEGRAPH_FOUND`` variable is also set to the same value.
+
+``OPENSCENEGRAPH_VERSION``
+  The version of the OSG which was found.
+
+``OPENSCENEGRAPH_INCLUDE_DIRS``
+  Include directories containing headers needed to use OpenSceneGraph.
+
+``OPENSCENEGRAPH_LIBRARIES``
+  Libraries needed to link against to use OpenSceneGraph.
+
+Hints
+^^^^^
+
+This module accepts the following variables:
+
+``OpenSceneGraph_DEBUG``
+  Set this variable to boolean true to enable debugging output by this module.
+
+``OpenSceneGraph_MARK_AS_ADVANCED``
+  Set this variable to boolean true to mark cache variables of this module as
+  advanced automatically.
+
+To help this module find OpenSceneGraph and its various components installed in
+custom location, :variable:`CMAKE_PREFIX_PATH` variable can be used.
+Additionally, the following variables are also respected:
+
+``<COMPONENT>_DIR``
+  Environment or CMake variable that can be set to the root of the OSG common
+  installation, where ``<COMPONENT>`` is the uppercase form of component listed
+  above.  For example, ``OSGVOLUME_DIR`` to find the ``osgVolume`` component.
+
 ``OSG_DIR``
-  ..
+  Environment or CMake variable that can be set to influence detection of
+  OpenSceneGraph installation root location as a whole.
+
 ``OSGDIR``
-  ..
+  Environment variable treated the same as ``OSG_DIR``.
+
 ``OSG_ROOT``
-  ..
+  Environment variable treated the same as ``OSG_DIR``.
 
+Examples
+^^^^^^^^
 
-[CMake 2.8.10]: The CMake variable ``OSG_DIR`` can now be used as well to
-influence detection, instead of needing to specify an environment
-variable.
-
-This module defines the following output variables:
-
-::
-
-    OPENSCENEGRAPH_FOUND - Was the OSG and all of the specified components found?
-
-
-
-::
-
-    OPENSCENEGRAPH_VERSION - The version of the OSG which was found
-
-
-
-::
-
-    OPENSCENEGRAPH_INCLUDE_DIRS - Where to find the headers
-
-
-
-::
-
-    OPENSCENEGRAPH_LIBRARIES - The OSG libraries
-
-
-
-================================== Example Usage:
+Finding the OpenSceneGraph with ``osgDB`` and ``osgUtil`` libraries specified as
+components and creating an interface :ref:`imported target <Imported Targets>`
+that encapsulates its usage requirements for linking to a project target:
 
 .. code-block:: cmake
 
-  find_package(OpenSceneGraph 2.0.0 REQUIRED osgDB osgUtil)
-      # libOpenThreads & libosg automatically searched
-  include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS})
+  find_package(OpenSceneGraph 2.0.0 REQUIRED COMPONENTS osgDB osgUtil)
 
-
-
-.. code-block:: cmake
+  if(OpenSceneGraph_FOUND AND NOT TARGET OpenSceneGraph::OpenSceneGraph)
+    add_library(OpenSceneGraph::OpenSceneGraph INTERFACE IMPORTED)
+    set_target_properties(
+      OpenSceneGraph::OpenSceneGraph
+      PROPERTIES
+        INTERFACE_INCLUDE_DIRECTORIES "${OPENSCENEGRAPH_INCLUDE_DIRS}"
+        INTERFACE_LINK_LIBRARIES "${OPENSCENEGRAPH_LIBRARIES}"
+    )
+  endif()
 
   add_executable(foo foo.cc)
-  target_link_libraries(foo ${OPENSCENEGRAPH_LIBRARIES})
+
+  target_link_libraries(foo PRIVATE OpenSceneGraph::OpenSceneGraph)
+
+See Also
+^^^^^^^^
+
+The following OpenSceneGraph-related helper find modules are used internally by
+this module when finding specific OpenSceneGraph components.  These modules are
+not intended to be included or invoked directly by project code during typical
+use of ``find_package(OpenSceneGraph)``.  However, they can be useful for
+advanced scenarios where finer control over component detection is needed.  For
+example, to find them explicitly and override or bypass detection of specific
+OpenSceneGraph components:
+
+* The :module:`Findosg` module to find the core osg library.
+* The :module:`FindosgAnimation` module to find osgAnimation.
+* The :module:`FindosgDB` module to find osgDB.
+* The :module:`FindosgFX` module to find osgDB.
+* The :module:`FindosgGA` module to find osgGA.
+* The :module:`FindosgIntrospection` module to find osgIntrospection.
+* The :module:`FindosgManipulator` module to find osgManipulator.
+* The :module:`FindosgParticle` module to find osgParticle.
+* The :module:`FindosgPresentation` module to find osgPresentation.
+* The :module:`FindosgProducer` module to find osgProducer.
+* The :module:`FindosgQt` module to find osgQt.
+* The :module:`FindosgShadow` module to find osgShadow.
+* The :module:`FindosgSim` module to find osgSim.
+* The :module:`FindosgTerrain` module to find osgTerrain.
+* The :module:`FindosgText` module to find osgText.
+* The :module:`FindosgUtil` module to find osgUtil.
+* The :module:`FindosgViewer` module to find osgViewer.
+* The :module:`FindosgVolume` module to find osgVolume.
+* The :module:`FindosgWidget` module to find osgWidget.
 #]=======================================================================]
 
 cmake_policy(PUSH)
 cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
 
-#
-# Naming convention:
-#  Local variables of the form _osg_foo
-#  Input variables of the form OpenSceneGraph_FOO
-#  Output variables of the form OPENSCENEGRAPH_FOO
-#
-
 include(${CMAKE_CURRENT_LIST_DIR}/Findosg_functions.cmake)
 
 set(_osg_modules_to_process)