diff --git a/CMakeLists.txt b/CMakeLists.txt index 4285f3d39..fe09b8857 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,10 @@ elseif (DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) message (WARNING "The CMAKE_MSVC_RUNTIME_LIBRARY variable is set, but CMake is too old to understand it") endif () +if (POLICY CMP0135) + cmake_policy (SET CMP0135 NEW) +endif () + project (mongocrypt C) # Used for the csfle-markup util: diff --git a/cmake/IntelDFP.cmake b/cmake/IntelDFP.cmake index da0cdc2fd..cb6bb48d4 100644 --- a/cmake/IntelDFP.cmake +++ b/cmake/IntelDFP.cmake @@ -1,7 +1,5 @@ include (FetchContent) -find_program (GIT_EXECUTABLE git) -find_program (PATCH_EXECUTABLE patch) # When updating the version of IntelDFP, also update the version in etc/purls.txt set (_default_url "${PROJECT_SOURCE_DIR}/third-party/IntelRDFPMathLib20U2.tar.xz") @@ -19,18 +17,22 @@ if (NOT INTEL_DFP_LIBRARY_URL_SHA256 STREQUAL "no-verify") set (_hash_arg URL_HASH "${INTEL_DFP_LIBRARY_URL_HASH}") endif () -# Make the PATCH_COMMAND a no-op if it was disabled -set (patch_command) -set (patch_input_opt) if (NOT INTEL_DFP_LIBRARY_PATCH_ENABLED) - set (patch_command "${CMAKE_COMMAND}" -E true) -elseif (GIT_EXECUTABLE) - set (patch_command "${GIT_EXECUTABLE}" --work-tree= apply) -else () - set (patch_command "${PATCH_EXECUTABLE}" --dir=) - set (patch_input_opt -i) + set (patch_disabled ON) endif () +include (Patch) +make_patch_command (patch_command + STRIP_COMPONENTS 4 + DIRECTORY "" + DISABLED "${patch_disabled}" + PATCHES + "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-s390x.patch" + "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-MONGOCRYPT-571.patch" + "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-libmongocrypt-pr-625.patch" + "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-alpine-arm-fix.patch" + ) + # NOTE: The applying of the patch expects the correct input directly from the # expanded archive. If the patch needs to be reapplied, you may see errors # about trying to update the intel_dfp component. If you are seeing such @@ -40,14 +42,7 @@ FetchContent_Declare ( intel_dfp URL "${_default_url}" ${_hash_arg} - PATCH_COMMAND - ${patch_command} - -p 4 # Strip four path components - ${patch_input_opt} "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-s390x.patch" - ${patch_input_opt} "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-MONGOCRYPT-571.patch" - ${patch_input_opt} "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-libmongocrypt-pr-625.patch" - ${patch_input_opt} "${PROJECT_SOURCE_DIR}/etc/mongo-inteldfp-alpine-arm-fix.patch" - --verbose + PATCH_COMMAND ${patch_command} --verbose ) FetchContent_GetProperties (intel_dfp) diff --git a/cmake/Patch.cmake b/cmake/Patch.cmake new file mode 100644 index 000000000..057e91a48 --- /dev/null +++ b/cmake/Patch.cmake @@ -0,0 +1,52 @@ +find_program(GIT_EXECUTABLE git) +find_program(PATCH_EXECUTABLE patch) + +#[[ + Form a new Patch-applying command for the given inputs + + make_patch_command( + + [DISABLED ] + [DIRECTORY ] + [STRIP_COMPONENTS ] + PATCHES [ ...] + ) +]] +function(make_patch_command out) + cmake_parse_arguments(PARSE_ARGV 1 patch "" "DIRECTORY;STRIP_COMPONENTS;DISABLED" "PATCHES") + if(patch_DISABLED) + # Use a placeholder "no-op" patch command. + set(cmd "${CMAKE_COMMAND}" "-E" "true") + elseif(GIT_EXECUTABLE) + # git ... + set(cmd ${GIT_EXECUTABLE}) + + if(patch_DIRECTORY) + # git --work-tree=... + list(APPEND cmd --work-tree=${patch_DIRECTORY}) + endif() + # git ... apply ... + list(APPEND cmd apply) + # git ... apply -pN ... + if(patch_STRIP_COMPONENTS) + list(APPEND cmd -p${patch_STRIP_COMPONENTS}) + endif() + # git accepts patch filepaths as positional arguments + list(APPEND cmd ${patch_PATCHES}) + else() + # patch ... + set(cmd ${PATCH_EXECUTABLE}) + if(patch_DIRECTORY) + # patch --dir=... + list(APPEND cmd --dir=${patch_DIRECTORY}) + endif() + # patch ... -pN ... + if(patch_STRIP_COMPONENTS) + list(APPEND cmd -p${patch_STRIP_COMPONENTS}) + endif() + # Prepend "--input=" to each patch filepath and add them to the argv + list(TRANSFORM patch_PATCHES PREPEND "--input=") + list(APPEND cmd ${patch_PATCHES}) + endif() + set("${out}" "${cmd}" PARENT_SCOPE) +endfunction()