aboutsummaryrefslogtreecommitdiff
path: root/third-party/cmake/DownloadAndExtractFile.cmake
diff options
context:
space:
mode:
authorJohn Szakmeister <john@szakmeister.net>2014-03-15 03:22:52 -0400
committerJohn Szakmeister <john@szakmeister.net>2014-03-21 15:22:00 -0400
commit66394367f773f565da392f40de82f3d773dd28b9 (patch)
tree0915f4470cc537a0b8b151890b7e9466daba59f1 /third-party/cmake/DownloadAndExtractFile.cmake
parent1eed86883bff8a031d397ddd38b39fb307a31198 (diff)
downloadrneovim-66394367f773f565da392f40de82f3d773dd28b9.tar.gz
rneovim-66394367f773f565da392f40de82f3d773dd28b9.tar.bz2
rneovim-66394367f773f565da392f40de82f3d773dd28b9.zip
Workaround the broken progress feedback in some versions of CMake.
Underneath the hood, CMake uses libcurl and libcurl has had a number of issues regarding progress feedback. In one sample run against Travis CI, we ended up with nearly 3,000 lines of progress output for a single download. Unfortunately, CMake doesn't have the download and extract steps separate, so we have some extra work that we have to do. Much of the content was taken from the ExternalProject.cmake and it's template for generating the content of the download and extract CMake files.
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")
+