diff --git a/app_manifest_dev.py b/app_manifest_dev.py index 4c4911e..0abd15d 100644 --- a/app_manifest_dev.py +++ b/app_manifest_dev.py @@ -1582,7 +1582,7 @@ def get_manifest(is_windows): exe_path = "bin/mold" download_url = f"https://github.com/rui314/mold/releases/download/v{version}/mold-{version}-x86_64-linux.tar.gz" download_checksum = "dafd02fe19c51818aa22c9d569393616b1a85a2220d6fb32ba3728d351074e59" - checksum = "0f201d526667ec56ec504c702e73343e142e87813f870932981b8ad4a7a8e851 + checksum = "0f201d526667ec56ec504c702e73343e142e87813f870932981b8ad4a7a8e851" symlink = [] result.append({ diff --git a/install.py b/install.py index bf36e16..e927315 100644 --- a/install.py +++ b/install.py @@ -90,82 +90,6 @@ if args.with_dev_apps: install_script_path = pathlib.Path(devenver.script_dir, "install.py") if is_windows: - # Install MSVC - # -------------------------------------------------------------------------- - devenver.print_header("Install MSVC & Windows 10 SDK") - msvc_script = devenver.script_dir / "win_portable_msvc.py" - msvc_version = "14.34" - win10_sdk_version = "22621" - - msvc_install_dir = install_dir / "msvc" - - # Basic heuristic to see if we"ve already installed the MSVC/SDK version - msvc_installed = False - win10_sdk_installed = False - - msvc_find_test_dir = msvc_install_dir / "VC/Tools/MSVC" - win10_sdk_find_test_dir = msvc_install_dir / "Windows Kits/10" - - if os.path.exists(msvc_find_test_dir): - for file_name in os.listdir(msvc_find_test_dir): - msvc_installed = file_name.startswith(msvc_version) - if msvc_installed == True: - devenver.lprint(f"MSVC {msvc_version} install detected (skip download) in {msvc_find_test_dir}\\{file_name}") - break - if not msvc_installed: - devenver.lprint(f"MSVC {msvc_version} install not detected (need to download) in {msvc_find_test_dir}") - - if os.path.exists(win10_sdk_find_test_dir): - for file_name in os.listdir(win10_sdk_find_test_dir / "bin"): - # Check if directory contains version substring, 22621, e.g. "10.0.22621.0" - win10_sdk_installed = file_name.count(win10_sdk_version) > 0 - if win10_sdk_installed == True: - install_locations = f"{win10_sdk_find_test_dir}\\*\\{file_name}" - devenver.lprint(f"Windows 10 SDK {win10_sdk_version} install detected (skip download) in {install_locations}") - break - if not win10_sdk_installed: - devenver.lprint(f"Windows 10 SDK {win10_sdk_version} not detected (need to download) in {win10_sdk_find_test_dir}") - - # Install MSVC - if msvc_installed == False or win10_sdk_installed == False: - with tempfile.TemporaryDirectory() as temp_dir: - - # Invoke the MSVC script to download MSVC to disk - command = f"\"{sys.executable}\" \"{msvc_script}\" --accept-license" - line = "Invoking MSVC script to install" - if msvc_installed: - command += " --no-msvc" - else: - command += f" --msvc-version {msvc_version}" - line += f" MSVC {msvc_version}" - - if win10_sdk_installed: - command += " --no-sdk" - else: - command += f" --sdk-version {win10_sdk_version}" - line += f" Windows 10 SDK {win10_sdk_version}" - - devenver.lprint(line) - devenver.lprint(f"Command: {command}") - run_result = subprocess.run(command, cwd=temp_dir, check=True) - - # Merge the download MSVC installation to our unified install dir - temp_msvc_dir = pathlib.Path(temp_dir, "msvc") - for src_dir, dirs, files in os.walk(temp_msvc_dir): - msvc_working_dir = src_dir.replace(str(temp_msvc_dir), str(msvc_install_dir), 1) - if not os.path.exists(msvc_working_dir): - os.makedirs(msvc_working_dir) - for file_ in files: - src = os.path.join(src_dir, file_) - dest = os.path.join(msvc_working_dir, file_) - if os.path.exists(dest): - if os.path.samefile(src, dest): - continue - os.remove(dest) - shutil.move(src, msvc_working_dir) - - devenver.lprint(f"MSVC {msvc_version} Windows 10 SDK {win10_sdk_version} installed: {msvc_install_dir}") - # Install apps dependent on Git # -------------------------------------------------------------------------- devenver.print_header("Install apps that rely on Git") diff --git a/win_portable_msvc.py b/win_portable_msvc.py deleted file mode 100644 index 895ecc2..0000000 --- a/win_portable_msvc.py +++ /dev/null @@ -1,490 +0,0 @@ -#!/usr/bin/env python3 - -# This script has been gratefully sourced from Martins Mozeiko of HMN -# https://gist.github.com/mmozeiko/7f3162ec2988e81e56d5c4e22cde9977 -# -# Further modifications by https://github.com/doy-lee with the primary purpose -# of facilitating multiple versions to be stored in the same root directory. -# ('Redist' in the SDK was unversioned, store it versioned like all other -# folders, skip the downloading of MSVC or the SDK if we only need one of them). -# We have some other useful features .. -# -# - Cache the downloads to ./msvc/Installers instead of a temporary directory -# meaning downloads that are interrupted can be resumed/reused. -# - Allow downloading of _just_ the SDK or _just_ the VC toolchain. -# - Create scripts for each individual component, -# -# msvc-{version}.bat -# win-sdk-{version}.bat -# -# - Allow multiple versions to co-exist in the same installation root -# -# Changelog -# 2024-03-14 -# - Fold in mmozeiko's latest changes from revision 2024-03-14 -# a6303b82561a4061c71e8838976143f06f295cc9a8a60cf53fc170cb5b9f3f1d -# - SSL checks -# - Removal of vctip.exe (telemetry) -# - DIA SDK DLL -# -# 2024-02-21 -# - Add more environment variables that Windows may use, `WindowsSDKVersion` -# `WindowsSDKDir`, `VSCMD_ARG_TGT_ARCH` -# - Cache the downloads into the `msvc/Installers` directory to allow reusing -# or resuming an installation that has failed or been terminated prematurely. -# - Fix output scripts using MSVC/SDK version arguments which could be empty -# if defaulted. -# -# 2023-04-15 -# - Fix "msvc-{version}.bat" script generating trailing "\;" on -# VCToolsInstallDir environment variable. clang-cl relies on this variable to -# identify the location of the Visual Studio toolchain or otherwise reports a -# program invocation error during the linking stage. -# -# 2023-01-30 -# - Generate the short-hand version of the msvc-{version}.bat and -# win-sdk-{version}.bat using the versions passed as the argument parameter. -# - Fix win-sdk-{version}.bat overwriting the INCLUDE and LIB environment -# variables instead of appending. -# -# 2023-01-28 -# - Inital revision from mmozeiko -# https://gist.github.com/mmozeiko/7f3162ec2988e81e56d5c4e22cde9977/6863f19cb98b933c7535acf3d59ac64268c6bd1b -# - Add individual scripts to source variables for MSVC and Windows 10 -# separately "msvc-{version}.bat" and "win-sdk-{version}.bat" -# - Add '--no-sdk' and '--no-msvc' to prevent the download and installation of -# the Windows SDK and MSVC respectively. -# - Installation used to create 'Windows Kit/10/Redist' and unpack a D3D and MBN -# folder without being versioned. These folders are now placed under -# a versioned sub-directory to preserve the binaries and allow subsequent -# side-by-side installation of other versions of the SDK. - -import io -import os -import sys -import json -import shutil -import hashlib -import zipfile -import tempfile -import argparse -import subprocess -import urllib.request -import urllib.error -from pathlib import Path - -OUTPUT = Path("msvc") # output folder - -# other architectures may work or may not - not really tested -HOST = "x64" # or x86 -TARGET = "x64" # or x86, arm, arm64 - -MANIFEST_URL = "https://aka.ms/vs/17/release/channel" - -ssl_context = None - -def download(url): - with urllib.request.urlopen(url, context=ssl_context) as res: - return res.read() - -def download_progress(url, check, name, f): - data = io.BytesIO() - with urllib.request.urlopen(url, context=ssl_context) as res: - total = int(res.headers["Content-Length"]) - size = 0 - while True: - block = res.read(1<<20) - if not block: - break - f.write(block) - data.write(block) - size += len(block) - perc = size * 100 // total - print(f"\r{name} ... {perc}%", end="") - print() - data = data.getvalue() - digest = hashlib.sha256(data).hexdigest() - if check.lower() != digest: - exit(f"Hash mismatch for f{pkg}") - return data - -# super crappy msi format parser just to find required .cab files -def get_msi_cabs(msi): - index = 0 - while True: - index = msi.find(b".cab", index+4) - if index < 0: - return - yield msi[index-32:index+4].decode("ascii") - -def first(items, cond): - return next(item for item in items if cond(item)) - - -### parse command-line arguments - -ap = argparse.ArgumentParser() -ap.add_argument("--show-versions", const=True, action="store_const", help="Show available MSVC and Windows SDK versions") -ap.add_argument("--accept-license", const=True, action="store_const", help="Automatically accept license") -ap.add_argument("--msvc-version", help="Get specific MSVC version") -ap.add_argument("--sdk-version", help="Get specific Windows SDK version") -ap.add_argument("--no-msvc", const=True, action="store_const", help="Skip download and installing of msvc") -ap.add_argument("--no-sdk", const=True, action="store_const", help="Skip download and installing of Windows SDK") -args = ap.parse_args() - -### get main manifest - -try: - manifest = json.loads(download(MANIFEST_URL)) -except urllib.error.URLError as err: - import ssl - if isinstance(err.args[0], ssl.SSLCertVerificationError): - # for more info about Python & issues with Windows certificates see https://stackoverflow.com/a/52074591 - print("ERROR: ssl certificate verification error") - try: - import certifi - except ModuleNotFoundError: - print("ERROR: please install 'certifi' package to use Mozilla certificates") - print("ERROR: or update your Windows certs, see instructions here: https://woshub.com/updating-trusted-root-certificates-in-windows-10/#h2_3") - exit() - print("NOTE: retrying with certifi certificates") - ssl_context = ssl.create_default_context(cafile=certifi.where()) - manifest = json.loads(download(MANIFEST_URL)) - else: - raise - - -### download VS manifest - -vs = first(manifest["channelItems"], lambda x: x["id"] == "Microsoft.VisualStudio.Manifests.VisualStudio") -payload = vs["payloads"][0]["url"] - -vsmanifest = json.loads(download(payload)) - - -### find MSVC & WinSDK versions - -packages = {} -for p in vsmanifest["packages"]: - packages.setdefault(p["id"].lower(), []).append(p) - -msvc = {} -sdk = {} - -for pid,p in packages.items(): - if pid.startswith("Microsoft.VisualStudio.Component.VC.".lower()) and pid.endswith(".x86.x64".lower()): - pver = ".".join(pid.split(".")[4:6]) - if pver[0].isnumeric(): - msvc[pver] = pid - elif pid.startswith("Microsoft.VisualStudio.Component.Windows10SDK.".lower()) or \ - pid.startswith("Microsoft.VisualStudio.Component.Windows11SDK.".lower()): - pver = pid.split(".")[-1] - if pver.isnumeric(): - sdk[pver] = pid - -if args.show_versions: - print("MSVC versions:", " ".join(sorted(msvc.keys()))) - print("Windows SDK versions:", " ".join(sorted(sdk.keys()))) - exit(0) - -install_sdk = not args.no_sdk -install_msvc = not args.no_msvc -if args.no_sdk and args.no_msvc: - exit() - -msvc_ver_key = args.msvc_version or max(sorted(msvc.keys())) -sdk_ver_key = args.sdk_version or max(sorted(sdk.keys())) -msvc_ver = msvc_ver_key -sdk_ver = sdk_ver_key - -info_line = "Downloading" -if install_msvc: - if msvc_ver in msvc: - msvc_pid = msvc[msvc_ver] - msvc_ver = ".".join(msvc_pid.split(".")[4:-2]) - else: - exit(f"Unknown MSVC version: {args.msvc_version}") - info_line += f" MSVC v{msvc_ver}" - -if install_sdk: - if sdk_ver in sdk: - sdk_pid = sdk[sdk_ver] - else: - exit(f"Unknown Windows SDK version: {args.sdk_version}") - info_line += f" Windows SDK v{sdk_ver}" - -print(info_line) - - -### agree to license - -tools = first(manifest["channelItems"], lambda x: x["id"] == "Microsoft.VisualStudio.Product.BuildTools") -resource = first(tools["localizedResources"], lambda x: x["language"] == "en-us") -license = resource["license"] - -if not args.accept_license: - accept = input(f"Do you accept Visual Studio license at {license} [Y/N] ? ") - if not accept or accept[0].lower() != "y": - exit(0) - -OUTPUT.mkdir(exist_ok=True) -total_download = 0 - -OUTPUT_CACHE_DIR = OUTPUT / "Installers" -OUTPUT_CACHE_DIR.mkdir(exist_ok=True) - -OUTPUT_CACHE_MSVC_DIR = OUTPUT_CACHE_DIR / f"msvc-{msvc_ver}-{HOST}-{TARGET}" -OUTPUT_CACHE_WIN_SDK_DIR = OUTPUT_CACHE_DIR / f"win-sdk-{sdk_ver}-{HOST}-{TARGET}" - -### download MSVC - -if install_msvc: - msvc_packages = [ - # MSVC binaries - f"microsoft.vc.{msvc_ver}.tools.host{HOST}.target{TARGET}.base", - f"microsoft.vc.{msvc_ver}.tools.host{HOST}.target{TARGET}.res.base", - # MSVC headers - f"microsoft.vc.{msvc_ver}.crt.headers.base", - # MSVC libs - f"microsoft.vc.{msvc_ver}.crt.{TARGET}.desktop.base", - f"microsoft.vc.{msvc_ver}.crt.{TARGET}.store.base", - # MSVC runtime source - f"microsoft.vc.{msvc_ver}.crt.source.base", - # ASAN - f"microsoft.vc.{msvc_ver}.asan.headers.base", - f"microsoft.vc.{msvc_ver}.asan.{TARGET}.base", - # MSVC redist - #f"microsoft.vc.{msvc_ver}.crt.redist.x64.base", - ] - - OUTPUT_CACHE_MSVC_DIR.mkdir(exist_ok=True) - - for pkg in msvc_packages: - p = first(packages[pkg], lambda p: p.get("language") in (None, "en-US")) - for payload in p["payloads"]: - pkg_path = OUTPUT_CACHE_MSVC_DIR / pkg - if not os.path.exists(pkg_path): - with tempfile.NamedTemporaryFile(delete=False) as f: - data = download_progress(payload["url"], payload["sha256"], pkg, f) - total_download += len(data) - shutil.move(f.name, pkg_path) - - with zipfile.ZipFile(pkg_path) as z: - for name in z.namelist(): - if name.startswith("Contents/"): - out = OUTPUT / Path(name).relative_to("Contents") - out.parent.mkdir(parents=True, exist_ok=True) - out.write_bytes(z.read(name)) - - -### download Windows SDK - -if install_sdk: - sdk_packages = [ - # Windows SDK tools (like rc.exe & mt.exe) - f"Windows SDK for Windows Store Apps Tools-x86_en-us.msi", - # Windows SDK headers - f"Windows SDK for Windows Store Apps Headers-x86_en-us.msi", - f"Windows SDK Desktop Headers x86-x86_en-us.msi", - # Windows SDK libs - f"Windows SDK for Windows Store Apps Libs-x86_en-us.msi", - f"Windows SDK Desktop Libs {TARGET}-x86_en-us.msi", - # CRT headers & libs - f"Universal CRT Headers Libraries and Sources-x86_en-us.msi", - # CRT redist - #"Universal CRT Redistributable-x86_en-us.msi", - ] - - sdk_pkg = packages[sdk_pid][0] - sdk_pkg = packages[first(sdk_pkg["dependencies"], lambda x: True).lower()][0] - OUTPUT_CACHE_WIN_SDK_DIR.mkdir(exist_ok=True) - - msi = [] - cabs = [] - - # download msi files - for pkg in sdk_packages: - payload = first(sdk_pkg["payloads"], lambda p: p["fileName"] == f"Installers\\{pkg}") - msi_path = OUTPUT_CACHE_WIN_SDK_DIR / pkg - msi.append(msi_path) - if not os.path.exists(msi_path): - with tempfile.NamedTemporaryFile(delete=False) as f: - data = download_progress(payload["url"], payload["sha256"], pkg, f) - total_download += len(data) - shutil.move(f.name, msi_path) - - with open(msi_path, "rb") as f: - cabs += list(get_msi_cabs(f.read())) - - # download .cab files - for pkg in cabs: - payload = first(sdk_pkg["payloads"], lambda p: p["fileName"] == f"Installers\\{pkg}") - cab_path = OUTPUT_CACHE_WIN_SDK_DIR / pkg - if not os.path.exists(cab_path): - with tempfile.NamedTemporaryFile(delete=False) as f: - download_progress(payload["url"], payload["sha256"], pkg, f) - shutil.move(f.name, cab_path) - - print("Unpacking msi files...") - - # run msi installers - for m in msi: - subprocess.check_call(["msiexec.exe", "/a", m, "/quiet", "/qn", f"TARGETDIR={OUTPUT.resolve()}"]) - - -### versions - -msvcv = "" -sdkv = "" - -if install_msvc: - msvcv = list((OUTPUT / "VC/Tools/MSVC").glob(f"{msvc_ver_key}*"))[0].name - -if install_sdk: - sdkv = list((OUTPUT / "Windows Kits/10/bin").glob(f"*{sdk_ver_key}*"))[0].name - - -if install_msvc: - # place debug CRT runtime into MSVC folder (not what real Visual Studio installer does... but is reasonable) - dst = OUTPUT / "VC/Tools/MSVC" / msvcv / f"bin/Host{HOST}/{TARGET}" - - pkg = "microsoft.visualcpp.runtimedebug.14" - dbg = first(packages[pkg], lambda p: p["chip"] == HOST) - for payload in dbg["payloads"]: - name = payload["fileName"] - pkg_dir = OUTPUT_CACHE_MSVC_DIR /pkg - pkg_dir.mkdir(exist_ok=True) - pkg_path = pkg_dir / name - if not os.path.exists(pkg_path): - with tempfile.NamedTemporaryFile(delete=False) as f: - data = download_progress(payload["url"], payload["sha256"], f"{pkg}/{name}", f) - total_download += len(data) - shutil.move(f.name, pkg_path) - msi = OUTPUT_CACHE_MSVC_DIR / pkg / first(dbg["payloads"], lambda p: p["fileName"].endswith(".msi"))["fileName"] - - with tempfile.TemporaryDirectory() as d2: - subprocess.check_call(["msiexec.exe", "/a", str(msi), "/quiet", "/qn", f"TARGETDIR={d2}"]) - for f in first(Path(d2).glob("System*"), lambda x: True).iterdir(): - f.replace(dst / f.name) - - # download DIA SDK and put msdia140.dll file into MSVC folder - pkg = "microsoft.visualc.140.dia.sdk.msi" - dia = packages[pkg][0] - for payload in dia["payloads"]: - name = payload["fileName"] - pkg_dir = OUTPUT_CACHE_MSVC_DIR /pkg - pkg_dir.mkdir(exist_ok=True) - pkg_path = OUTPUT_CACHE_MSVC_DIR / pkg / name - if not os.path.exists(pkg_path): - with tempfile.NamedTemporaryFile(delete=False) as f: - data = download_progress(payload["url"], payload["sha256"], f"{pkg}/{name}", f) - total_download += len(data) - shutil.move(f.name, pkg_path) - msi = OUTPUT_CACHE_MSVC_DIR / pkg / first(dia["payloads"], lambda p: p["fileName"].endswith(".msi"))["fileName"] - - with tempfile.TemporaryDirectory() as d2: - subprocess.check_call(["msiexec.exe", "/a", str(msi), "/quiet", "/qn", f"TARGETDIR={d2}"]) - - if HOST == "x86": msdia = "msdia140.dll" - elif HOST == "x64": msdia = "amd64/msdia140.dll" - else: exit("unknown") - - src = Path(d2) / "Program Files" / "Microsoft Visual Studio 14.0" / "DIA SDK" / "bin" / msdia - src.replace(dst / "msdia140.dll") - -# place the folders under the Redist folder in the SDK under a versioned folder to allow other versions to be installed - -if install_sdk: - redist_dir = OUTPUT / "Windows Kits/10/Redist" - redist_versioned_dir = redist_dir / f'{sdkv}' - shutil.rmtree(redist_versioned_dir, ignore_errors=True) - redist_versioned_dir.mkdir(exist_ok=True) - - for file_name in os.listdir(redist_dir): - if not file_name.startswith('10.0.'): # Simple heuristic - shutil.move((redist_dir / file_name), redist_versioned_dir) - -### cleanup - -shutil.rmtree(OUTPUT / "Common7", ignore_errors=True) -for f in ["Auxiliary", f"lib/{TARGET}/store", f"lib/{TARGET}/uwp"]: - shutil.rmtree(OUTPUT / "VC/Tools/MSVC" / msvcv / f, ignore_errors=True) -for f in OUTPUT.glob("*.msi"): - f.unlink() -for f in ["Catalogs", "DesignTime", f"bin/{sdkv}/chpe", f"Lib/{sdkv}/ucrt_enclave"]: - shutil.rmtree(OUTPUT / "Windows Kits/10" / f, ignore_errors=True) -for arch in ["x86", "x64", "arm", "arm64"]: - if arch != TARGET: - shutil.rmtree(OUTPUT / "Windows Kits/10/Lib" / sdkv / "ucrt" / arch, ignore_errors=True) - shutil.rmtree(OUTPUT / "Windows Kits/10/Lib" / sdkv / "um" / arch, ignore_errors=True) - if arch != HOST: - shutil.rmtree(OUTPUT / "Windows Kits/10/bin" / sdkv / arch, ignore_errors=True) -# executable that is collecting & sending telemetry every time cl/link runs -(OUTPUT / "VC/Tools/MSVC" / msvcv / f"bin/Host{HOST}/{TARGET}/vctip.exe").unlink(missing_ok=True) - - -### setup.bat - -if install_msvc and install_sdk: - SETUP = f"""@echo off - -set MSVC_VERSION={msvcv} -set MSVC_HOST=Host{HOST} -set MSVC_ARCH={TARGET} -set MSVC_ROOT=%~dp0VC\\Tools\\MSVC\\%MSVC_VERSION% - -set SDK_VERSION={sdkv} -set SDK_ARCH={TARGET} -set SDK_INCLUDE=%~dp0Windows Kits\\10\\Include\\%SDK_VERSION% -set SDK_LIBS=%~dp0Windows Kits\\10\\Lib\\%SDK_VERSION% - -set WindowsSDKVersion=%SDK_VERSION% -set WindowsSDKDir=%~dp0Windows Kits\\10 - -set VCToolsInstallDir=%MSVC_ROOT% -set VSCMD_ARG_TGT_ARCH=%MSVC_ARCH% - -set PATH=%MSVC_ROOT%\\bin\\%MSVC_HOST%\\%MSVC_ARCH%;%~dp0Windows Kits\\10\\bin\\%SDK_VERSION%\\%SDK_ARCH%;%~dp0Windows Kits\\10\\bin\\%SDK_VERSION%\\%SDK_ARCH%\\ucrt;%PATH% -set INCLUDE=%MSVC_ROOT%\\include;%SDK_INCLUDE%\\ucrt;%SDK_INCLUDE%\\shared;%SDK_INCLUDE%\\um;%SDK_INCLUDE%\\winrt;%SDK_INCLUDE%\\cppwinrt -set LIB=%MSVC_ROOT%\\lib\\%MSVC_ARCH%;%SDK_LIBS%\\ucrt\\%SDK_ARCH%;%SDK_LIBS%\\um\\%SDK_ARCH% - """ - (OUTPUT / "setup.bat").write_text(SETUP) - -if install_msvc: - MSVC_SCRIPT = f"""@echo off - -set MSVC_VERSION={msvcv} -set MSVC_HOST=Host{HOST} -set MSVC_ARCH={TARGET} -set MSVC_ROOT=%~dp0VC\\Tools\\MSVC\\%MSVC_VERSION% - -set VCToolsInstallDir=%MSVC_ROOT% -set VSCMD_ARG_TGT_ARCH=%MSVC_ARCH% - -set PATH=%MSVC_ROOT%\\bin\\%MSVC_HOST%\\%MSVC_ARCH%;%PATH% -set INCLUDE=%MSVC_ROOT%\\include;%INCLUDE% -set LIB=%MSVC_ROOT%\\lib\\%MSVC_ARCH%;%LIB% -""" - (OUTPUT / f"msvc-{msvcv}.bat").write_text(MSVC_SCRIPT) - (OUTPUT / f"msvc-{msvc_ver_key}.bat").write_text(MSVC_SCRIPT) - -if install_sdk: - WIN10_SDK_SCRIPT = f"""@echo off - -set SDK_VERSION={sdkv} -set SDK_ARCH={TARGET} -set SDK_INCLUDE=%~dp0Windows Kits\\10\\Include\\%SDK_VERSION% -set SDK_LIBS=%~dp0Windows Kits\\10\\Lib\\%SDK_VERSION% - -set WindowsSDKVersion=%SDK_VERSION% -set WindowsSDKDir=%~dp0Windows Kits\\10 - -set PATH=%~dp0Windows Kits\\10\\bin\\%SDK_VERSION%\\%SDK_ARCH%;%~dp0Windows Kits\\10\\bin\\%SDK_VERSION%\\%SDK_ARCH%\\ucrt;%PATH% -set INCLUDE=%SDK_INCLUDE%\\ucrt;%SDK_INCLUDE%\\shared;%SDK_INCLUDE%\\um;%SDK_INCLUDE%\\winrt;%SDK_INCLUDE%\\cppwinrt;%INCLUDE% -set LIB=%SDK_LIBS%\\ucrt\\%SDK_ARCH%;%SDK_LIBS%\\um\\%SDK_ARCH%;%LIB% -""" - (OUTPUT / f"win-sdk-{sdkv}.bat").write_text(WIN10_SDK_SCRIPT) - (OUTPUT / f"win-sdk-{sdk_ver_key}.bat").write_text(WIN10_SDK_SCRIPT) - -print(f"Total downloaded: {total_download>>20} MB") -print("Done!")