# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindOpenThreads
---------------

Finds the OpenThreads C++ based threading library.

OpenThreads header files are intended to be included as:

.. code-block:: c++
  :caption: ``example.cxx``

  #include <OpenThreads/Thread>

Result Variables
^^^^^^^^^^^^^^^^

This module defines the following variables:

``OpenThreads_FOUND``
  Boolean indicating whether OpenThreads library is found.  For backward
  compatibility, the ``OPENTHREADS_FOUND`` variable is also set to the same
  value.

``OPENTHREADS_LIBRARY``
  Libraries needed to link against to use OpenThreads.  This provides either
  release (optimized) or debug library variant, which are found separately
  depending on the project's :ref:`Build Configurations`.

Cache Variables
^^^^^^^^^^^^^^^

The following cache variables may also be set:

``OPENTHREADS_INCLUDE_DIR``
  The directory containing the header files needed to use OpenThreads.

Hints
^^^^^

This module accepts the following variables:

``OPENTHREADS_DIR``
  An environment or CMake variable that can be set to help find an OpenThreads
  library installed in a custom location.  It should point to the installation
  destination that was used when configuring, building, and installing
  OpenThreads library: ``./configure --prefix=$OPENTHREADS_DIR``.

This module was originally introduced to support the
:module:`FindOpenSceneGraph` module and its components.  To simplify one-step
automated configuration and builds when the OpenSceneGraph package is developed
and distributed upstream, this module supports additional environment variables
to find dependencies in specific locations.  This approach is used by upstream
package over specifying ``-DVAR=value`` on the command line because it offers
better isolation from internal changes to the module and allows more flexibility
when specifying individual OSG components independently of the ``CMAKE_*_PATH``
variables.  Explicit ``-DVAR=value`` arguments can still override these settings
if needed.  Since OpenThreads is an optional standalone dependency of
OpenSceneGraph, this module also honors the following variables for convenience:

``OSG_DIR``
  May be set as an environment or CMake variable. Treated the same as
  ``OPENTHREADS_DIR``.

``OSGDIR``
  Environment variable treated the same as ``OPENTHREADS_DIR``.

Examples
^^^^^^^^

Finding the OpenThreads library 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(OpenThreads)

  if(OpenThreads_FOUND AND NOT TARGET OpenThreads::OpenThreads)
    add_library(OpenThreads::OpenThreads INTERFACE IMPORTED)
    set_target_properties(
      OpenThreads::OpenThreads
      PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${OPENTHREADS_INCLUDE_DIR}"
        INTERFACE_LINK_LIBRARIES "${OPENTHREADS_LIBRARY}"
    )
  endif()

  target_link_libraries(example PRIVATE OpenThreads::OpenThreads)
#]=======================================================================]

include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)

find_path(OPENTHREADS_INCLUDE_DIR OpenThreads/Thread
    HINTS
        ENV OPENTHREADS_INCLUDE_DIR
        ENV OPENTHREADS_DIR
        ENV OSG_INCLUDE_DIR
        ENV OSG_DIR
        ENV OSGDIR
        ENV OpenThreads_ROOT
        ENV OSG_ROOT
        ${OPENTHREADS_DIR}
        ${OSG_DIR}
    PATH_SUFFIXES include
)

find_library(OPENTHREADS_LIBRARY_RELEASE
    NAMES OpenThreads OpenThreadsWin32
    HINTS
        ENV OPENTHREADS_LIBRARY_DIR
        ENV OPENTHREADS_DIR
        ENV OSG_LIBRARY_DIR
        ENV OSG_DIR
        ENV OSGDIR
        ENV OpenThreads_ROOT
        ENV OSG_ROOT
        ${OPENTHREADS_DIR}
        ${OSG_DIR}
    PATH_SUFFIXES lib
)

find_library(OPENTHREADS_LIBRARY_DEBUG
    NAMES OpenThreadsd OpenThreadsWin32d
    HINTS
        ENV OPENTHREADS_DEBUG_LIBRARY_DIR
        ENV OPENTHREADS_LIBRARY_DIR
        ENV OPENTHREADS_DIR
        ENV OSG_LIBRARY_DIR
        ENV OSG_DIR
        ENV OSGDIR
        ENV OpenThreads_ROOT
        ENV OSG_ROOT
        ${OPENTHREADS_DIR}
        ${OSG_DIR}
    PATH_SUFFIXES lib
)

select_library_configurations(OPENTHREADS)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(OpenThreads DEFAULT_MSG
    OPENTHREADS_LIBRARY OPENTHREADS_INCLUDE_DIR)
