| # 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) |
| |
| set(quiet "@quiet@") |
| set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") |
| include(${script_dir}/captured_process_setup.cmake) |
| |
| function(check_file_hash has_hash hash_is_good) |
| if("${has_hash}" STREQUAL "") |
| _ep_message_quiet_capture(FATAL_ERROR "has_hash Can't be empty") |
| endif() |
| |
| if("${hash_is_good}" STREQUAL "") |
| _ep_message_quiet_capture(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) |
| |
| _ep_message_quiet_capture(STATUS "verifying file... |
| file='@LOCAL@'") |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| |
| file("@ALGO@" "@LOCAL@" actual_value) |
| |
| if(NOT "${actual_value}" STREQUAL "@EXPECT_VALUE@") |
| set("${hash_is_good}" FALSE PARENT_SCOPE) |
| _ep_message_quiet_capture(STATUS "@ALGO@ hash of |
| @LOCAL@ |
| does not match expected value |
| expected: '@EXPECT_VALUE@' |
| actual: '${actual_value}'") |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| 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) |
| _ep_message_quiet_capture(STATUS "Retrying...") |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| 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() |
| |
| _ep_message_quiet_capture(STATUS |
| "Retry after ${sleep_seconds} seconds (attempt #${attempt}) ..." |
| ) |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| |
| 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() |
| |
| function(download_and_verify) |
| if(EXISTS "@LOCAL@") |
| check_file_hash(has_hash hash_is_good) |
| if(has_hash) |
| if(hash_is_good) |
| _ep_message_quiet_capture(STATUS |
| "File already exists and hash match (skip download): |
| file='@LOCAL@' |
| @ALGO@='@EXPECT_VALUE@'" |
| ) |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| return() |
| else() |
| _ep_message_quiet_capture(STATUS |
| "File already exists but hash mismatch. Removing..." |
| ) |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| file(REMOVE "@LOCAL@") |
| endif() |
| else() |
| _ep_message_quiet_capture(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) |
| |
| _ep_message_quiet_capture(STATUS "Downloading... |
| dst='@LOCAL@' |
| timeout='@TIMEOUT_MSG@' |
| inactivity timeout='@INACTIVITY_TIMEOUT_MSG@'" |
| ) |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| set(download_retry_codes 7 6 8 15) |
| set(skip_url_list) |
| set(status_code) |
| foreach(i RANGE ${retry_number}) |
| if(status_code IN_LIST download_retry_codes) |
| sleep_before_download(${i}) |
| endif() |
| foreach(url @REMOTE@) |
| if(NOT url IN_LIST skip_url_list) |
| _ep_message_quiet_capture(STATUS "Using src='${url}'") |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| |
| @TLS_VERIFY_CODE@ |
| @TLS_CAINFO_CODE@ |
| @NETRC_CODE@ |
| @NETRC_FILE_CODE@ |
| |
| file( |
| DOWNLOAD |
| "${url}" "@LOCAL@" |
| @SHOW_PROGRESS@ |
| @TIMEOUT_ARGS@ |
| @INACTIVITY_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) |
| _ep_message_quiet_capture(STATUS "Hash mismatch, removing...") |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| file(REMOVE "@LOCAL@") |
| else() |
| _ep_message_quiet_capture(STATUS "Downloading... done") |
| set(accumulated_output "${accumulated_output}" PARENT_SCOPE) |
| return() |
| endif() |
| else() |
| string(APPEND logFailedURLs |
| "error: downloading '${url}' failed |
| status_code: ${status_code} |
| status_string: ${status_string} |
| log: |
| --- LOG BEGIN --- |
| ${log} |
| --- LOG END --- |
| " |
| ) |
| if(NOT status_code IN_LIST download_retry_codes) |
| list(APPEND skip_url_list "${url}") |
| break() |
| endif() |
| endif() |
| endif() |
| endforeach() |
| endforeach() |
| |
| _ep_message_quiet_capture(FATAL_ERROR |
| "Each download failed! |
| ${logFailedURLs} |
| " |
| ) |
| |
| endfunction() |
| |
| download_and_verify() |
| |
| set(extract_script @extract_script_filename@) |
| if(NOT "${extract_script}" STREQUAL "") |
| include(${extract_script}) |
| endif() |