clank-together/toolchain/msvc-v142/download.py
clank-bot 022e0a2c78 Ragnarok rodecomp deployment on memento
Changes to upstream:
- git.js: coordinator commit identity from TD_GIT_AUTHOR_NAME/EMAIL.
- build.js: docker runner can share job dirs through a named volume
  (jobVolume/jobVolumeRoot) for containerized workers.
- install.js: staged installer output with logs, start prompt for regions.
- web: feed layout, cache-busting asset versions, multi-agent help section.
- build-td: fetch checksummed Windows runtime when building on non-Windows.

Additions:
- deploy/rodecomp: compose stack, Dockerfiles, Caddyfile, server.json,
  bulk import/verify scripts, and README.md with the deployment notes
  (the root README stays identical to upstream).
- toolchain/msvc-v142: MSVC v142 under Wine (Docker), SDK 10.0.19041.0.
- tools/rodecomp: project preparation, Forgejo provisioning, history and
  identity tools.
2026-10-25 14:40:13 +01:00

61 lines
2.9 KiB
Python

"""Acquire pinned v142 x64-host/x86-target packages from Microsoft's VS manifest."""
import hashlib
import io
import json
import pathlib
import re
import shutil
import subprocess
import urllib.request
import zipfile
MANIFEST = 'https://download.visualstudio.microsoft.com/download/pr/e2324e87-3765-4b14-85e5-1234d99f6254/fb642c3f891b70947e0152275e1722ffb3cca7e8700eea0f0fa0f3a7645584cc/VisualStudio.vsman'
root = pathlib.Path('toolchain')
root.mkdir(exist_ok=True)
packages = json.load(urllib.request.urlopen(MANIFEST))['packages']
def package(name):
return next(p for p in packages if p['id'].lower() == name.lower() and p.get('language') in (None, 'en-US'))
def download(payload):
data = urllib.request.urlopen(payload['url'].replace(' ', '%20')).read()
if hashlib.sha256(data).hexdigest().lower() != payload['sha256'].lower():
raise RuntimeError('Checksum mismatch: ' + payload['fileName'])
print(payload['fileName'], len(data), flush=True)
return data
suffixes = ['Tools.HostX64.TargetX86.base', 'Tools.HostX64.TargetX86.Res.base',
'CRT.Headers.base', 'CRT.x86.Desktop.base', 'ATL.Headers.base', 'ATL.X86.base']
for suffix in suffixes:
for payload in package('Microsoft.VC.14.29.16.11.' + suffix)['payloads']:
with zipfile.ZipFile(io.BytesIO(download(payload))) as archive:
for entry in archive.infolist():
name = pathlib.PurePosixPath(entry.filename)
if not entry.is_dir() and name.parts[0] == 'Contents':
if '..' in name.parts:
raise RuntimeError('Unsafe package path')
out = root.joinpath(*name.parts[1:])
out.parent.mkdir(parents=True, exist_ok=True)
out.write_bytes(archive.read(entry))
sdk = package('Win10SDK_10.0.19041')
payloads = {p['fileName'].replace('\\', '/').split('/')[-1]: p for p in sdk['payloads']}
msis = ['Windows SDK for Windows Store Apps Headers-x86_en-us.msi',
'Windows SDK Desktop Headers x86-x86_en-us.msi',
'Windows SDK Desktop Headers x64-x86_en-us.msi',
'Windows SDK Desktop Libs x86-x86_en-us.msi',
'Universal CRT Headers Libraries and Sources-x86_en-us.msi']
cache = pathlib.Path('sdk-downloads')
cache.mkdir(exist_ok=True)
for name in msis:
data = download(payloads[name])
msi = cache / name
msi.write_bytes(data)
for cab in set(re.findall(rb'[A-Za-z0-9]{32}\.cab', data)):
cabname = cab.decode('ascii')
dest = cache / cabname
if not dest.exists():
dest.write_bytes(download(payloads[cabname]))
subprocess.run(['msiextract', '-C', str(root.resolve()), str(msi)], check=True, stdout=subprocess.DEVNULL)
(root / 'provenance.json').write_text(json.dumps({'manifest': MANIFEST, 'toolset': 'v142', 'compilerPackage': '14.29.30159', 'target': 'x86', 'sdk': '10.0.19041.0'}, indent=2))
print('Toolchain extraction complete', flush=True)