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

#[=======================================================================[.rst:
FindPackageMessage
------------------

This module provides a command for printing find result messages and is
intended for use in :ref:`Find Modules`.

Load it in a CMake find module with:

.. code-block:: cmake

  include(FindPackageMessage)

Commands
^^^^^^^^

This module provides the following command:

.. command:: find_package_message

  Prints a message once for each unique find result to inform the user which
  package was found and where:

  .. code-block:: cmake

    find_package_message(<PackageName> <message> <details>)

  ``<PackageName>``
    The name of the package (for example, as used in the
    ``Find<PackageName>.cmake`` module filename).

  ``<message>``
    The message string to display.

  ``<details>``
    A unique identifier for tracking message display.  The ``<message>`` is
    printed only once per distinct ``<details>`` value.  If ``<details>`` string
    changes in a subsequent configuration phase, the message will be displayed
    again.

  If :command:`find_package` was called with the ``QUIET`` option, the
  ``<message>`` is not printed.

Examples
^^^^^^^^

Printing a result message in a custom find module:

.. code-block:: cmake
  :caption: ``FindFoo.cmake``

  find_library(Foo_LIBRARY foo)
  find_path(Foo_INCLUDE_DIR foo.h)

  include(FindPackageMessage)

  if(Foo_LIBRARY AND Foo_INCLUDE_DIR)
    find_package_message(
      Foo
      "Found Foo: ${Foo_LIBRARY}"
      "[${Foo_LIBRARY}][${Foo_INCLUDE_DIR}]"
    )
  else()
    message(STATUS "Could NOT find Foo")
  endif()

When writing standard find modules, use the
:module:`FindPackageHandleStandardArgs` module and its
:command:`find_package_handle_standard_args` command which automatically
prints the find result message based on whether the package was found:

.. code-block:: cmake
  :caption: ``FindFoo.cmake``

  # ...

  include(FindPackageHandleStandardArgs)

  find_package_handle_standard_args(
    Foo
    REQUIRED_VARS Foo_LIBRARY Foo_INCLUDE_DIR
  )
#]=======================================================================]

function(find_package_message pkg msg details)
  # Avoid printing a message repeatedly for the same find result.
  if(NOT ${pkg}_FIND_QUIETLY)
    string(REPLACE "\n" "" details "${details}")
    set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg})
    if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}")
      # The message has not yet been printed.
      string(STRIP "${msg}" msg)
      message(STATUS "${msg}")

      # Save the find details in the cache to avoid printing the same
      # message again.
      set("${DETAILS_VAR}" "${details}"
        CACHE INTERNAL "Details about finding ${pkg}")
    endif()
  endif()
endfunction()
