| # Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| # file Copyright.txt or https://cmake.org/licensing for details. | |
| cmake_minimum_required(VERSION 3.5) | |
| function(check_file_hash has_hash hash_is_good) | |
| if("${has_hash}" STREQUAL "") | |
| message(FATAL_ERROR "has_hash Can't be empty") | |
| endif() | |
| if("${hash_is_good}" STREQUAL "") | |
| message(FATAL_ERROR "hash_is_good Can't be empty") | |
| endif() | |
| if("@ALGO@" STREQUAL "") | |
| # No check | |
| set("${has_hash}" FALSE PARENT_SCOPE) | |
| set("${hash_is_good}" FALSE PARENT_SCOPE) | |
| return() | |
| endif() | |
| set("${has_hash}" TRUE PARENT_SCOPE) | |
| message(STATUS "verifying file... | |
| file='@LOCAL@'") | |
| file("@ALGO@" "@LOCAL@" actual_value) | |
| if(NOT "${actual_value}" STREQUAL "@EXPECT_VALUE@") | |
| set("${hash_is_good}" FALSE PARENT_SCOPE) | |
| message(STATUS "@ALGO@ hash of | |
| @LOCAL@ | |
| does not match expected value | |
| expected: '@EXPECT_VALUE@' | |
| actual: '${actual_value}'") | |
| else() | |
| set("${hash_is_good}" TRUE PARENT_SCOPE) | |
| endif() | |
| endfunction() | |
| function(sleep_before_download attempt) | |
| if(attempt EQUAL 0) | |
| return() | |
| endif() | |
| if(attempt EQUAL 1) | |
| message(STATUS "Retrying...") | |
| return() | |
| endif() | |
| set(sleep_seconds 0) | |
| if(attempt EQUAL 2) | |
| set(sleep_seconds 5) | |
| elseif(attempt EQUAL 3) | |
| set(sleep_seconds 5) | |
| elseif(attempt EQUAL 4) | |
| set(sleep_seconds 15) | |
| elseif(attempt EQUAL 5) | |
| set(sleep_seconds 60) | |
| elseif(attempt EQUAL 6) | |
| set(sleep_seconds 90) | |
| elseif(attempt EQUAL 7) | |
| set(sleep_seconds 300) | |
| else() | |
| set(sleep_seconds 1200) | |
| endif() | |
| message(STATUS "Retry after ${sleep_seconds} seconds (attempt #${attempt}) ...") | |
| execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep "${sleep_seconds}") | |
| endfunction() | |
| if("@LOCAL@" STREQUAL "") | |
| message(FATAL_ERROR "LOCAL can't be empty") | |
| endif() | |
| if("@REMOTE@" STREQUAL "") | |
| message(FATAL_ERROR "REMOTE can't be empty") | |
| endif() | |
| if(EXISTS "@LOCAL@") | |
| check_file_hash(has_hash hash_is_good) | |
| if(has_hash) | |
| if(hash_is_good) | |
| message(STATUS "File already exists and hash match (skip download): | |
| file='@LOCAL@' | |
| @ALGO@='@EXPECT_VALUE@'" | |
| ) | |
| return() | |
| else() | |
| message(STATUS "File already exists but hash mismatch. Removing...") | |
| file(REMOVE "@LOCAL@") | |
| endif() | |
| else() | |
| message(STATUS "File already exists but no hash specified (use URL_HASH): | |
| file='@LOCAL@' | |
| Old file will be removed and new file downloaded from URL." | |
| ) | |
| file(REMOVE "@LOCAL@") | |
| endif() | |
| endif() | |
| set(retry_number 5) | |
| message(STATUS "Downloading... | |
| dst='@LOCAL@' | |
| timeout='@TIMEOUT_MSG@'" | |
| ) | |
| foreach(i RANGE ${retry_number}) | |
| sleep_before_download(${i}) | |
| 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 | |
| @USERPWD_ARGS@ | |
| @HTTP_HEADERS_ARGS@ | |
| ) | |
| 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 "Each download failed! | |
| ${logFailedURLs} | |
| " | |
| ) |