aboutsummaryrefslogtreecommitdiff
path: root/third-party/cmake/DownloadAndExtractFile.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'third-party/cmake/DownloadAndExtractFile.cmake')
-rw-r--r--third-party/cmake/DownloadAndExtractFile.cmake123
1 files changed, 123 insertions, 0 deletions
diff --git a/third-party/cmake/DownloadAndExtractFile.cmake b/third-party/cmake/DownloadAndExtractFile.cmake
new file mode 100644
index 0000000000..e7a01b8a87
--- /dev/null
+++ b/third-party/cmake/DownloadAndExtractFile.cmake
@@ -0,0 +1,123 @@
+if(NOT DEFINED PREFIX)
+ message(FATAL_ERROR "PREFIX must be defined.")
+endif()
+
+if(NOT DEFINED URL)
+ message(FATAL_ERROR "URL must be defined.")
+endif()
+
+if(NOT DEFINED DOWNLOAD_DIR)
+ message(FATAL_ERROR "DOWNLOAD_DIR must be defined.")
+endif()
+
+if(NOT DEFINED EXPECTED_MD5)
+ message(FATAL_ERROR "EXPECTED_MD5 must be defined.")
+endif()
+
+if(NOT DEFINED TARGET)
+ message(FATAL_ERROR "TARGET must be defined.")
+endif()
+
+# Taken from ExternalProject_Add. Let's hope we can drop this one day when
+# ExternalProject_Add allows you to disable SHOW_PROGRESS on the file download.
+if(TIMEOUT)
+ set(timeout_args TIMEOUT ${timeout})
+ set(timeout_msg "${timeout} seconds")
+else()
+ set(timeout_args "# no TIMEOUT")
+ set(timeout_msg "none")
+endif()
+
+string(REGEX MATCH "[^/\\?]*$" fname "${URL}")
+if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
+ string(REGEX MATCH "([^/\\?]+(\\.|=)(bz2|tar|tgz|tar\\.gz|zip))/.*$" match_result "${URL}")
+ set(fname "${CMAKE_MATCH_1}")
+endif()
+if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
+ message(FATAL_ERROR "Could not extract tarball filename from url:\n ${url}")
+endif()
+string(REPLACE ";" "-" fname "${fname}")
+
+set(file ${DOWNLOAD_DIR}/${fname})
+message(STATUS "file: ${file}")
+
+message(STATUS "downloading...
+ src='${URL}'
+ dst='${file}'
+ timeout='${timeout_msg}'")
+
+file(DOWNLOAD ${URL} ${file}
+ ${timeout_args}
+ EXPECTED_MD5 ${EXPECTED_MD5}
+ STATUS status
+ LOG log)
+
+list(GET status 0 status_code)
+list(GET status 1 status_string)
+
+if(NOT status_code EQUAL 0)
+ message(FATAL_ERROR "error: downloading '${URL}' failed
+ status_code: ${status_code}
+ status_string: ${status_string}
+ log: ${log}
+")
+endif()
+
+message(STATUS "downloading... done")
+
+set(SRC_DIR ${PREFIX}/src/${TARGET})
+
+# Slurped from a generated extract-TARGET.cmake file.
+message(STATUS "extracting...
+ src='${file}'
+ dst='${SRC_DIR}'")
+
+if(NOT EXISTS "${file}")
+ message(FATAL_ERROR "error: file to extract does not exist: '${file}'")
+endif()
+
+# Prepare a space for extracting:
+#
+set(i 1234)
+while(EXISTS "${SRC_DIR}/../ex-${TARGET}${i}")
+ math(EXPR i "${i} + 1")
+endwhile()
+set(ut_dir "${SRC_DIR}/../ex-${TARGET}${i}")
+file(MAKE_DIRECTORY "${ut_dir}")
+
+# Extract it:
+#
+message(STATUS "extracting... [tar xfz]")
+execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz ${file}
+ WORKING_DIRECTORY ${ut_dir}
+ RESULT_VARIABLE rv)
+
+if(NOT rv EQUAL 0)
+ message(STATUS "extracting... [error clean up]")
+ file(REMOVE_RECURSE "${ut_dir}")
+ message(FATAL_ERROR "error: extract of '${file}' failed")
+endif()
+
+# Analyze what came out of the tar file:
+#
+message(STATUS "extracting... [analysis]")
+file(GLOB contents "${ut_dir}/*")
+list(LENGTH contents n)
+if(NOT n EQUAL 1 OR NOT IS_DIRECTORY "${contents}")
+ set(contents "${ut_dir}")
+endif()
+
+# Move "the one" directory to the final directory:
+#
+message(STATUS "extracting... [rename]")
+file(REMOVE_RECURSE ${SRC_DIR})
+get_filename_component(contents ${contents} ABSOLUTE)
+file(RENAME ${contents} ${SRC_DIR})
+
+# Clean up:
+#
+message(STATUS "extracting... [clean up]")
+file(REMOVE_RECURSE "${ut_dir}")
+
+message(STATUS "extracting... done")
+