summaryrefslogtreecommitdiffstats
path: root/Modules
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
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')
-rw-r--r--Modules/ExternalProject-download.cmake.in84
-rw-r--r--Modules/ExternalProject.cmake19
2 files changed, 62 insertions, 41 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}
+ "
+)
diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index 3686fb6..7e179aa 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -69,8 +69,8 @@ Create custom targets to build projects in external trees
URL of mercurial repo
``HG_TAG <tag>``
Mercurial branch name, commit id or tag
- ``URL /.../src.tgz``
- Full path or URL of source
+ ``URL /.../src.tgz [/.../src.tgz]...``
+ Full path or URL(s) of source. Multiple URLs are allowed as mirrors.
``URL_HASH ALGO=value``
Hash of file at URL
``URL_MD5 md5``
@@ -1667,7 +1667,7 @@ function(_ep_add_download_command name)
get_property(fname TARGET ${name} PROPERTY _EP_DOWNLOAD_NAME)
# TODO: Perhaps file:// should be copied to download dir before extraction.
- string(REGEX REPLACE "^file://" "" url "${url}")
+ string(REGEX REPLACE "file://" "" url "${url}")
set(depends)
set(comment)
@@ -1861,6 +1861,19 @@ function(_ep_add_download_command name)
@ONLY
)
list(APPEND depends ${stamp_dir}/${name}-urlinfo.txt)
+
+ list(LENGTH url url_list_length)
+ if(NOT "${url_list_length}" STREQUAL "1")
+ foreach(entry ${url})
+ if(NOT "${entry}" MATCHES "^[a-z]+://")
+ message(FATAL_ERROR "At least one entry of URL is a path (invalid in a list)")
+ endif()
+ endforeach()
+ if("x${fname}" STREQUAL "x")
+ list(GET url 0 fname)
+ endif()
+ endif()
+
if(IS_DIRECTORY "${url}")
get_filename_component(abs_dir "${url}" ABSOLUTE)
set(comment "Performing download step (DIR copy) for '${name}'")