aboutsummaryrefslogtreecommitdiff
path: root/CMakeModules
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2026-07-10 01:21:17 +0200
committercrueter <crueter@eden-emu.dev>2026-07-10 01:21:17 +0200
commitcd003e5ec9e7e4afacbd98015142fc768e17af44 (patch)
tree6180681a786e59848151f5178ffc15005ad76e80 /CMakeModules
parent813b248bc3fc87c501500ddf838a44084476c272 (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.cmake102
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