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

#[=======================================================================[.rst:
FindPatch
---------

.. versionadded:: 3.10

Finds the ``patch`` command-line executable for applying diff patches to
original files:

.. code-block:: cmake

  find_package(Patch [...])

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

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

``Patch::patch``
  Target encapsulating the ``patch`` command-line executable, available only if
  ``patch`` is found.

  .. versionchanged:: 4.0
    This imported target is defined only when :prop_gbl:`CMAKE_ROLE` is
    ``PROJECT``.

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

This module defines the following variables:

``Patch_FOUND``
  Boolean indicating whether the ``patch`` command-line executable is found.

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

The following cache variables may also be set:

``Patch_EXECUTABLE``
  The path to the ``patch`` command-line executable.

Examples
^^^^^^^^

Finding ``patch`` command and executing it in a process:

.. code-block:: cmake

  find_package(Patch)
  if(Patch_FOUND)
    execute_process(
      COMMAND ${Patch_EXECUTABLE} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/src.patch
    )
  endif()

The imported target can be used, for example, inside the
:command:`add_custom_command` command, which patches the given file when some
build rule depends on its output:

.. code-block:: cmake

  find_package(Patch)
  if(TARGET Patch::patch)
    # Executed when some build rule depends on the src.c file.
    add_custom_command(
      OUTPUT src.c
      COMMAND Patch::patch -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/src.patch
      # ...
    )
  endif()
#]=======================================================================]

set(_doc "Patch command line executable")
set(_patch_path )

if(CMAKE_HOST_WIN32)
  set(_patch_path
    "$ENV{LOCALAPPDATA}/Programs/Git/bin"
    "$ENV{LOCALAPPDATA}/Programs/Git/usr/bin"
    "$ENV{APPDATA}/Programs/Git/bin"
    "$ENV{APPDATA}/Programs/Git/usr/bin"
    )
endif()

# First search the PATH
find_program(Patch_EXECUTABLE
  NAMES patch
  PATHS ${_patch_path}
  DOC ${_doc}
  )

if(CMAKE_HOST_WIN32)
  # Now look for installations in Git/ directories under typical installation
  # prefixes on Windows.
  find_program(Patch_EXECUTABLE
    NAMES patch
    PATH_SUFFIXES Git/usr/bin Git/bin GnuWin32/bin
    DOC ${_doc}
    )
endif()

mark_as_advanced(Patch_EXECUTABLE)

get_property(_patch_role GLOBAL PROPERTY CMAKE_ROLE)

if(
  _patch_role STREQUAL "PROJECT"
  AND Patch_EXECUTABLE
  AND NOT TARGET Patch::patch
)
  add_executable(Patch::patch IMPORTED)
  set_property(TARGET Patch::patch PROPERTY IMPORTED_LOCATION ${Patch_EXECUTABLE})
endif()

unset(_patch_path)
unset(_patch_role)
unset(_doc)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Patch
                                  REQUIRED_VARS Patch_EXECUTABLE)
