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

#[=======================================================================[.rst:
FindLibinput
------------

.. versionadded:: 3.14

Finds the libinput library which handles input devices in Wayland compositors
and provides a generic X.Org input driver.

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

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

``Libinput::Libinput``
  Target encapsulating the libinput library usage requirements, available only
  if library is found.

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

This module defines the following variables:

``Libinput_FOUND``
  Boolean indicating whether the (requested version of) libinput library is
  found.
``Libinput_VERSION``
  The version of the libinput found.
``Libinput_LIBRARIES``
  The libraries to link against to use the libinput library.
``Libinput_INCLUDE_DIRS``
  The include directories containing headers needed to use the libinput library.
``Libinput_COMPILE_OPTIONS``
  Compile options needed to use the libinput library.  These can be passed to
  the :command:`target_compile_options` command, when not using the
  ``Libinput::Libinput`` imported target.

Examples
^^^^^^^^

Finding the libinput library and linking it to a project target:

.. code-block:: cmake

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


# Use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
  pkg_check_modules(PKG_Libinput QUIET libinput)
endif()

set(Libinput_COMPILE_OPTIONS ${PKG_Libinput_CFLAGS_OTHER})
set(Libinput_VERSION ${PKG_Libinput_VERSION})

find_path(Libinput_INCLUDE_DIR
  NAMES
    libinput.h
  HINTS
    ${PKG_Libinput_INCLUDE_DIRS}
)
find_library(Libinput_LIBRARY
  NAMES
    input
  HINTS
    ${PKG_Libinput_LIBRARY_DIRS}
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Libinput
  REQUIRED_VARS
    Libinput_LIBRARY
    Libinput_INCLUDE_DIR
  VERSION_VAR
    Libinput_VERSION
)

if(Libinput_FOUND AND NOT TARGET Libinput::Libinput)
  add_library(Libinput::Libinput UNKNOWN IMPORTED)
  set_target_properties(Libinput::Libinput PROPERTIES
    IMPORTED_LOCATION "${Libinput_LIBRARY}"
    INTERFACE_COMPILE_OPTIONS "${Libinput_COMPILE_OPTIONS}"
    INTERFACE_INCLUDE_DIRECTORIES "${Libinput_INCLUDE_DIR}"
  )
endif()

mark_as_advanced(Libinput_LIBRARY Libinput_INCLUDE_DIR)

if(Libinput_FOUND)
  set(Libinput_LIBRARIES ${Libinput_LIBRARY})
  set(Libinput_INCLUDE_DIRS ${Libinput_INCLUDE_DIR})
endif()
