1- from kivy_ios .toolchain import CythonRecipe
2- from os .path import join
31import logging
2+ import os
43import shutil
4+ import sys
5+ import tempfile
6+
7+ from os .path import join
8+
9+ import packaging .version
10+ import sh
11+
12+ from kivy_ios .toolchain import CythonRecipe
513
614logger = logging .getLogger (__name__ )
715
@@ -10,8 +18,7 @@ class KivyRecipe(CythonRecipe):
1018 version = "2.3.1"
1119 url = "https://github.com/kivy/kivy/archive/{version}.zip"
1220 library = "libkivy.a"
13- depends = ["sdl2" , "sdl2_image" , "sdl2_mixer" , "sdl2_ttf" , "ios" ,
14- "pyobjus" , "python" ]
21+ _base_depends = ["ios" , "pyobjus" , "python" ]
1522 python_depends = [
1623 "certifi" ,
1724 "charset-normalizer" ,
@@ -20,16 +27,130 @@ class KivyRecipe(CythonRecipe):
2027 "urllib3" ,
2128 "filetype" ,
2229 ]
23- pbx_frameworks = ["OpenGLES" , "Accelerate" , "CoreMedia" , "CoreVideo" ]
30+ pbx_frameworks = [
31+ "OpenGLES" ,
32+ "Accelerate" ,
33+ "CoreMedia" ,
34+ "CoreVideo" ,
35+ "AVFoundation" ,
36+ ]
2437 pre_build_ext = True
2538
39+ def __init__ (self , * args , ** kwargs ):
40+ super ().__init__ (* args , ** kwargs )
41+ self ._required_sdl_version = None
42+
43+ def get_required_sdl_version (self ):
44+ """
45+ Determine the SDL version required by the Kivy version.
46+ Returns 'sdl2' for Kivy versions < 2.3.0, and 'sdl3' for Kivy >= 2.3.0.
47+ """
48+ if self ._required_sdl_version is not None :
49+ return self ._required_sdl_version
50+
51+ # Download and extract Kivy source to a temporary directory
52+ with tempfile .TemporaryDirectory () as temp_dir :
53+ archive_path = join (temp_dir , "kivy.zip" )
54+ self .download_file (
55+ self .url .format (version = self .version ), archive_path
56+ )
57+ self .extract_file (archive_path , temp_dir )
58+
59+ # Locate the extracted Kivy folder
60+ kivy_folders = [
61+ f
62+ for f in os .listdir (temp_dir )
63+ if os .path .isdir (os .path .join (temp_dir , f ))
64+ ]
65+ kivy_dir = os .path .join (temp_dir , kivy_folders [0 ], "kivy" )
66+
67+ # Get Kivy version by running a subprocess
68+ cur_dir = os .getcwd ()
69+ try :
70+ os .chdir (kivy_dir )
71+ cmd = sh .Command (sys .executable )
72+ kivy_version_str = cmd (
73+ "-c" ,
74+ "import _version; print(_version.__version__)" ,
75+ ).strip ()
76+ finally :
77+ os .chdir (cur_dir )
78+
79+ kivy_version = packaging .version .parse (str (kivy_version_str ))
80+ self ._required_sdl_version = (
81+ "sdl2"
82+ if kivy_version < packaging .version .parse ("3.0.0.dev0" )
83+ else "sdl3"
84+ )
85+
86+ return self ._required_sdl_version
87+
88+ @property
89+ def depends (self ):
90+ if self .get_required_sdl_version () == "sdl2" :
91+ return self ._base_depends + [
92+ "sdl2" ,
93+ "sdl2_image" ,
94+ "sdl2_ttf" ,
95+ "sdl2_mixer" ,
96+ ]
97+ elif self .get_required_sdl_version () == "sdl3" :
98+ return self ._base_depends + [
99+ "sdl3" ,
100+ "sdl3_image" ,
101+ "sdl3_ttf" ,
102+ "sdl3_mixer" ,
103+ ]
104+ else :
105+ raise ValueError (
106+ f"Unsupported SDL version: { self .get_required_sdl_version ()} "
107+ )
108+
26109 def get_recipe_env (self , plat ):
27110 env = super ().get_recipe_env (plat )
28- env ["KIVY_SDL2_PATH" ] = ":" .join ([
29- join (self .ctx .dist_dir , "include" , "common" , "sdl2" ),
30- join (self .ctx .dist_dir , "include" , "common" , "sdl2_image" ),
31- join (self .ctx .dist_dir , "include" , "common" , "sdl2_ttf" ),
32- join (self .ctx .dist_dir , "include" , "common" , "sdl2_mixer" )])
111+ if self .get_required_sdl_version () == "sdl2" :
112+ env ["KIVY_SDL2_PATH" ] = ":" .join (
113+ [
114+ join (self .ctx .dist_dir , "include" , "common" , "sdl2" ),
115+ join (self .ctx .dist_dir , "include" , "common" , "sdl2_image" ),
116+ join (self .ctx .dist_dir , "include" , "common" , "sdl2_ttf" ),
117+ join (self .ctx .dist_dir , "include" , "common" , "sdl2_mixer" ),
118+ ]
119+ )
120+ elif self .get_required_sdl_version () == "sdl3" :
121+ env ["USE_ANGLE_GL_BACKEND" ] = "0"
122+ env ["KIVY_SDL3_PATH" ] = ":" .join (
123+ [
124+ join (self .ctx .dist_dir , "include" , "common" , "sdl3" ),
125+ join (
126+ self .ctx .dist_dir , "include" , "common" , "sdl3" , "SDL3"
127+ ),
128+ join (self .ctx .dist_dir , "include" , "common" , "sdl3_image" ),
129+ join (
130+ self .ctx .dist_dir ,
131+ "include" ,
132+ "common" ,
133+ "sdl3_image" ,
134+ "SDL3_image" ,
135+ ),
136+ join (self .ctx .dist_dir , "include" , "common" , "sdl3_ttf" ),
137+ join (
138+ self .ctx .dist_dir ,
139+ "include" ,
140+ "common" ,
141+ "sdl3_ttf" ,
142+ "SDL3_ttf" ,
143+ ),
144+ join (self .ctx .dist_dir , "include" , "common" , "sdl3_mixer" ),
145+ join (
146+ self .ctx .dist_dir ,
147+ "include" ,
148+ "common" ,
149+ "sdl3_mixer" ,
150+ "SDL3_mixer" ,
151+ ),
152+ ]
153+ )
33154 return env
34155
35156 def build_platform (self , plat ):
0 commit comments