Browse Source

Add script to generate macOS and iOS tbds

Anonymous Maarten 2 weeks ago
parent
commit
1edb850639
1 changed files with 142 additions and 0 deletions
  1. 142 0
      build-scripts/create_tbds.py

+ 142 - 0
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]
+
+
[email protected]
+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())