mirror of
https://github.com/neovim/neovim.git
synced 2025-09-07 11:58:17 +00:00

This is useful when trying to bisect an issue in a dependency, and we want to pull from a specific commit but don't want to have to download and determine the sha1sum and md5sum of the tarball.
144 lines
3.8 KiB
CMake
144 lines
3.8 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_SHA1) OR (NOT DEFINED EXPECTED_MD5))
|
|
message(FATAL_ERROR "EXPECTED_SHA1 or EXPECTED_MD5 must be defined.")
|
|
endif()
|
|
|
|
if(NOT DEFINED TARGET)
|
|
message(FATAL_ERROR "TARGET must be defined.")
|
|
endif()
|
|
|
|
set(SRC_DIR ${PREFIX}/src/${TARGET})
|
|
|
|
# Check whether the source has been downloaded. If true, skip it.
|
|
# Useful for external downloads like homebrew.
|
|
if(EXISTS "${SRC_DIR}" AND IS_DIRECTORY "${SRC_DIR}")
|
|
file(GLOB EXISTED_FILES "${SRC_DIR}/*")
|
|
if(EXISTED_FILES)
|
|
message(STATUS "${SRC_DIR} is found and not empty, skipping download and extraction. ")
|
|
return()
|
|
endif()
|
|
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}'")
|
|
|
|
if((DEFINED EXPECTED_SHA1) AND (${CMAKE_VERSION} VERSION_GREATER 2.8.10))
|
|
if(NOT (EXPECTED_SHA1 STREQUAL "0000000000000000000000000000000000000000"))
|
|
set(hash_args EXPECTED_HASH SHA1=${EXPECTED_SHA1})
|
|
endif()
|
|
else()
|
|
if(NOT (EXPECTED_MD5 STREQUAL "00000000000000000000000000000000"))
|
|
set(hash_args EXPECTED_MD5 ${EXPECTED_MD5})
|
|
endif()
|
|
endif()
|
|
|
|
file(DOWNLOAD ${URL} ${file}
|
|
${timeout_args}
|
|
${hash_args}
|
|
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")
|
|
|
|
# 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")
|
|
|