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

#[=======================================================================[.rst:
FindGnuTLS
----------

Finds the GNU Transport Layer Security library (GnuTLS):

.. code-block:: cmake

  find_package(GnuTLS [<version>] [...])

The GnuTLS package includes the main libraries (libgnutls and libdane), as
well as the optional gnutls-openssl compatibility extra library.  They are
all distributed as part of the same release.  This module checks for the
presence of the main libgnutls library and provides usage requirements for
integrating GnuTLS into CMake projects.

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

This module provides the following :ref:`Imported Targets`:

``GnuTLS::GnuTLS``
  .. versionadded:: 3.16

  Target encapsulating the GnuTLS usage requirements, available if GnuTLS is
  found.

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

This module defines the following variables:

``GnuTLS_FOUND``
  Boolean indicating whether (the requested version of) GnuTLS is found.  For
  backward compatibility, the ``GNUTLS_FOUND`` variable is also set to the same
  value.

``GnuTLS_VERSION``
  .. versionadded:: 4.2

  The version of GnuTLS found.

``GNUTLS_INCLUDE_DIRS``
  Include directories needed to use GnuTLS.

``GNUTLS_LIBRARIES``
  Libraries needed to link against to use GnuTLS.

``GNUTLS_DEFINITIONS``
  Compiler options required for using GnuTLS.

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

The following cache variables may also be set:

``GNUTLS_INCLUDE_DIR``
  The directory containing the ``gnutls/gnutls.h`` header file.

``GNUTLS_LIBRARY``
  The path to the GnuTLS library.

Deprecated Variables
^^^^^^^^^^^^^^^^^^^^

The following variables are provided for backward compatibility:

``GNUTLS_VERSION_STRING``
  .. deprecated:: 3.16
    Use the ``GnuTLS_VERSION``, which has the same value.

``GNUTLS_VERSION``
  .. versionadded:: 3.16
  .. deprecated:: 4.2
    Use the ``GnuTLS_VERSION``, which has the same value.

Examples
^^^^^^^^

Finding GnuTLS and linking it to a project target:

.. code-block:: cmake

  find_package(GnuTLS)
  target_link_libraries(project_target PRIVATE GnuTLS::GnuTLS)
#]=======================================================================]

cmake_policy(PUSH)
cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>

if (GNUTLS_INCLUDE_DIR AND GNUTLS_LIBRARY)
  # in cache already
  set(gnutls_FIND_QUIETLY TRUE)
endif ()

if (NOT WIN32)
  # try using pkg-config to get the directories and then use these values
  # in the find_path() and find_library() calls
  # also fills in GNUTLS_DEFINITIONS, although that isn't normally useful
  find_package(PkgConfig QUIET)
  if(PkgConfig_FOUND)
    pkg_check_modules(PC_GNUTLS QUIET gnutls)
  endif()
  set(GNUTLS_DEFINITIONS ${PC_GNUTLS_CFLAGS_OTHER})
endif ()

find_path(GNUTLS_INCLUDE_DIR gnutls/gnutls.h
  HINTS
    ${PC_GNUTLS_INCLUDEDIR}
    ${PC_GNUTLS_INCLUDE_DIRS}
  )

find_library(GNUTLS_LIBRARY NAMES gnutls libgnutls
  HINTS
    ${PC_GNUTLS_LIBDIR}
    ${PC_GNUTLS_LIBRARY_DIRS}
  )

mark_as_advanced(GNUTLS_INCLUDE_DIR GNUTLS_LIBRARY)

if(GNUTLS_INCLUDE_DIR AND EXISTS "${GNUTLS_INCLUDE_DIR}/gnutls/gnutls.h")
  file(
    STRINGS
    "${GNUTLS_INCLUDE_DIR}/gnutls/gnutls.h"
    gnutls_version
    # GnuTLS versions prior to 2.7.2 defined LIBGNUTLS_VERSION instead of the
    # current GNUTLS_VERSION.
    REGEX "^#define[\t ]+(LIB)?GNUTLS_VERSION[\t ]+\".*\""
  )

  string(
    REGEX REPLACE
    "^.*GNUTLS_VERSION[\t ]+\"([^\"]*)\".*$"
    "\\1"
    GnuTLS_VERSION
    "${gnutls_version}"
  )
  unset(gnutls_version)

  # Fallback to version defined by pkg-config if not successful.
  if(
    NOT GnuTLS_VERSION
    AND PC_GNUTLS_VERSION
    AND GNUTLS_INCLUDE_DIR IN_LIST PC_GNUTLS_INCLUDE_DIRS
  )
    set(GnuTLS_VERSION "${PC_GNUTLS_VERSION}")
  endif()

  # For backward compatibility.
  set(GNUTLS_VERSION "${GnuTLS_VERSION}")
  set(GNUTLS_VERSION_STRING "${GnuTLS_VERSION}")
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GnuTLS
                                  REQUIRED_VARS GNUTLS_LIBRARY GNUTLS_INCLUDE_DIR
                                  VERSION_VAR GnuTLS_VERSION)

if(GnuTLS_FOUND)
  set(GNUTLS_LIBRARIES    ${GNUTLS_LIBRARY})
  set(GNUTLS_INCLUDE_DIRS ${GNUTLS_INCLUDE_DIR})

  if(NOT TARGET GnuTLS::GnuTLS)
    add_library(GnuTLS::GnuTLS UNKNOWN IMPORTED)
    set_target_properties(GnuTLS::GnuTLS PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${GNUTLS_INCLUDE_DIRS}"
      INTERFACE_COMPILE_DEFINITIONS "${GNUTLS_DEFINITIONS}"
      IMPORTED_LINK_INTERFACE_LANGUAGES "C"
      IMPORTED_LOCATION "${GNUTLS_LIBRARIES}")
  endif()
endif()

cmake_policy(POP)
