Skip to content

Commit 70c89c2

Browse files
authored
Select SDL version to use based on target Kivy version (#976)
* Select SDL version to use based on Kivy version * Add missing dependency
1 parent 94c9cdf commit 70c89c2

File tree

3 files changed

+133
-10
lines changed

3 files changed

+133
-10
lines changed

kivy_ios/recipes/kivy/__init__.py

Lines changed: 131 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1-
from kivy_ios.toolchain import CythonRecipe
2-
from os.path import join
31
import logging
2+
import os
43
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
513

614
logger = 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):

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ pbxproj==3.5.0
22
Pillow>=6.1.0
33
cookiecutter==2.1.1
44
sh==1.12.14
5+
packaging

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ install_requires =
3232
pbxproj
3333
Pillow
3434
sh
35+
packaging
3536
packages = find:
3637
# note this is a bit excessive as it includes absolutely everything
3738
# make sure you run with from a clean directory

0 commit comments

Comments
 (0)