Files
MinecraftConsoles/cmake/CopyFileScript.cmake
2026-03-22 23:27:42 -05:00

52 lines
1.5 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cross-platform single file copy using fast native tools
#
# Required:
# COPY_SOURCE pipe-separated list of source file paths
# COPY_DEST destination directory
cmake_minimum_required(VERSION 3.24)
if(NOT COPY_SOURCE OR NOT COPY_DEST)
message(FATAL_ERROR "COPY_SOURCE and COPY_DEST must be set.")
endif()
string(REPLACE "|" ";" COPY_SOURCE "${COPY_SOURCE}")
if(CMAKE_HOST_WIN32)
# Group files by parent directory so we can batch them into single robocopy calls
set(dir_file_map "")
set(unique_dirs "")
foreach(filepath IN LISTS COPY_SOURCE)
get_filename_component(dir "${filepath}" DIRECTORY)
get_filename_component(name "${filepath}" NAME)
if(NOT dir IN_LIST unique_dirs)
list(APPEND unique_dirs "${dir}")
endif()
list(APPEND "FILES_IN_${dir}" "${name}")
endforeach()
foreach(dir IN LISTS unique_dirs)
execute_process(
COMMAND robocopy.exe "${dir}" "${COPY_DEST}" ${FILES_IN_${dir}} /MT /R:0 /W:0 /NP
RESULT_VARIABLE rc
)
if(rc GREATER 7) # Allows for "files copied" and "no files copied" cases, but treats actual errors as failures
message(FATAL_ERROR "robocopy failed (exit code ${rc})")
endif()
endforeach()
elseif(CMAKE_HOST_UNIX)
execute_process(
COMMAND rsync -av ${COPY_SOURCE} "${COPY_DEST}/"
RESULT_VARIABLE rs
)
if(rs GREATER 0) # Any non-zero exit code indicates an error
message(FATAL_ERROR "rsync failed (exit code ${rs})")
endif()
else()
message(FATAL_ERROR "Unsupported host platform for asset copying.")
endif()