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

#[=======================================================================[.rst:
FindJsonCpp
-----------

Find JsonCpp includes and library.

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

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

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

This module defines the following variables:

``JsonCpp_FOUND``
  Boolean indicating whether (the requested version of) JsonCpp was found.
``JsonCpp_VERSION``
  The version of JsonCpp found.
  May not be set for JsonCpp versions prior to 1.0.
``JsonCpp_VERSION_MAJOR``
  The major version of JsonCpp.
``JsonCpp_VERSION_MINOR``
  The minor version of JsonCpp.
``JsonCpp_VERSION_PATCH``
  The patch version of JsonCpp.
``JsonCpp_INCLUDE_DIRS``
  Include directories needed to include JsonCpp headers.
``JsonCpp_LIBRARIES``
  Libraries needed to link to JsonCpp.

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

This module uses the following cache variables:

``JsonCpp_LIBRARY``
  The location of the JsonCpp library file.
``JsonCpp_INCLUDE_DIR``
  The location of the JsonCpp include directory containing ``json/json.h``.

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

#-----------------------------------------------------------------------------
find_library(JsonCpp_LIBRARY
  NAMES jsoncpp
  )
mark_as_advanced(JsonCpp_LIBRARY)

find_path(JsonCpp_INCLUDE_DIR
  NAMES json/json.h
  PATH_SUFFIXES jsoncpp
  )
mark_as_advanced(JsonCpp_INCLUDE_DIR)

#-----------------------------------------------------------------------------
# Extract version number if possible.
set(_JsonCpp_H_REGEX "^#[ \t]*define[ \t]+JSONCPP_VERSION_STRING[ \t]+\"(([0-9]+)\\.([0-9]+)\\.([0-9]+)[^\"]*)\".*$")
if(JsonCpp_INCLUDE_DIR AND EXISTS "${JsonCpp_INCLUDE_DIR}/json/version.h")
  file(STRINGS "${JsonCpp_INCLUDE_DIR}/json/version.h" _JsonCpp_H REGEX "${_JsonCpp_H_REGEX}")
else()
  set(_JsonCpp_H "")
endif()
if(_JsonCpp_H MATCHES "${_JsonCpp_H_REGEX}")
  set(JsonCpp_VERSION "${CMAKE_MATCH_1}")
  set(JsonCpp_VERSION_MAJOR "${CMAKE_MATCH_2}")
  set(JsonCpp_VERSION_MINOR "${CMAKE_MATCH_3}")
  set(JsonCpp_VERSION_PATCH "${CMAKE_MATCH_4}")
else()
  set(JsonCpp_VERSION "")
  set(JsonCpp_VERSION_MAJOR "")
  set(JsonCpp_VERSION_MINOR "")
  set(JsonCpp_VERSION_PATCH "")
endif()
unset(_JsonCpp_H_REGEX)
unset(_JsonCpp_H)

#-----------------------------------------------------------------------------
include(${CMAKE_CURRENT_LIST_DIR}/../../Modules/FindPackageHandleStandardArgs.cmake)
find_package_handle_standard_args(JsonCpp
  REQUIRED_VARS JsonCpp_LIBRARY JsonCpp_INCLUDE_DIR
  VERSION_VAR JsonCpp_VERSION
  )

#-----------------------------------------------------------------------------
# Provide documented result variables and targets.
if(JsonCpp_FOUND)
  set(JsonCpp_INCLUDE_DIRS ${JsonCpp_INCLUDE_DIR})
  set(JsonCpp_LIBRARIES ${JsonCpp_LIBRARY})
  if(NOT TARGET JsonCpp::JsonCpp)
    add_library(JsonCpp::JsonCpp UNKNOWN IMPORTED)
    set_target_properties(JsonCpp::JsonCpp PROPERTIES
      IMPORTED_LOCATION "${JsonCpp_LIBRARY}"
      INTERFACE_INCLUDE_DIRECTORIES "${JsonCpp_INCLUDE_DIRS}"
      IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
      )
  endif()
endif()
