From 10424914206dda4d1c81fada08948810fad41b7d Mon Sep 17 00:00:00 2001 From: lightmanLP Date: Sun, 23 Mar 2025 20:28:50 +0700 Subject: [PATCH] After patch update cache fix (#794) * apply patch with reset * same for stormlib * fix * patch via cmake script * restore comments & cleanup --- cmake/dependencies/common.cmake | 17 ++------- cmake/dependencies/git-patch.cmake | 61 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 13 deletions(-) create mode 100644 cmake/dependencies/git-patch.cmake diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index ee713da..4b2e7db 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -2,22 +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) +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) -# 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}) FetchContent_Declare( ImGui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG v1.91.6-docking - PATCH_COMMAND ${imgui_apply_patch_if_needed} + PATCH_COMMAND ${imgui_apply_patch_command} ) FetchContent_MakeAvailable(ImGui) list(APPEND ADDITIONAL_LIB_INCLUDES ${imgui_SOURCE_DIR} ${imgui_SOURCE_DIR}/backends) @@ -45,15 +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}) + 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} + 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 0000000..deb3e35 --- /dev/null +++ b/cmake/dependencies/git-patch.cmake @@ -0,0 +1,61 @@ +# 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() + +# Applies the patch or checks if it has already been applied successfully previously. Will error otherwise. +function(patch_if_needed) + patch() + if(NOT ret EQUAL 0) + check_patch() + endif() + set(ret ${ret} PARENT_SCOPE) +endfunction() + +# Resets code and reapply patch, if old (potentially incompatible) patch applied +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}") +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()