#!/usr/bin/env python3 import argparse import dataclasses import enum from pathlib import Path import json import subprocess import sys import tempfile SDL_ROOT = Path(__file__).resolve().parents[1] @dataclasses.dataclass class TbdInfo: install_name: str target_infos: list[dict[str, str]] class TbdPlatform(enum.StrEnum): MACOS = "macOS" IOS = "iOS" TBDINFOS = { TbdPlatform.MACOS: TbdInfo( install_name="@rpath/SDL3.framework/Versions/A/SDL3", target_infos=[ { "min_deployment": "10.13", "target": "arm64-macos", }, { "min_deployment": "10.13", "target": "x86_64-macos", }, ] ), TbdPlatform.IOS: TbdInfo( install_name="@rpath/SDL3.framework/SDL3", target_infos=[ { "min_deployment": "11.0", "target": "arm64-ios", }, { "min_deployment": "11.0", "target": "arm64-ios-simulator", }, { "min_deployment": "11.0", "target": "x86_64-ios-simulator", }, { "min_deployment": "11.0", "target": "arm64-tvos", }, { "min_deployment": "11.0", "target": "arm64-tvos-simulator", }, { "min_deployment": "11.0", "target": "x86_64-tvos-simulator", }, { "min_deployment": "1.3", "target": "arm64-xros", }, { "min_deployment": "1.3", "target": "arm64-xros-simulator", }, ] ), } def create_sdl3_tbd(symbols: list[str], tbd_info: TbdInfo): return { "main_library": { "compatibility_versions": [ { "version": "201" } ], "current_versions": [ { "version": "201" } ], "exported_symbols": [ { "text": { "global": symbols } } ], "flags": [ { "attributes": [ "not_app_extension_safe" ] } ], "install_names": [ { "name": tbd_info.install_name } ], "target_info": tbd_info.target_infos }, "tapi_tbd_version": 5 } def main(): parser = argparse.ArgumentParser(allow_abbrev=False) parser.add_argument("--output", "-o", type=Path, help="Output path (default is stdout)") parser.add_argument("--platform", type=TbdPlatform, required=True, choices=[str(e) for e in TbdPlatform], help="Apple Platform") args = parser.parse_args() with tempfile.NamedTemporaryFile() as f_temp: f_temp.close() subprocess.check_call([sys.executable,SDL_ROOT / "src/dynapi/gendynapi.py", "--dump", f_temp.name], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) with open(f_temp.name) as f_json: sdl3_json = json.load(f_json) sdl3_macos_symbols = [f"_{symbol_info['name']}" for symbol_info in sdl3_json] sdl3_macos_symbols.sort() tbd = create_sdl3_tbd(symbols=sdl3_macos_symbols, tbd_info=TBDINFOS[args.platform]) with (args.output.open("w", newline="") if args.output else sys.stdout) as f_out: json.dump(tbd, fp=f_out, indent=2) f_out.write("\n") if __name__ == "__main__": raise SystemExit(main())