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.
This commit is contained in:
Lars Schmertmann 2016-07-12 16:53:36 +02:00 committed by Brad King
parent 41c3c9a495
commit 2eec433f98
2 changed files with 61 additions and 40 deletions

View File

@ -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@'")
foreach(url @REMOTE@)
message(STATUS "Using src='${url}'")
@TLS_VERIFY_CODE@
@TLS_CAINFO_CODE@
@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@")
else()
message(STATUS "Downloading... done")
return()
endif()
else()
message("error: downloading '@REMOTE@' failed
status_code: ${status_code}
status_string: ${status_string}
log:
--- LOG BEGIN ---
${log}
--- LOG END ---"
file(
DOWNLOAD
"${url}" "@LOCAL@"
@SHOW_PROGRESS@
@TIMEOUT_ARGS@
STATUS status
LOG log
)
endif()
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()
string(APPEND logFailedURLs "error: downloading '${url}' 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}
"
)

View File

@ -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}'")