diff options
| author | crueter <crueter@eden-emu.dev> | 2026-07-10 01:21:17 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-07-10 01:21:17 +0200 |
| commit | cd003e5ec9e7e4afacbd98015142fc768e17af44 (patch) | |
| tree | 6180681a786e59848151f5178ffc15005ad76e80 /CMakeModules | |
| parent | 813b248bc3fc87c501500ddf838a44084476c272 (diff) | |
[cmake] Fix CPMUtil on Windows by avoiding a temp dir (#4195)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4195
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Diffstat (limited to 'CMakeModules')
| -rw-r--r-- | CMakeModules/CPMUtil.cmake | 102 |
1 files changed, 24 insertions, 78 deletions
diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake index 3144f832c2..c9ad5f1e2f 100644 --- a/CMakeModules/CPMUtil.cmake +++ b/CMakeModules/CPMUtil.cmake @@ -95,7 +95,7 @@ macro(echo) execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${message}") else() - message(STATUS "${message}") + message(DEBUG "${message}") endif() endmacro() @@ -120,47 +120,6 @@ macro(sleep time) execute_process(COMMAND ${CMAKE_COMMAND} -E sleep ${time}) endmacro() -# Analogous to GNU mktemp, with fallbacks -function(mktempdir out) - # shell out to system mktemp if available - find_program(MKTEMP_EXECUTABLE mktemp) - if (MKTEMP_EXECUTABLE) - execute_process(COMMAND mktemp -d - OUTPUT_VARIABLE dir - OUTPUT_STRIP_TRAILING_WHITESPACE - RESULT_VARIABLE ret) - - if (ret EQUAL 0) - set(${out} "${dir}" PARENT_SCOPE) - return() - endif() - endif() - - string(RANDOM LENGTH 10 rand_str) - set(tmp_str "tmp.${rand_str}") - - # create something in /tmp if it exists - if(EXISTS "/tmp" AND IS_DIRECTORY "/tmp") - set(dir "/tmp/${tmp_str}") - file(MAKE_DIRECTORY "${dir}" RESULT res) - if (res EQUAL 0) - set(${out} "${dir}" PARENT_SCOPE) - return() - endif() - endif() - - # tmpdir does not exist, extremely legacy mode - set(dir "${CMAKE_CURRENT_LIST_DIR}/.tmp/${tmp_str}") - file(MAKE_DIRECTORY "${dir}" RESULT res) - if (res EQUAL 0) - set(${out} "${dir}" PARENT_SCOPE) - return() - endif() - - fatal("Fatal: Could not create temporary directory. " - "Check write permissions to the current directory") -endfunction() - # Get a package's effective URL. function(get_package_url) set(oneValueArgs @@ -218,6 +177,7 @@ endfunction() # Download a URL to file, with a sha512 hash # And retry 5 times function(cpm_download url file) + echo("Downloading ${url} to ${file}") list(LENGTH ARGN argn_len) if(argn_len GREATER 0) list(GET ARGN 0 hash) @@ -229,8 +189,7 @@ function(cpm_download url file) foreach(i RANGE 5) file(DOWNLOAD ${url} ${file} ${args} - STATUS ret - LOG log) + STATUS ret) list(GET ret 0 code) if (code EQUAL 0) @@ -339,60 +298,47 @@ function(fetch_package) return() endif() - # Temporary directory. - mktempdir(TMP) + # paths + cmake_path(ABSOLUTE_PATH ARG_PATH + NORMALIZE + OUTPUT_VARIABLE abs_path) + + cmake_path(GET abs_path PARENT_PATH path_parent) + file(MAKE_DIRECTORY ${path_parent}) # Get filename from URL get_filename_component(base_filename ${ARG_URL} NAME) # Download - set(file ${TMP}/${base_filename}) + set(file ${path_parent}/${base_filename}) cpm_download(${ARG_URL} ${file} ${ARG_HASH}) - message(DEBUG "Downloaded ${base_filename}") - - # Extract the downloaded archive - # TODO: Moar error handling - set(dir ${TMP}/${base_filename}-extracted) - file(MAKE_DIRECTORY ${dir}) + echo("Downloaded ${base_filename}") + # Extract + echo("Extracting ${file}...") file(ARCHIVE_EXTRACT INPUT ${file} - DESTINATION ${dir}) + DESTINATION ${abs_path}) # This is copied near-verbatim from ExternalProject/extractfile.cmake.in # If there's just one subdirectory and nothing else, move it - file(GLOB contents "${dir}/*") - list(REMOVE_ITEM contents "${dir}/.DS_Store") + file(GLOB contents "${abs_path}/*") + list(REMOVE_ITEM contents "${abs_path}/.DS_Store") list(LENGTH contents n) # If n == 1 and contents points to a directory, this is a GitHub-style pack # In this case contents points to the subdir which will get renamed # If not, contents will point to the parent dir which will get renamed - if (NOT n EQUAL 1 OR NOT IS_DIRECTORY "${contents}") - set(contents "${dir}") + if (n EQUAL 1 AND IS_DIRECTORY "${contents}") + set(temp_path "${abs_path}_tmp") + file(RENAME "${contents}" "${temp_path}") + file(REMOVE_RECURSE "${abs_path}") + file(RENAME "${temp_path}" "${abs_path}") endif() - file(REAL_PATH "${contents}" contents_abs) - - # paths - cmake_path(ABSOLUTE_PATH ARG_PATH - NORMALIZE - OUTPUT_VARIABLE abs_path) - - cmake_path(GET abs_path PARENT_PATH path_parent) - cmake_path(GET abs_path FILENAME path_name) - - # rename tmp dir - set(tmp_renamed "${TMP}/${path_name}") - file(RENAME "${contents_abs}" "${tmp_renamed}") - - # now copy - # TODO: Error handling beyond what cmake does???? - file(COPY ${tmp_renamed} DESTINATION ${path_parent}) - # TODO: only echo this in script mode - message(DEBUG "Extracted to ${abs_path}") + echo("Extracted to ${abs_path}") # Apply patches apply_patches("${ARG_PATCHES}" "${abs_path}") @@ -401,7 +347,7 @@ function(fetch_package) file(WRITE "${abs_path}/.cpm_patch_key" ${ARG_PATCH_KEY}) # done! :) - file(REMOVE_RECURSE ${TMP}) + file(REMOVE_RECURSE ${file}) endfunction() # compute a hash of all patch file contents |
