1
- from kivy_ios .toolchain import CythonRecipe
2
- from os .path import join
3
1
import logging
2
+ import os
4
3
import 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
5
13
6
14
logger = logging .getLogger (__name__ )
7
15
@@ -10,8 +18,7 @@ class KivyRecipe(CythonRecipe):
10
18
version = "2.3.1"
11
19
url = "https://github.com/kivy/kivy/archive/{version}.zip"
12
20
library = "libkivy.a"
13
- depends = ["sdl2" , "sdl2_image" , "sdl2_mixer" , "sdl2_ttf" , "ios" ,
14
- "pyobjus" , "python" ]
21
+ _base_depends = ["ios" , "pyobjus" , "python" ]
15
22
python_depends = [
16
23
"certifi" ,
17
24
"charset-normalizer" ,
@@ -20,16 +27,130 @@ class KivyRecipe(CythonRecipe):
20
27
"urllib3" ,
21
28
"filetype" ,
22
29
]
23
- pbx_frameworks = ["OpenGLES" , "Accelerate" , "CoreMedia" , "CoreVideo" ]
30
+ pbx_frameworks = [
31
+ "OpenGLES" ,
32
+ "Accelerate" ,
33
+ "CoreMedia" ,
34
+ "CoreVideo" ,
35
+ "AVFoundation" ,
36
+ ]
24
37
pre_build_ext = True
25
38
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
+
26
109
def get_recipe_env (self , plat ):
27
110
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
+ )
33
154
return env
34
155
35
156
def build_platform (self , plat ):
0 commit comments