95 lines
2.2 KiB
CMake
95 lines
2.2 KiB
CMake
|
#
|
||
|
# Use 'cmake -Dfilename=${tar_or_tgz_file} -Dtmp=${tmp_directory} -Ddirectory=${final_directory}
|
||
|
# -P UntarFile.cmake' to call this script...
|
||
|
#
|
||
|
if(NOT DEFINED filename)
|
||
|
message(FATAL_ERROR "error: required variable 'filename' not defined...")
|
||
|
endif()
|
||
|
|
||
|
if(NOT DEFINED tmp)
|
||
|
message(FATAL_ERROR "error: required variable 'tmp' not defined...")
|
||
|
endif()
|
||
|
|
||
|
if(NOT DEFINED directory)
|
||
|
message(FATAL_ERROR "error: required variable 'directory' not defined...")
|
||
|
endif()
|
||
|
|
||
|
if(NOT DEFINED args)
|
||
|
if(filename MATCHES ".tar$")
|
||
|
set(args xf)
|
||
|
endif()
|
||
|
|
||
|
if(filename MATCHES ".tgz$")
|
||
|
set(args xfz)
|
||
|
endif()
|
||
|
|
||
|
if(filename MATCHES ".tar.gz$")
|
||
|
set(args xfz)
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
|
||
|
# Make file names absolute:
|
||
|
#
|
||
|
get_filename_component(filename "${filename}" ABSOLUTE)
|
||
|
get_filename_component(tmp "${tmp}" ABSOLUTE)
|
||
|
get_filename_component(directory "${directory}" ABSOLUTE)
|
||
|
|
||
|
|
||
|
# Prepare a space for untarring:
|
||
|
#
|
||
|
#message(STATUS "info: creating empty subdir of '${tmp}'...")
|
||
|
set(i 1)
|
||
|
while(EXISTS "${tmp}/untar${i}")
|
||
|
math(EXPR i "${i} + 1")
|
||
|
endwhile()
|
||
|
set(ut_dir "${tmp}/untar${i}")
|
||
|
file(MAKE_DIRECTORY "${ut_dir}")
|
||
|
|
||
|
|
||
|
# Untar it:
|
||
|
#
|
||
|
#message(STATUS "info: untarring '${filename}' in '${ut_dir}' with '${args}'...")
|
||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E tar ${args} ${filename}
|
||
|
WORKING_DIRECTORY ${ut_dir}
|
||
|
RESULT_VARIABLE rv)
|
||
|
|
||
|
if(NOT rv EQUAL 0)
|
||
|
message(FATAL_ERROR "error: untar of '${filename}' failed")
|
||
|
endif()
|
||
|
|
||
|
|
||
|
# Analyze what came out of the tar file:
|
||
|
#
|
||
|
file(GLOB contents "${ut_dir}/*")
|
||
|
|
||
|
set(is_one_directory 0)
|
||
|
list(LENGTH contents n)
|
||
|
if(n EQUAL 1)
|
||
|
if(IS_DIRECTORY "${contents}")
|
||
|
set(is_one_directory 1)
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
|
||
|
# Copy "the one" directory to the final directory:
|
||
|
#
|
||
|
if(is_one_directory EQUAL 1)
|
||
|
#message(STATUS "info: (1) copying '${contents}' to '${directory}'...")
|
||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory "${contents}" "${directory}"
|
||
|
RESULT_VARIABLE rv)
|
||
|
else()
|
||
|
#message(STATUS "info: (more) copying '${ut_dir}' to '${directory}'...")
|
||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory "${ut_dir}" "${directory}"
|
||
|
RESULT_VARIABLE rv)
|
||
|
endif()
|
||
|
|
||
|
if(NOT rv EQUAL 0)
|
||
|
message(FATAL_ERROR "error: copy_directory failed after untar in '${ut_dir}'")
|
||
|
endif()
|
||
|
|
||
|
|
||
|
# Clean up:
|
||
|
#
|
||
|
file(REMOVE_RECURSE "${ut_dir}")
|