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
15 get_filename_component(GIT_DIR ${GIT_EXECUTABLE} DIRECTORY)
18 find_program(PATCH_EXE NAMES patch.exe HINTS "${GIT_DIR}/.." PATH_SUFFIXES usr/bin)
20 # Freebsd patch is insufficient (too old) look for gnu patch first
21 find_program(PATCH_EXE NAMES gpatch patch)
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}")
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})
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}")
53 # copy patch.exe into the output directory
54 file(INSTALL "${PATCH_PATH}/bin/patch.exe" DESTINATION ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/bin)
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)
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)
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}")
73 include(FindPackageHandleStandardArgs)
74 find_package_handle_standard_args(Patch REQUIRED_VARS PATCH_EXE VERSION_VAR PATCH_VERSION)
77 set(PATCH_EXECUTABLE "${PATCH_EXE}")
78 mark_as_advanced(PATCH_EXE)