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

#[=======================================================================[.rst:
FindLibRHash
------------

Find LibRHash include directory and library.

Imported Targets
^^^^^^^^^^^^^^^^

An :ref:`imported target <Imported targets>` named
``LibRHash::LibRHash`` is provided if LibRHash has been found.

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

This module defines the following variables:

``LibRHash_FOUND``
  True if LibRHash was found, false otherwise.
``LibRHash_INCLUDE_DIRS``
  Include directories needed to include LibRHash headers.
``LibRHash_LIBRARIES``
  Libraries needed to link to LibRHash.

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

This module uses the following cache variables:

``LibRHash_LIBRARY``
  The location of the LibRHash library file.
``LibRHash_INCLUDE_DIR``
  The location of the LibRHash include directory containing ``rhash.h``.

The cache variables should not be used by project code.
They may be set by end users to point at LibRHash components.
#]=======================================================================]

#-----------------------------------------------------------------------------
find_library(LibRHash_LIBRARY
  NAMES rhash
  )
mark_as_advanced(LibRHash_LIBRARY)

find_path(LibRHash_INCLUDE_DIR
  NAMES rhash.h
  )
mark_as_advanced(LibRHash_INCLUDE_DIR)

#-----------------------------------------------------------------------------
include(${CMAKE_CURRENT_LIST_DIR}/../../Modules/FindPackageHandleStandardArgs.cmake)
find_package_handle_standard_args(LibRHash
  REQUIRED_VARS LibRHash_LIBRARY LibRHash_INCLUDE_DIR
  )

#-----------------------------------------------------------------------------
# Provide documented result variables and targets.
if(LibRHash_FOUND)
  set(LibRHash_INCLUDE_DIRS ${LibRHash_INCLUDE_DIR})
  set(LibRHash_LIBRARIES ${LibRHash_LIBRARY})
  if(NOT TARGET LibRHash::LibRHash)
    add_library(LibRHash::LibRHash UNKNOWN IMPORTED)
    set_target_properties(LibRHash::LibRHash PROPERTIES
      IMPORTED_LOCATION "${LibRHash_LIBRARY}"
      INTERFACE_INCLUDE_DIRECTORIES "${LibRHash_INCLUDE_DIRS}"
      )
  endif()
endif()
