2023-10-05 03:26:02 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
###
|
|
|
|
# Downloads various tools from GitHub releases.
|
|
|
|
#
|
|
|
|
# Usage:
|
|
|
|
# python3 tools/download_tool.py wibo build/tools/wibo --tag 1.0.0
|
|
|
|
#
|
|
|
|
# If changes are made, please submit a PR to
|
|
|
|
# https://github.com/encounter/dtk-template
|
|
|
|
###
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import io
|
|
|
|
import os
|
|
|
|
import platform
|
|
|
|
import shutil
|
|
|
|
import stat
|
|
|
|
import urllib.request
|
|
|
|
import zipfile
|
2024-01-24 06:21:46 +00:00
|
|
|
from typing import Callable, Dict
|
2023-10-05 03:26:02 +00:00
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
2024-03-04 05:47:05 +00:00
|
|
|
def binutils_url(tag):
|
|
|
|
uname = platform.uname()
|
|
|
|
system = uname.system.lower()
|
|
|
|
arch = uname.machine.lower()
|
|
|
|
if system == "darwin":
|
|
|
|
system = "macos"
|
|
|
|
arch = "universal"
|
|
|
|
elif arch == "amd64":
|
|
|
|
arch = "x86_64"
|
|
|
|
|
|
|
|
repo = "https://github.com/encounter/gc-wii-binutils"
|
|
|
|
return f"{repo}/releases/download/{tag}/{system}-{arch}.zip"
|
|
|
|
|
|
|
|
|
|
|
|
def compilers_url(tag: str) -> str:
|
|
|
|
return f"https://files.decomp.dev/compilers_{tag}.zip"
|
|
|
|
|
|
|
|
|
2024-01-24 06:21:46 +00:00
|
|
|
def dtk_url(tag: str) -> str:
|
2023-10-05 03:26:02 +00:00
|
|
|
uname = platform.uname()
|
|
|
|
suffix = ""
|
|
|
|
system = uname.system.lower()
|
|
|
|
if system == "darwin":
|
|
|
|
system = "macos"
|
|
|
|
elif system == "windows":
|
|
|
|
suffix = ".exe"
|
|
|
|
arch = uname.machine.lower()
|
|
|
|
if arch == "amd64":
|
|
|
|
arch = "x86_64"
|
|
|
|
|
|
|
|
repo = "https://github.com/encounter/decomp-toolkit"
|
|
|
|
return f"{repo}/releases/download/{tag}/dtk-{system}-{arch}{suffix}"
|
|
|
|
|
2024-09-23 12:43:05 +00:00
|
|
|
|
2024-08-13 00:09:10 +00:00
|
|
|
def objdiff_cli_url(tag: str) -> str:
|
|
|
|
uname = platform.uname()
|
|
|
|
suffix = ""
|
|
|
|
system = uname.system.lower()
|
|
|
|
if system == "darwin":
|
|
|
|
system = "macos"
|
|
|
|
elif system == "windows":
|
|
|
|
suffix = ".exe"
|
|
|
|
arch = uname.machine.lower()
|
|
|
|
if arch == "amd64":
|
|
|
|
arch = "x86_64"
|
|
|
|
|
|
|
|
repo = "https://github.com/encounter/objdiff"
|
|
|
|
return f"{repo}/releases/download/{tag}/objdiff-cli-{system}-{arch}{suffix}"
|
|
|
|
|
2023-10-05 03:26:02 +00:00
|
|
|
|
2024-01-24 06:21:46 +00:00
|
|
|
def sjiswrap_url(tag: str) -> str:
|
2023-10-05 03:26:02 +00:00
|
|
|
repo = "https://github.com/encounter/sjiswrap"
|
|
|
|
return f"{repo}/releases/download/{tag}/sjiswrap-windows-x86.exe"
|
|
|
|
|
|
|
|
|
2024-01-24 06:21:46 +00:00
|
|
|
def wibo_url(tag: str) -> str:
|
2023-10-05 03:26:02 +00:00
|
|
|
repo = "https://github.com/decompals/wibo"
|
|
|
|
return f"{repo}/releases/download/{tag}/wibo"
|
|
|
|
|
|
|
|
|
2024-01-24 06:21:46 +00:00
|
|
|
TOOLS: Dict[str, Callable[[str], str]] = {
|
2024-03-04 05:47:05 +00:00
|
|
|
"binutils": binutils_url,
|
|
|
|
"compilers": compilers_url,
|
2023-10-05 03:26:02 +00:00
|
|
|
"dtk": dtk_url,
|
2024-08-13 00:09:10 +00:00
|
|
|
"objdiff-cli": objdiff_cli_url,
|
2023-10-05 03:26:02 +00:00
|
|
|
"sjiswrap": sjiswrap_url,
|
|
|
|
"wibo": wibo_url,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2024-01-24 06:21:46 +00:00
|
|
|
def main() -> None:
|
2023-10-05 03:26:02 +00:00
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument("tool", help="Tool name")
|
|
|
|
parser.add_argument("output", type=Path, help="output file path")
|
|
|
|
parser.add_argument("--tag", help="GitHub tag", required=True)
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
url = TOOLS[args.tool](args.tag)
|
|
|
|
output = Path(args.output)
|
|
|
|
|
|
|
|
print(f"Downloading {url} to {output}")
|
|
|
|
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
|
|
|
|
with urllib.request.urlopen(req) as response:
|
|
|
|
if url.endswith(".zip"):
|
|
|
|
data = io.BytesIO(response.read())
|
|
|
|
with zipfile.ZipFile(data) as f:
|
|
|
|
f.extractall(output)
|
2024-03-04 05:47:05 +00:00
|
|
|
# Make all files executable
|
|
|
|
for root, _, files in os.walk(output):
|
|
|
|
for name in files:
|
|
|
|
os.chmod(os.path.join(root, name), 0o755)
|
|
|
|
output.touch(mode=0o755) # Update dir modtime
|
2023-10-05 03:26:02 +00:00
|
|
|
else:
|
|
|
|
with open(output, "wb") as f:
|
|
|
|
shutil.copyfileobj(response, f)
|
|
|
|
st = os.stat(output)
|
|
|
|
os.chmod(output, st.st_mode | stat.S_IEXEC)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2023-11-22 01:14:13 +00:00
|
|
|
main()
|