mirror of
https://github.com/neovim/neovim.git
synced 2024-12-25 21:55:17 -07:00
66394367f7
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.
124 lines
3.1 KiB
CMake
124 lines
3.1 KiB
CMake
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")
|
|
|