diff --git a/ports/vcpkg-downloads/download.json b/ports/vcpkg-downloads/download.json new file mode 100644 index 00000000000000..257a72556c22f7 --- /dev/null +++ b/ports/vcpkg-downloads/download.json @@ -0,0 +1,66 @@ +{ + "downloads" : [ + { + "output-variable" : "extracted_src_github", + "from": "github", + "repository" : "facebook/zstd", + "ref": "v1.5.6", + "sha512" : "ca12dffd86618ca008e1ecc79056c1129cb4e61668bf13a3cd5b2fa5c93bc9c92c80f64c1870c68b9c20009d9b3a834eac70db72242d5106125a1c53cccf8de8", + "head-ref": "dev", + "patches" : [], + "copy-to" : "${other_src_dir}/zstd" + }, + { + "if": "VCPKG_TARGET_IS_OSX", + "output-variable" : "extracted_src_gitlab", + "from": "gitlab", + "host": "https://gitlab.com", + "repository" : "libeigen/eigen", + "ref": "3.4.0", + "sha512" : "ba75ecb760e32acf4ceaf27115468e65d4f77c44f8d519b5a13e7940af2c03a304ad433368cb6d55431f307c5c39e2666ab41d34442db3cf441638e51f5c3b6a", + "head-ref": "master", + "patches" : [], + "copy-to" : "${other_src_dir}/eigen" + }, + { + "output-variable" : "extracted_src_bitbucket", + "from": "bitbucket", + "repository" : "blaze-lib/blaze", + "ref": "v3.8.2", + "sha512" : "9786628159991f547902ceb44a159f0ba84d08be16ccc45bfb9aad3cfbf16eaede4ea43d2d4981d420a8a387a07721b113754f6038a6db2d9c7ed2ea967b5361", + "head-ref": "master", + "patches" : [], + "copy-to" : "${other_src_dir}/blaze" + }, + { + "if": "VCPKG_TARGET_IS_LINUX", + "output-variable" : "extracted_src_sourceforge", + "from": "sourceforge", + "repository" : "cunit/CUnit", + "ref": "2.1-3", + "filename": "CUnit-2.1-3.tar.bz2", + "sha512" : "547b417109332446dfab8fda17bf4ccd2da841dc93f824dc90a20635bcf1fb80fb2176500d8a0906940f3f3d3e2f77b2d70a71090c9ab84ad9af43f3582bc487", + "patches" : [], + "copy-to" : "${other_src_dir}/cunit" + }, + { + "output-variable" : "extracted_src_git", + "from": "git", + "url" : "https://repo.or.cz/libtar.git", + "ref": "6d0ab4c78e7a8305c36a0c3d63fd25cd1493de65", + "sha512" : "0", + "patches" : [], + "copy-to" : "${other_src_dir}/libtar" + }, + { + "output-variable" : "extracted_src_file", + "from": "url", + "urls" : [ "https://archive.apache.org/dist/apr/apr-1.7.4.tar.bz2" ], + "filename" : "apr-1.7.4.tar.bz2", + "sha512" : "2342c997765ea2ca96eac158e5fd260232dba68fc41b90a79a7ba9b25c539fc217981867362090e0ebebe632289257c342275e3c5baedb698c474ef8f49a9dcd", + "patches" : [], + "copy-to" : "${other_src_dir}/libtar" + } + + ] +} \ No newline at end of file diff --git a/ports/vcpkg-downloads/portfile.cmake b/ports/vcpkg-downloads/portfile.cmake new file mode 100644 index 00000000000000..5c93968c928cdd --- /dev/null +++ b/ports/vcpkg-downloads/portfile.cmake @@ -0,0 +1,20 @@ +file(INSTALL + "${CMAKE_CURRENT_LIST_DIR}/vcpkg-downloads.cmake" + "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") + +vcpkg_install_copyright(FILE_LIST "${VCPKG_ROOT_DIR}/LICENSE.txt") +set(VCPKG_POLICY_CMAKE_HELPER_PORT enabled) + +block() + set(other_src_dir "${CURRENT_BUILDTREES_DIR}/src2") + include("${CMAKE_CURRENT_LIST_DIR}/vcpkg-downloads.cmake") + vcpkg_download_from_json(JSONS "${CMAKE_CURRENT_LIST_DIR}/download.json") + message(STATUS "extracted_src_github:${extracted_src_github}") + message(STATUS "extracted_src_gitlab:${extracted_src_gitlab}") + message(STATUS "extracted_src_bitbucket:${extracted_src_bitbucket}") + message(STATUS "extracted_src_sourceforge:${extracted_src_sourceforge}") + message(STATUS "extracted_src_git:${extracted_src_git}") +endblock() + +message(FATAL_ERROR) \ No newline at end of file diff --git a/ports/vcpkg-downloads/vcpkg-downloads.cmake b/ports/vcpkg-downloads/vcpkg-downloads.cmake new file mode 100644 index 00000000000000..9edca1ebb549b8 --- /dev/null +++ b/ports/vcpkg-downloads/vcpkg-downloads.cmake @@ -0,0 +1,258 @@ +include_guard(GLOBAL) + +function(vcpkg_download_from_json) + cmake_parse_arguments(PARSE_ARGV 0 "arg" "" "" "JSONS") + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "vcpkg_cmake_install was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + if(NOT arg_JSONS) + list(APPEND arg_JSONS "${CMAKE_CURRENT_LIST_DIR}/download.json") + endif() + + foreach(json IN LISTS arg_JSONS) + z_vcpkg_download_from_json(vars "${json}") + endforeach() + + foreach(o IN LISTS vars) + set("${o}" "${${o}}" PARENT_SCOPE) + endforeach() +endfunction() + +function(z_vcpkg_download_from_json outs json_file) + file(READ "${json_file}" json_data) + z_read_json_member(outvars "${json_data}" "downloads") + + #foreach(o IN LISTS outvars) + # message("${o}=${${o}}") + #endforeach() + + set(out "") + + foreach(download_item IN LISTS downloads.index_list) + set(prefix downloads.${download_item}) + foreach(member IN LISTS ${prefix}.members) # Expand all CMake variables in members + string(CONFIGURE "${${prefix}.${member}}" "${prefix}.${member}" ESCAPE_QUOTES) + endforeach() + + if(DEFINED ${prefix}.if AND NOT "${${prefix}.if}" STREQUAL "") + if(NOT ${${prefix}.if}) + continue() + endif() + endif() + + cmake_language(CALL z_vcpkg_download_from_${${prefix}.from} "${prefix}") + list(APPEND out "${${prefix}.output-variable}") + + if(${prefix}.copy-to) # Check --editable? + file(REMOVE_RECURSE ${${prefix}.copy-to}) + # Would like to use rename here ? + file(COPY "${${${prefix}.output-variable}}/" DESTINATION "${${prefix}.copy-to}") + set("${${prefix}.output-variable}" "${${prefix}.copy-to}" PARENT_SCOPE) + endif() + + endforeach() + set(${outs} ${${outs}} ${out} PARENT_SCOPE) +endfunction() + +##### Download stuff +function(z_vcpkg_download_from_url data_prefix) + z_vcpkg_convert_json_array_to_cmake_list(urls ${data_prefix}.urls) + z_vcpkg_convert_json_array_to_cmake_list(patches "${data_prefix}.patches") + + vcpkg_download_distfile(archive + URLS "${urls}" + FILENAME "${${data_prefix}.filename}" + SHA512 "${${data_prefix}.sha512}" + ) + + vcpkg_extract_source_archive("${${data_prefix}.output-variable}" + ARCHIVE "${archive}" + PATCHES ${patches} + ) + unset(archive) + + set("${${data_prefix}.output-variable}" "${${${data_prefix}.output-variable}}" PARENT_SCOPE) +endfunction() + +function(z_vcpkg_download_from_github data_prefix) + set(opts "") + if(${data_prefix}.host) + list(APPEND opts GITHUB_HOST "${${data_prefix}.host}") + endif() + + z_vcpkg_convert_json_array_to_cmake_list(patches "${data_prefix}.patches") + + vcpkg_from_github( + OUT_SOURCE_PATH "${${data_prefix}.output-variable}" + REPO "${${data_prefix}.repository}" + REF "${${data_prefix}.ref}" + SHA512 "${${data_prefix}.sha512}" + HEAD_REF "${${data_prefix}.head-ref}" + PATCHES ${patches} + ${opts} + ) + set("${${data_prefix}.output-variable}" "${${${data_prefix}.output-variable}}" PARENT_SCOPE) +endfunction() + +function(z_vcpkg_download_from_gitlab data_prefix) + set(opts "") + if(${data_prefix}.host) + list(APPEND opts GITLAB_URL "${${data_prefix}.host}") + endif() + + z_vcpkg_convert_json_array_to_cmake_list(patches "${data_prefix}.patches") + + vcpkg_from_gitlab( + OUT_SOURCE_PATH "${${data_prefix}.output-variable}" + REPO "${${data_prefix}.repository}" + REF "${${data_prefix}.ref}" + SHA512 "${${data_prefix}.sha512}" + HEAD_REF "${${data_prefix}.head-ref}" + PATCHES ${patches} + ${opts} + ) + set("${${data_prefix}.output-variable}" "${${${data_prefix}.output-variable}}" PARENT_SCOPE) +endfunction() + +function(z_vcpkg_download_from_bitbucket data_prefix) + z_vcpkg_convert_json_array_to_cmake_list(patches "${data_prefix}.patches") + vcpkg_from_bitbucket( + OUT_SOURCE_PATH "${${data_prefix}.output-variable}" + REPO "${${data_prefix}.repository}" + REF "${${data_prefix}.ref}" + SHA512 "${${data_prefix}.sha512}" + HEAD_REF "${${data_prefix}.head-ref}" + PATCHES ${patches} + ) + set("${${data_prefix}.output-variable}" "${${${data_prefix}.output-variable}}" PARENT_SCOPE) +endfunction() + +function(z_vcpkg_download_from_git data_prefix) + z_vcpkg_convert_json_array_to_cmake_list(patches "${data_prefix}.patches") + vcpkg_from_git( + OUT_SOURCE_PATH "${${data_prefix}.output-variable}" + URL "${${data_prefix}.url}" + REF "${${data_prefix}.ref}" + #SHA512 "${${data_prefix}.sha512}" + HEAD_REF "${${data_prefix}.head-ref}" + PATCHES ${patches} + # [LFS []] + ) + set("${${data_prefix}.output-variable}" "${${${data_prefix}.output-variable}}" PARENT_SCOPE) +endfunction() + +function(z_vcpkg_download_from_sourceforge data_prefix) + z_vcpkg_convert_json_array_to_cmake_list(patches "${data_prefix}.patches") + vcpkg_from_sourceforge( + OUT_SOURCE_PATH "${${data_prefix}.output-variable}" + REPO "${${data_prefix}.repository}" + REF "${${data_prefix}.ref}" + SHA512 "${${data_prefix}.sha512}" + #HEAD_REF "${${data_prefix}.head-ref}" + PATCHES ${patches} + FILENAME "${${data_prefix}.filename}" + #[NO_REMOVE_ONE_LEVEL] + ) + set("${${data_prefix}.output-variable}" "${${${data_prefix}.output-variable}}" PARENT_SCOPE) +endfunction() +##### JSON Parser + +function(z_read_json_array out_vars json_data) + set(out "") + set(argn_list ${ARGN}) + list(JOIN argn_list "." argn_list_dot) + + string(JSON ${argn_list_dot}_length LENGTH "${json_data}" ${ARGN}) + set(${argn_list_dot}.size "${${argn_list_dot}_length}") + list(APPEND out ${argn_list_dot}.size) + set(${argn_list_dot}.index_list "") + list(APPEND out ${argn_list_dot}.index_list) + + math(EXPR ${argn_list_dot}_length "${${argn_list_dot}_length}-1" OUTPUT_FORMAT DECIMAL) + + if(NOT ${argn_list_dot}_length LESS 0) + foreach(${argn_list_dot}_index RANGE ${${argn_list_dot}_length}) + set(out_index "") + z_read_json_member(out_index "${json_data}" ${ARGN} "${${argn_list_dot}_index}") + list(APPEND out ${out_index}) + list(APPEND ${argn_list_dot}.index_list "${${argn_list_dot}_index}") + unset(out_index) + endforeach() + endif() + + foreach(o IN LISTS out) + set("${o}" "${${o}}" PARENT_SCOPE) + endforeach() + set("${out_vars}" ${out} PARENT_SCOPE) +endfunction() + +function(z_read_json_obj out_vars json_data) + set(out "") + set(argn_list ${ARGN}) + list(JOIN argn_list "." argn_list_dot) + + string(JSON ${argn_list_dot}_length LENGTH "${json_data}" ${ARGN}) + set(${argn_list_dot}.size "${${argn_list_dot}_length}") + list(APPEND out ${argn_list_dot}.size) + set(${argn_list_dot}.members "") + list(APPEND out ${argn_list_dot}.members) + + math(EXPR ${argn_list_dot}_length "${${argn_list_dot}_length}-1" OUTPUT_FORMAT DECIMAL) + + if(NOT ${argn_list_dot}_length LESS 0) + foreach(${argn_list_dot}_index RANGE ${${argn_list_dot}_length}) + set(out_index "") + string(JSON member_name MEMBER "${json_data}" ${ARGN} "${${argn_list_dot}_index}") + z_read_json_member(out_index "${json_data}" ${ARGN} "${member_name}") + list(APPEND out ${out_index}) + list(APPEND ${argn_list_dot}.members "${member_name}") + unset(out_index) + unset(member_name) + endforeach() + endif() + foreach(o IN LISTS out) + set("${o}" "${${o}}" PARENT_SCOPE) + endforeach() + set("${out_vars}" ${out} PARENT_SCOPE) +endfunction() + +function(z_read_json_member out_vars json_data) + set(out "") + set(argn_list ${ARGN}) + + list(JOIN argn_list "." argn_list_dot) + string(JSON "z_${argn_list_dot}.json_type" TYPE "${json_data}" ${ARGN}) + + if("${z_${argn_list_dot}.json_type}" MATCHES "^(NULL|NUMBER|STRING|BOOLEAN)$") + string(JSON "${argn_list_dot}" GET "${json_data}" ${ARGN}) + # Cannot expand CMake variables here if you want output variables to be used in the same JSON file + # string(CONFIGURE "${${argn_list_dot}}" "${argn_list_dot}" ESCAPE_QUOTES) + list(APPEND out "${argn_list_dot}") + elseif("${z_${argn_list_dot}.json_type}" STREQUAL "ARRAY") + set(array_out "") + z_read_json_array(array_out "${json_data}" ${ARGN}) + list(APPEND out ${array_out}) + unset(array_out) + elseif("${z_${argn_list_dot}.json_type}" STREQUAL "OBJECT") + set(object_out "") + z_read_json_obj(object_out "${json_data}" ${ARGN}) + list(APPEND out ${object_out}) + unset(object_out) + else() + message(FATAL_ERROR "Unknown json type found") + endif() + + foreach(o IN LISTS out) + set("${o}" "${${o}}" PARENT_SCOPE) + endforeach() + set("${out_vars}" ${out} PARENT_SCOPE) +endfunction() + +function(z_vcpkg_convert_json_array_to_cmake_list var prefix) + set(out "") + foreach(item IN LISTS ${prefix}.index_list) + list(APPEND out "${${prefix}.${item}}") + endforeach() + set("${var}" "${out}" PARENT_SCOPE) +endfunction() \ No newline at end of file diff --git a/ports/vcpkg-downloads/vcpkg-port-config.cmake b/ports/vcpkg-downloads/vcpkg-port-config.cmake new file mode 100644 index 00000000000000..59c0f803d6545d --- /dev/null +++ b/ports/vcpkg-downloads/vcpkg-port-config.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/vcpkg-downloads.cmake") diff --git a/ports/vcpkg-downloads/vcpkg.json b/ports/vcpkg-downloads/vcpkg.json new file mode 100644 index 00000000000000..39756a050f0cd3 --- /dev/null +++ b/ports/vcpkg-downloads/vcpkg.json @@ -0,0 +1,5 @@ +{ + "name": "vcpkg-downloads", + "version-date": "2024-05-07", + "license": "MIT" +}