summaryrefslogtreecommitdiffstats
path: root/Modules/ExternalProject-download.cmake.in
diff options
context:
space:
mode:
authorLars Schmertmann <Lars.Schmertmann@governikus.de>2016-07-12 14:53:36 (GMT)
committerBrad King <brad.king@kitware.com>2016-07-13 13:44:34 (GMT)
commit2eec433f98f472eb902892ed11b68fae41376ce6 (patch)
treef91e405e72f03e10770b820f8f08edc814863b2c /Modules/ExternalProject-download.cmake.in
parent41c3c9a495b7d48f9388a0700cd294345e6dcccb (diff)
downloadCMake-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.in84
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}
+ "
+)