mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-01 11:22:21 -06:00
- Extended the examples section. - Module documentation synced with other find modules a bit. - Patch_FOUND variable used. The PATCH_FOUND is also set by the find_package_handle_standard_args().
122 lines
2.9 KiB
CMake
122 lines
2.9 KiB
CMake
# 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.
|
|
|
|
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)
|