Merge pull request #26287 from CrystalP/ref-savefilestatejob
[xbmc.git] / cmake / modules / buildtools / FindPatch.cmake
blob83a7ea035f186925a9f82ce8c06e2fd3c352403d
1 #.rst:
2 # FindPatch
3 # ----------
4 # Finds patch executable
5 # Windows platforms will download patch zip from mirrors if not found.
7 # This will define the following variables::
9 # PATCH_EXECUTABLE - patch executable
11 if(CMAKE_HOST_WIN32)
13   find_package(Git)
14   if(Git_FOUND)
15     get_filename_component(GIT_DIR ${GIT_EXECUTABLE} DIRECTORY)
16   endif()
18   find_program(PATCH_EXE NAMES patch.exe HINTS "${GIT_DIR}/.." PATH_SUFFIXES usr/bin)
19 else()
20   # Freebsd patch is insufficient (too old) look for gnu patch first
21   find_program(PATCH_EXE NAMES gpatch patch)
22 endif()
24 if(CMAKE_HOST_WIN32 AND NOT PATCH_EXE)
25   set(PATCH_ARCHIVE_NAME "patch-2.7.6-bin")
26   set(PATCH_ARCHIVE "${PATCH_ARCHIVE_NAME}.zip")
27   set(PATCH_URL "${KODI_MIRROR}/build-deps/win32/${PATCH_ARCHIVE}")
28   set(PATCH_DOWNLOAD ${TARBALL_DIR}/${PATCH_ARCHIVE})
30   # download the archive containing patch.exe
31   message(STATUS "Downloading patch utility from ${PATCH_URL}...")
32   file(DOWNLOAD "${PATCH_URL}" "${PATCH_DOWNLOAD}" STATUS PATCH_DL_STATUS LOG PATCH_LOG SHOW_PROGRESS)
33   list(GET PATCH_DL_STATUS 0 PATCH_RETCODE)
34   if(NOT PATCH_RETCODE EQUAL 0)
35     message(FATAL_ERROR "ERROR downloading ${PATCH_URL} - status: ${PATCH_DL_STATUS} log: ${PATCH_LOG}")
36   endif()
38   # CORE_BUILD_DIR may not exist as yet, so create just in case
39   if(NOT EXISTS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR})
40     file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR})
41   endif()
43   # extract the archive containing patch.exe
44   execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzvf ${PATCH_DOWNLOAD}
45                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR})
47   # make sure the extraction worked and that patch.exe is there
48   set(PATCH_PATH ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${PATCH_ARCHIVE_NAME})
49   if(NOT EXISTS "${PATCH_PATH}/bin/patch.exe")
50     message(FATAL_ERROR "ERROR extracting patch utility from ${PATCH_PATH}")
51   endif()
53   # copy patch.exe into the output directory
54   file(INSTALL "${PATCH_PATH}/bin/patch.exe" DESTINATION ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/bin)
55   # copy patch depends
56   file(GLOB PATCH_BINARIES ${PATCH_PATH}/bin/*.dll)
57   if(NOT "${PATCH_BINARIES}" STREQUAL "")
58     file(INSTALL ${PATCH_BINARIES} DESTINATION ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/bin)
59   endif()
61   # make sure that cmake can find the copied patch.exe
62   find_program(PATCH_EXE NAMES patch.exe HINTS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/bin REQUIRED)
63 endif()
65 if(PATCH_EXE)
66   execute_process(COMMAND "${PATCH_EXE}" --version
67                   OUTPUT_VARIABLE PATCH_VERSION
68                   OUTPUT_STRIP_TRAILING_WHITESPACE)
69   string(REGEX MATCH "[^\n]*patch [^\n]*" PATCH_VERSION "${PATCH_VERSION}")
70   string(REGEX REPLACE ".*patch (.*)" "\\1" PATCH_VERSION "${PATCH_VERSION}")
71 endif()
73 include(FindPackageHandleStandardArgs)
74 find_package_handle_standard_args(Patch REQUIRED_VARS PATCH_EXE VERSION_VAR PATCH_VERSION)
76 if(PATCH_FOUND)
77   set(PATCH_EXECUTABLE "${PATCH_EXE}")
78   mark_as_advanced(PATCH_EXE)
79 endif()