diff options
author | Lars Schmertmann <Lars.Schmertmann@governikus.de> | 2016-07-12 14:53:36 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-07-13 13:44:34 (GMT) |
commit | 2eec433f98f472eb902892ed11b68fae41376ce6 (patch) | |
tree | f91e405e72f03e10770b820f8f08edc814863b2c /Modules/ExternalProject-download.cmake.in | |
parent | 41c3c9a495b7d48f9388a0700cd294345e6dcccb (diff) | |
download | CMake-2eec433f98f472eb902892ed11b68fae41376ce6.zip CMake-2eec433f98f472eb902892ed11b68fae41376ce6.tar.gz CMake-2eec433f98f472eb902892ed11b68fae41376ce6.tar.bz2 |
ExternalProject: Add support for multiple alternative URLs
Now it is possible to pass multiple URLs as a list that will be tried in
and foreach(). So it will try next URL if the previous failed.
Fixes #15749.
Diffstat (limited to 'Modules/ExternalProject-download.cmake.in')
-rw-r--r-- | Modules/ExternalProject-download.cmake.in | 84 |
1 files changed, 46 insertions, 38 deletions
diff --git a/Modules/ExternalProject-download.cmake.in b/Modules/ExternalProject-download.cmake.in index 5b73cd8..91d74e0 100644 --- a/Modules/ExternalProject-download.cmake.in +++ b/Modules/ExternalProject-download.cmake.in @@ -114,48 +114,56 @@ endif() set(retry_number 5) +message(STATUS "Downloading... + dst='@LOCAL@' + timeout='@TIMEOUT_MSG@'" +) + foreach(i RANGE ${retry_number}) sleep_before_download(${i}) - message(STATUS "downloading... - src='@REMOTE@' - dst='@LOCAL@' - timeout='@TIMEOUT_MSG@'") - - @TLS_VERIFY_CODE@ - @TLS_CAINFO_CODE@ - - file( - DOWNLOAD - "@REMOTE@" "@LOCAL@" - @SHOW_PROGRESS@ - @TIMEOUT_ARGS@ - STATUS status - LOG log - ) - - list(GET status 0 status_code) - list(GET status 1 status_string) - - if(status_code EQUAL 0) - check_file_hash(has_hash hash_is_good) - if(has_hash AND NOT hash_is_good) - message(STATUS "Hash mismatch, removing...") - file(REMOVE "@LOCAL@") + foreach(url @REMOTE@) + message(STATUS "Using src='${url}'") + + @TLS_VERIFY_CODE@ + @TLS_CAINFO_CODE@ + + file( + DOWNLOAD + "${url}" "@LOCAL@" + @SHOW_PROGRESS@ + @TIMEOUT_ARGS@ + STATUS status + LOG log + ) + + list(GET status 0 status_code) + list(GET status 1 status_string) + + if(status_code EQUAL 0) + check_file_hash(has_hash hash_is_good) + if(has_hash AND NOT hash_is_good) + message(STATUS "Hash mismatch, removing...") + file(REMOVE "@LOCAL@") + else() + message(STATUS "Downloading... done") + return() + endif() else() - message(STATUS "Downloading... done") - return() + string(APPEND logFailedURLs "error: downloading '${url}' failed + status_code: ${status_code} + status_string: ${status_string} + log: + --- LOG BEGIN --- + ${log} + --- LOG END --- + " + ) endif() - else() - message("error: downloading '@REMOTE@' failed - status_code: ${status_code} - status_string: ${status_string} - log: - --- LOG BEGIN --- - ${log} - --- LOG END ---" - ) - endif() + endforeach() endforeach() -message(FATAL_ERROR "Downloading failed") +message(FATAL_ERROR "Each download failed! + ${logFailedURLs} + " +) |