diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 3c5e752..3e543b7 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -89,9 +89,74 @@ set(_ExternalProjectCMakeCache include(ExternalProject) include(FetchContent) +function(korman_rewrite_url) + cmake_parse_arguments( + PARSE_ARGV 0 _kru + "" + "RESULT_VARIABLE;URL" + "" + ) + + # SourceForge's mirrors are unstable, and CI keeps failing when the standard URL picks a + # particularly unstable mirror. So, rewrite any implicit SourceForge (meaning, no specific mirror + # has been selected) download URLs to use known stable mirrors. This should prevent spurious + # CI failures. + if(_kru_URL MATCHES [[^https:\/\/sourceforge.net\/projects\/[^\/]+\/files\/[^\/]+\/[^\/]+\/[^\/]+\/download$]]) + # Borrowed from vcpkg + set(sourceforge_mirrors + cfhcable # United States + pilotfiber # New York, NY + gigenet # Chicago, IL + versaweb # Las Vegas, NV + ayera # Modesto, CA + netactuate # Durham, NC + phoenixnap # Tempe, AZ + astuteinternet # Vancouver, BC + freefr # Paris, France + netcologne # Cologne, Germany + deac-riga # Latvia + excellmedia # Hyderabad, India + iweb # Montreal, QC + jaist # Nomi, Japan + jztkft # Mezotur, Hungary + managedway # Detroit, MI + nchc # Taipei, Taiwan + netix # Bulgaria + ufpr # Curitiba, Brazil + tenet # Wynberg, South Africa + ) + foreach(mirror IN LISTS sourceforge_mirrors) + message(DEBUG "SF: ${_kru_URL}?use_mirror=${mirror}") + list(APPEND _result "${_kru_URL}?use_mirror=${mirror}") + endforeach() + else() + set(_result ${_kru_URL}) + endif() + + set(${_kru_RESULT_VARIABLE} ${${_kru_RESULT_VARIABLE}};${_result} PARENT_SCOPE) +endfunction() + function(korman_add_external_project TARGET) set(_args ${ARGN}) + # Lookup any argument for URL so we can apply any santitation rules needed. + list(FIND _args "URL" _url_args_idx) + if(_url_args_idx GREATER_EQUAL 0) + math(EXPR _url_pos "${_url_args_idx} + 1") + while(TRUE) + list(GET _args ${_url_pos} _url) + if(NOT _url MATCHES [[^https?:\/\/]]) + break() + endif() + list(REMOVE_AT _args ${_url_pos}) + korman_rewrite_url( + RESULT_VARIABLE "_fixed_urls" + URL "${_url}" + ) + endwhile() + list(INSERT _args ${_url_pos} ${_fixed_urls}) + endif() + if("GIT_REPOSITORY" IN_LIST _args) list(APPEND _args GIT_PROGRESS TRUE) if(NOT "GIT_SHALLOW" IN_LIST _args)