From 6fe543fe9d7a3fad08bdc696b854637bc54a1e4c Mon Sep 17 00:00:00 2001 From: lightmanLP Date: Sat, 1 Feb 2025 11:53:05 +0700 Subject: [PATCH] patch via cmake script --- cmake/dependencies/common.cmake | 22 ++--------- cmake/dependencies/git-patch.cmake | 59 ++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 cmake/dependencies/git-patch.cmake diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index aca61fe25..28a8719ba 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -2,25 +2,15 @@ include(FetchContent) find_package(OpenGL QUIET) -# When using the Visual Studio generator, it is necessary to suppress stderr output entirely so it does not interrupt the patch command. -# Redirecting to nul is used here instead of the `--quiet` flag, as that flag was only recently introduced in git 2.25.0 (Jan 2022) -if (CMAKE_GENERATOR MATCHES "Visual Studio") - set(git_hide_output 2> nul) -endif() - #=================== ImGui =================== set(imgui_fixes_and_config_patch_file ${CMAKE_CURRENT_SOURCE_DIR}/cmake/dependencies/patches/imgui-fixes-and-config.patch) - -# Applies the patch or checks if it has already been applied successfully previously. Will error otherwise. -set(imgui_apply_patch_if_needed git apply ${imgui_fixes_and_config_patch_file} ${git_hide_output} || git apply --reverse --check ${imgui_fixes_and_config_patch_file}) -# Resets code and reapply patch, if old (potentially incompatible) patch applied -set(imgui_apply_patch_if_needed_with_reset ${imgui_apply_patch_if_needed} || (git status --porcelain && git reset --hard && (${imgui_apply_patch_if_needed}))) +set(imgui_apply_patch_command ${CMAKE_COMMAND} -Dpatch_file=${imgui_fixes_and_config_patch_file} -Dwith_reset=TRUE -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/dependencies/git-patch.cmake) FetchContent_Declare( ImGui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG v1.91.6-docking - PATCH_COMMAND ${imgui_apply_patch_if_needed_with_reset} + PATCH_COMMAND ${imgui_apply_patch_command} ) FetchContent_MakeAvailable(ImGui) list(APPEND ADDITIONAL_LIB_INCLUDES ${imgui_SOURCE_DIR} ${imgui_SOURCE_DIR}/backends) @@ -48,17 +38,13 @@ target_include_directories(ImGui PUBLIC ${imgui_SOURCE_DIR} ${imgui_SOURCE_DIR}/ # ========= StormLib ============= if(NOT EXCLUDE_MPQ_SUPPORT) set(stormlib_patch_file ${CMAKE_CURRENT_SOURCE_DIR}/cmake/dependencies/patches/stormlib-optimizations.patch) - - # Applies the patch or checks if it has already been applied successfully previously. Will error otherwise. - set(stormlib_apply_patch_if_needed git apply ${stormlib_patch_file} ${git_hide_output} || git apply --reverse --check ${stormlib_patch_file}) - # Resets code and reapply patch, if old (potentially incompatible) patch applied - set(stormlib_apply_patch_if_needed_with_reset ${stormlib_apply_patch_if_needed} || (git status --porcelain && git reset --hard && (${stormlib_apply_patch_if_needed}))) + set(stormlib_apply_patch_command ${CMAKE_COMMAND} -Dpatch_file=${stormlib_patch_file} -Dwith_reset=TRUE -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/dependencies/git-patch.cmake) FetchContent_Declare( StormLib GIT_REPOSITORY https://github.com/ladislav-zezula/StormLib.git GIT_TAG v9.25 - PATCH_COMMAND ${stormlib_apply_patch_if_needed_with_reset} + PATCH_COMMAND ${stormlib_apply_patch_command} ) FetchContent_MakeAvailable(StormLib) list(APPEND ADDITIONAL_LIB_INCLUDES ${stormlib_SOURCE_DIR}/src) diff --git a/cmake/dependencies/git-patch.cmake b/cmake/dependencies/git-patch.cmake new file mode 100644 index 000000000..e315d32a4 --- /dev/null +++ b/cmake/dependencies/git-patch.cmake @@ -0,0 +1,59 @@ +# In variables: patch_file, with_reset + +function(patch) + execute_process( + COMMAND git apply ${patch_file} + RESULT_VARIABLE ret + ERROR_QUIET + ) + set(ret ${ret} PARENT_SCOPE) +endfunction() + +function(check_patch) + execute_process( + COMMAND git apply --reverse --check ${patch_file} + RESULT_VARIABLE ret + ERROR_QUIET + ) + set(ret ${ret} PARENT_SCOPE) +endfunction() + +function(patch_if_needed) + patch() + if(NOT ret EQUAL 0) + check_patch() + endif() + set(ret ${ret} PARENT_SCOPE) +endfunction() + +function(patch_if_needed_with_reset) + patch_if_needed() + if(NOT ret EQUAL 0) + message(STATUS "Failed to patch in current state, clearing changes to reapply") + execute_process( + COMMAND git status --porcelain + RESULT_VARIABLE is_changed + ) + if(NOT is_changed EQUAL 0) + message(WARNING "Patch inapplyable in clean state") + set(ret 1) + else() + execute_process(COMMAND git reset --hard) + patch_if_needed() + endif() + endif() + set(ret ${ret} PARENT_SCOPE) +endfunction() + +message(STATUS "Trying to apply patch ${patch_file}") +message(STATUS "${CMAKE_CURRENT_LIST_DIR}") +if(with_reset) + patch_if_needed_with_reset() +else() + patch_if_needed() +endif() +if(NOT ret EQUAL 0) + message(FATAL_ERROR "Failed to apply patch ${patch_file}") +else() + message(STATUS "Successfully patched with ${patch_file}") +endif()