From 1edb8506397812cbef66e9f7be0085443fc044c2 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Tue, 25 Nov 2025 23:57:02 +0100 Subject: [PATCH] Add script to generate macOS and iOS tbds --- build-scripts/create_tbds.py | 142 +++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100755 build-scripts/create_tbds.py diff --git a/build-scripts/create_tbds.py b/build-scripts/create_tbds.py new file mode 100755 index 0000000000..96f1090d18 --- /dev/null +++ b/build-scripts/create_tbds.py @@ -0,0 +1,142 @@ +#!/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())