vcpkg/scripts/cmake/vcpkg_download_sourceforge.cmake
Billy O'Neal 83712a6060
Improve and extract internals of vcpkg_find_acquire_program. (#34881)
* Extract vcpkg_extract_archive from vcpkg_find_acquire_program.

* Extract vcpkg_download_sourceforge from vcpkg_from_sourceforge.

This allows vcpkg_find_acquire_program to download from SourceForge without needing to temporarily change _VCPKG_EDITABLE.

* Use whether a URI is known for an entity to decide whether to downloads it rather than checking a separate supported_on_unix boolean.

* Add unparsed arguments check to vcpkg_extract_archive
2023-11-14 14:01:08 -08:00

86 lines
3.2 KiB
CMake

function(vcpkg_download_sourceforge out_var)
cmake_parse_arguments(PARSE_ARGV 1 "arg"
""
"REPO;REF;SHA512;FILENAME"
"")
foreach(arg_name IN ITEMS REPO SHA512 FILENAME)
if(NOT DEFINED "arg_${arg_name}")
message(FATAL_ERROR "${arg_name} is required.")
endif()
endforeach()
if(DEFINED arg_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "Unrecognized arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
set(sourceforge_host "https://sourceforge.net/projects")
if(arg_REPO MATCHES "^([^/]*)$") # just one element
set(org_name "${CMAKE_MATCH_1}")
set(repo_name "")
elseif(arg_REPO MATCHES "^([^/]*)/([^/]*)$") # two elements
set(org_name "${CMAKE_MATCH_1}")
set(repo_name "${CMAKE_MATCH_2}")
else()
message(FATAL_ERROR "REPO (${arg_REPO}) is not a valid repo name. It must be:
- an organization name without any slashes, or
- an organization name followed by a repository name separated by a single slash")
endif()
if(DEFINED arg_REF)
set(url "${sourceforge_host}/${org_name}/files/${repo_name}/${arg_REF}/${arg_FILENAME}")
elseif(DEFINED repo_name)
set(url "${sourceforge_host}/${org_name}/${repo_name}/files/${arg_FILENAME}")
else()
set(url "${sourceforge_host}/${org_name}/files/${arg_FILENAME}")
endif()
string(SUBSTRING "${arg_SHA512}" 0 10 sanitized_ref)
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
)
if(DEFINED SOURCEFORGE_MIRRORS AND NOT DEFINED VCPKG_SOURCEFORGE_EXTRA_MIRRORS)
message(WARNING "Extension point SOURCEFORGE_MIRRORS has been deprecated.
Please use the replacement VCPKG_SOURCEFORGE_EXTRA_MIRRORS variable instead.")
list(APPEND sourceforge_mirrors "${SOURCEFORGE_MIRRORS}")
list(REMOVE_DUPLICATES sourceforge_mirrors)
elseif(DEFINED VCPKG_SOURCEFORGE_EXTRA_MIRRORS)
list(APPEND sourceforge_mirrors "${VCPKG_SOURCEFORGE_EXTRA_MIRRORS}")
list(REMOVE_DUPLICATES sourceforge_mirrors)
endif()
set(all_urls "${url}/download")
foreach(mirror IN LISTS sourceforge_mirrors)
list(APPEND all_urls "${url}/download?use_mirror=${mirror}")
endforeach()
vcpkg_download_distfile(archive
URLS ${all_urls}
SHA512 "${arg_SHA512}"
FILENAME "${arg_FILENAME}"
)
set("${out_var}" "${archive}" PARENT_SCOPE)
endfunction()