|
From: <sv...@op...> - 2025-11-30 14:57:44
|
Author: manx Date: Sun Nov 30 15:57:36 2025 New Revision: 24540 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=24540 Log: [Ref] build: externals: Use metalink4 instead of custom text file format for specifying what to download. XML parsing is done in PowerShell on Windows, or xmllint (from libxml2) or xpath (from Perl) or plain sed. Added: trunk/OpenMPT/build/download_externals.meta4 (contents, props changed) trunk/OpenMPT/build/scriptlib/Parse-Metalink.ps1 (contents, props changed) Deleted: trunk/OpenMPT/build/download_externals.txt Modified: trunk/OpenMPT/ (props changed) trunk/OpenMPT/build/download_externals.cmd trunk/OpenMPT/build/download_externals.sh Modified: trunk/OpenMPT/build/download_externals.cmd ============================================================================== --- trunk/OpenMPT/build/download_externals.cmd Sun Nov 30 15:32:12 2025 (r24539) +++ trunk/OpenMPT/build/download_externals.cmd Sun Nov 30 15:57:36 2025 (r24540) @@ -29,7 +29,7 @@ if not exist "build\tools" mkdir "build\tools" rem download -for /f "delims=" %%a in ('type "build\download_externals.txt"') do ( call build\scriptlib\download.cmd %%a || goto error ) +for /f "delims=" %%a in ('powershell -ExecutionPolicy Unrestricted .\build\scriptlib\Parse-Metalink.ps1 -filename ".\build\download_externals.meta4"') do ( call build\scriptlib\download.cmd %%a || goto error ) call :killdir "build\tools\7zipold" || goto error call :killdir "build\tools\7zipa" || goto error Added: trunk/OpenMPT/build/download_externals.meta4 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/OpenMPT/build/download_externals.meta4 Sun Nov 30 15:57:36 2025 (r24540) @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8"?> +<metalink xmlns="urn:ietf:params:xml:ns:metalink"> + <file name="build/externals/7za920.zip"> + <size>384846</size> + <hash type="sha-512">84e830c91a0e8ae499cc4814080da6569d8a6acbddc585c8b62abc86c809793aeb669b0a741063a379fd281ade85f120bc27efeb67d63bf961be893eec8bc3b3</hash> + <url>https://7-zip.org/a/7za920.zip</url> + <url>https://netcologne.dl.sourceforge.net/project/sevenzip/7-Zip/9.20/7za920.zip</url> + </file> + <file name="build/externals/7z2501-extra.7z"> + <size>1636158</size> + <hash type="sha-512">0e7c21ebaaabdc938eaf678417f6fae13c6358ea07335e7efed8bd9eb642752cace6f4c6fe3d12997d501abc1af64df46f5eea4d1f713368f4df3393e2184244</hash> + <url>https://7-zip.org/a/7z2501-extra.7z</url> + <url>https://netcologne.dl.sourceforge.net/project/sevenzip/7-Zip/25.01/7z2501-extra.7z</url> + </file> + <file name="build/externals/7z2501-x64.exe"> + <size>1643509</size> + <hash type="sha-512">44c7c2b683383f8555f9d8420391c118e4631eb88bb1d5e8ca7b6e2750568a697493509eeba6f758df1a82c2b76298261c672331a22b0d7f3d4487ae05dedfc6</hash> + <url>https://7-zip.org/a/7z2501-x64.exe</url> + <url>https://netcologne.dl.sourceforge.net/project/sevenzip/7-Zip/25.01/7z2501-x64.exe</url> + </file> + <file name="build/externals/WA5.55_SDK.exe"> + <size>336166</size> + <hash type="sha-512">394375db8a16bf155b5de9376f6290488ab339e503dbdfdc4e2f5bede967799e625c559cca363bc988324f1a8e86e5fd28a9f697422abd7bb3dcde4a766607b5</hash> + <url>https://download.nullsoft.com/winamp/plugin-dev/WA5.55_SDK.exe</url> + <url>http://download.nullsoft.com/winamp/plugin-dev/WA5.55_SDK.exe</url> + <url>https://web.archive.org/web/20131217072017id_/http://download.nullsoft.com/winamp/plugin-dev/WA5.55_SDK.exe</url> + </file> + <file name="build/externals/xmp-sdk.zip"> + <size>325166</size> + <hash type="sha-512">e1abd5ec2ef62461eadd08a08afa4d6be6c4e92da0dab77dc2b09a88898704ad0983135395913919358fa27da6165f6b33b31b29e1b36a3a9d62680f97f682bb</hash> + <url>https://www.un4seen.com/files/xmp-sdk.zip</url> + </file> + <file name="build/externals/htmlhelp.exe"> + <size>3509072</size> + <hash type="sha-512">d91371244ea98c691b4674ee266c4a2496a296800c176adae069d21f5c52c0763b21cc7859cfffa865b89e50171a2c99a6d14620c32f7d72c0ef04045348f856</hash> + <url>https://web.archive.org/web/20200918004813id_/https://download.microsoft.com/download/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe</url> + <url>https://web.archive.org/web/20200918004813id_/http://download.microsoft.com/download/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe</url> + </file> + <file name="build/externals/python-3.14.0-embed-amd64.zip"> + <size>11994671</size> + <hash type="sha-512">6326f7e55ae8bb619ced417c55e817abc3c5151c955e033d90606140bb1aa4e8b9307af68da43e4ea24b2a305637976d663f221a8fa1f7f432374ba200f4b315</hash> + <url>https://www.python.org/ftp/python/3.14.0/python-3.14.0-embed-amd64.zip</url> + </file> + <file name="build/externals/innounp050.rar"> + <size>141621</size> + <hash type="sha-512">dbbc809308267a866db9d6b751fdeda6d179e1a65d8ddb14bb51984431ae91493f9a76105e1789b245732043a2c696c869ed10964b48cf59f81e55bd52f85330</hash> + <url>https://netcologne.dl.sourceforge.net/project/innounp/innounp/innounp 0.50/innounp050.rar</url> + <url>https://deac-fra.dl.sourceforge.net/project/innounp/innounp/innounp 0.50/innounp050.rar</url> + </file> + <file name="build/externals/innosetup-6.6.1.exe"> + <size>9947600</size> + <hash type="sha-512">a8f1a1efde23ece3ac3f9af8d0c6f6242bddb5c14cfb174baface06c935b5a4650b31697453656f1752f5460e5f4621c1e63ee5a40059a771afd24c616facf2c</hash> + <url>https://files.jrsoftware.org/is/6/innosetup-6.6.1.exe</url> + <url>https://files.innosetup.nl/innosetup-6.6.1.exe</url> + </file> + <file name="build/externals/isetup-5.5.8-unicode.exe"> + <size>2342456</size> + <hash type="sha-512">da7e27d85caec85b4194c7b1412c5a64c0ae12f22d903b94f2f4ee9ea0cb99c91b2d1dbb49262eefae8129e6b91f5c46f26f353011076e77e75f9c955fc5e1cb</hash> + <url>https://files.jrsoftware.org/is/5/isetup-5.5.8-unicode.exe</url> + <url>https://web.archive.org/web/20230523165634id_/https://files.jrsoftware.org/is/5/isetup-5.5.8-unicode.exe</url> + </file> + <file name="build/externals/example_songs_ompt_1_30.7z"> + <size>4881392</size> + <hash type="sha-512">bfecf7f97fd71bd52bcfb38307ccb98c751e6a0fa0c1f31208b22b9392f03ea3da8f9271327df2de4fc2e463e0c13c6a24107fbe18caf8f446b7e7cf93073fa5</hash> + <url>https://download.openmpt.org/resources/modules/example_songs_ompt_1_30.7z</url> + </file> + <file name="build/externals/allegro-4.2.3.1-hg.8+r8500.zip"> + <size>3872466</size> + <hash type="sha-512">46cd8d4d7138b795dbc66994e953d0abc578c6d3c00615e3580237458529d33d7ad9d269a9778918d4b3719d75750d5cca74ff6bf38ad357a766472799ee9e7b</hash> + <url>https://lib.openmpt.org/files/libopenmpt/contrib/allegro/allegro-4.2.3.1-hg.8+r8500.zip</url> + <url>https://mercury.sexy/members/manx/liballegro-4.2/allegro-4.2.3.1-hg.8+r8500.zip</url> + </file> + <file name="build/externals/csdpmi7b.zip"> + <size>71339</size> + <hash type="sha-512">58c24691d27cead1cec92d334af551f37a3ba31de25a687d99399c28d822ec9f6ffccc9332bfce35e65dae4dd1210b54e54b223a4de17f5adcb11e2da004b834</hash> + <url>https://lib.openmpt.org/files/libopenmpt/contrib/djgpp/cwsdpmi/csdpmi7b.zip</url> + <url>https://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2misc/csdpmi7b.zip</url> + <url>https://djgpp.mirror.garr.it/current/v2misc/csdpmi7b.zip</url> + </file> + <file name="build/externals/csdpmi7s.zip"> + <size>89872</size> + <hash type="sha-512">ea5652d31850d8eb0d15a919de0b51849f58efea0d16ad2aa4687fac4abd223d0ca34a2d1b616b02fafe84651dbef3e506df9262cfb399eb6d9909bffc89bfd3</hash> + <url>https://lib.openmpt.org/files/libopenmpt/contrib/djgpp/cwsdpmi/csdpmi7s.zip</url> + <url>https://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2misc/csdpmi7s.zip</url> + <url>https://djgpp.mirror.garr.it/current/v2misc/csdpmi7s.zip</url> + </file> + <file name="build/externals/svn_apply_autoprops.py"> + <size>5601</size> + <hash type="sha-512">9d41d53917509a5a4cdcc14660d1f0455e81859355b86b841adbf99994500e8795dac2df75b8a1d75aeee36816edaab7871735be3b40acf379092b994cb6ee61</hash> + <url>https://raw.githubusercontent.com/apache/subversion/c66ceddd7d0b1b77bed35d697ab94cfaa4d9e691/contrib/client-side/svn_apply_autoprops.py</url> + <url>https://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn_apply_autoprops.py</url> + </file> +</metalink> Modified: trunk/OpenMPT/build/download_externals.sh ============================================================================== --- trunk/OpenMPT/build/download_externals.sh Sun Nov 30 15:32:12 2025 (r24539) +++ trunk/OpenMPT/build/download_externals.sh Sun Nov 30 15:57:36 2025 (r24540) @@ -64,6 +64,59 @@ return 0 } +MPT_XML_BACKEND=sed +if command -v xmllint &> /dev/null ; then + MPT_XML_BACKEND=xmllint +elif command -v xpath &> /dev/null ; then + MPT_XML_BACKEND=xpath +fi + +xml_xpath () { + set -e + MPT_XPATH_FILENAME="${1}" + shift + MPT_XPATH_QUERY="${1}" + shift + if [ "${MPT_XML_BACKEND}" == "xmllint" ] ; then + < "${MPT_XPATH_FILENAME}" sed 's/ xmlns="urn:ietf:params:xml:ns:metalink"//g' | xmllint --xpath "${MPT_XPATH_QUERY}" - + elif [ "${MPT_XML_BACKEND}" == "xpath" ] ; then + xpath -q -e "${MPT_XPATH_QUERY}" "${MPT_XPATH_FILENAME}" + fi +} + +parse_metalink4 () { + set -e + MPT_METAFILE="$1" + shift + if [ "${MPT_XML_BACKEND}" == "xmllint" ] || [ "${MPT_XML_BACKEND}" == "xpath" ] ; then + for filenum in $(seq 1 $(xml_xpath "${MPT_METAFILE}" "count(/metalink/file)")); do + MPT_METAFILE_FILENAME=$(xml_xpath "${MPT_METAFILE}" "string(/metalink/file[${filenum}]/@name)") + echo -n "${MPT_METAFILE_FILENAME}" + echo -n " " + MPT_METAFILE_FILESIZE=$(xml_xpath "${MPT_METAFILE}" "string(/metalink/file[${filenum}]/size/text())") + echo -n "${MPT_METAFILE_FILESIZE}" + echo -n " " + MPT_METAFILE_FILEHASH=$(xml_xpath "${MPT_METAFILE}" "string(/metalink/file[${filenum}]/hash/text())") + echo -n "${MPT_METAFILE_FILEHASH}" + for urlnum in $(seq 1 $(xml_xpath "${MPT_METAFILE}" "count(/metalink/file[${filenum}]/url)")); do + MPT_METAFILE_FILEURL=$(xml_xpath "${MPT_METAFILE}" "string(/metalink/file[${filenum}]/url[${urlnum}]/text())") + echo -n " " + echo -n "\"${MPT_METAFILE_FILEURL}\"" + done + echo "" + done + else + cat "${MPT_METAFILE}" \ + | sed 's/\r//g' | tr '\n' '\t' | sed 's/\t//g' | sed 's/> *</></g' \ + | sed 's/<file/\n<file/g' \ + | sed 's/\/file>/\/file>\n/g' \ + | grep '\<file' \ + | sed 's/<file name="//g' | sed 's/"><size>/ /g' | sed 's/<\/size><hash type="sha-512">/ /g' | sed 's/<\/hash>//g' | sed 's/<\/file>//g' \ + | sed 's/<url>/ "/g' | sed 's/<\/url>/"/g' \ + | cat + fi +} + function unpack () { set -e MPT_GET_DESTDIR="$1" @@ -104,7 +157,7 @@ fi # download -cat build/download_externals.txt | ( +parse_metalink4 build/download_externals.meta4 | ( while IFS=$'\n' read -r URL; do eval download $URL done Added: trunk/OpenMPT/build/scriptlib/Parse-Metalink.ps1 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/OpenMPT/build/scriptlib/Parse-Metalink.ps1 Sun Nov 30 15:57:36 2025 (r24540) @@ -0,0 +1,19 @@ +param([String]$filename="") + +[xml]$xmlData = Get-Content -Path $filename +foreach ($node in $xmlData.ChildNodes) { + if ($node.LocalName -eq "metalink") { + foreach ($file in $node.ChildNodes) { + $fields = @() + $fields += $file.name + $fields += $file.size + $fields += $file.hash.InnerText + foreach ($url in $file.ChildNodes) { + if ($url.LocalName -eq "url") { + $fields += '"' + $url.InnerText + '"' + } + } + Write-Output ($fields -join " ") + } + } +} |