mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 15:39:20 +02:00
40 lines
1.7 KiB
CMake
40 lines
1.7 KiB
CMake
# Copies the Python runtime (Lib and DLLs) used by the embedded interpreter next to the executable.
|
|
# Run as a post-build step: cmake -DPY_LIBDIR=... -DPY_DLLSDIR=... -DDEST_DIR=... -P CopyPythonRuntime.cmake
|
|
#
|
|
# Lib also carries the site-packages of whichever Python install the build found, which can be tens of thousands
|
|
# of files. Copying them after every link took minutes, so the copy is skipped while the source install looks
|
|
# unchanged since the last copy. Delete <exe dir>/python64/.eu07_python_runtime to force a refresh.
|
|
|
|
foreach(_var PY_LIBDIR PY_DLLSDIR DEST_DIR)
|
|
if(NOT DEFINED ${_var})
|
|
message(FATAL_ERROR "CopyPythonRuntime.cmake: ${_var} is not set")
|
|
endif()
|
|
endforeach()
|
|
|
|
# directory timestamps change when pip adds or removes a package, or the Python install itself is replaced
|
|
set(_stamp "")
|
|
foreach(_path "${PY_LIBDIR}" "${PY_LIBDIR}/site-packages" "${PY_DLLSDIR}")
|
|
file(TIMESTAMP "${_path}" _time "%Y-%m-%dT%H:%M:%S" UTC)
|
|
string(APPEND _stamp "${_path} ${_time}\n")
|
|
endforeach()
|
|
|
|
set(_stamp_file "${DEST_DIR}/python64/.eu07_python_runtime")
|
|
set(_old_stamp "")
|
|
if(EXISTS "${_stamp_file}")
|
|
file(READ "${_stamp_file}" _old_stamp)
|
|
endif()
|
|
|
|
if(NOT _old_stamp STREQUAL _stamp)
|
|
message(STATUS "Copying the Python runtime to ${DEST_DIR}/python64")
|
|
foreach(_pair "${PY_LIBDIR}|Lib" "${PY_DLLSDIR}|DLLs")
|
|
string(REPLACE "|" ";" _pair "${_pair}")
|
|
list(GET _pair 0 _source)
|
|
list(GET _pair 1 _target)
|
|
execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_directory_if_different "${_source}" "${DEST_DIR}/python64/${_target}" RESULT_VARIABLE _result)
|
|
if(NOT _result EQUAL 0)
|
|
message(FATAL_ERROR "CopyPythonRuntime.cmake: copying ${_source} failed")
|
|
endif()
|
|
endforeach()
|
|
file(WRITE "${_stamp_file}" "${_stamp}")
|
|
endif()
|