diff --git a/kivy_ios/recipes/kivy/__init__.py b/kivy_ios/recipes/kivy/__init__.py index 13a82439..b9831989 100644 --- a/kivy_ios/recipes/kivy/__init__.py +++ b/kivy_ios/recipes/kivy/__init__.py @@ -16,7 +16,9 @@ class KivyRecipe(CythonRecipe): version = "2.3.1" - url = "https://github.com/kivy/kivy/archive/{version}.zip" + # url = "https://github.com/kivy/kivy/archive/{version}.zip" + url = "https://github.com/DexerBr/kivy/archive/refs/heads/pure_skia_tests.zip" + # url = "https://github.com/misl6/kivy/archive/refs/heads/fix-typo-skia-include-dirs.zip" library = "libkivy.a" _base_depends = ["ios", "pyobjus", "python"] python_depends = [ @@ -110,6 +112,7 @@ def depends(self): ] elif self.get_required_sdl_version() == "sdl3": return self._base_depends + [ + "skia", "sdl3", "sdl3_image", "sdl3_ttf", @@ -133,6 +136,8 @@ def get_recipe_env(self, plat): ] ) elif self.get_required_sdl_version() == "sdl3": + env["SKIA_LIB_DIR"] = "/fake/path/to/skia/libs" + env["SKIA_INCLUDE_DIR"] = join(self.ctx.dist_dir, "include", plat.name, "skia") env["KIVY_ANGLE_INCLUDE_DIR"] = join(self.ctx.dist_dir, "include", "common", "angle") env["KIVY_ANGLE_LIB_DIR"] = join(self.ctx.dist_dir, "frameworks", plat.sdk) env["KIVY_SDL3_PATH"] = ":".join( diff --git a/kivy_ios/recipes/skia/__init__.py b/kivy_ios/recipes/skia/__init__.py new file mode 100644 index 00000000..11d7574b --- /dev/null +++ b/kivy_ios/recipes/skia/__init__.py @@ -0,0 +1,102 @@ +import os +import shutil +import sh + +from kivy_ios.toolchain import Recipe, shprint + + +class LibSkiaRecipe(Recipe): + version = "skia-binaries-m138-rev3.a0" + url = "https://github.com/DexerBR/skia-builder/releases/download/{version}/ios-merged.tar.gz" + skia_libraries = [ + # "libskresources.a", + "libskparagraph.a", + "libskia.a", + "libskottie.a", + # "libsvg.a", + "libsksg.a", + "libskshaper.a", + "libskunicode_icu.a", + "libskunicode_core.a", + "libjsonreader.a", + ] + libraries = [ + "dist/libskmerged.a", + ] + + include_dir = [ + "dist/include_dirs", + ] + + include_per_platform = True + + def _get_skia_platform(self, plat): + if plat.name == "iphonesimulator-arm64": + return "iossimulator-arm64" + elif plat.name == "iphonesimulator-x86_64": + return "iossimulator-x64" + elif plat.name == "iphoneos-arm64": + return "ios-arm64" + + def build_platform(self, plat): + + build_dir = self.get_build_dir(plat) + + # Get the Skia platform name + skia_platform = self._get_skia_platform(plat) + + # Create the unpack directory if it doesn't exist + unpack_dir = os.path.join(build_dir, "unpacked") + if not os.path.exists(unpack_dir): + os.makedirs(unpack_dir) + + # Create the dist directory in build_dir if it doesn't exist + skia_dist_dir = os.path.join(build_dir, "dist") + if not os.path.exists(skia_dist_dir): + os.makedirs(skia_dist_dir) + + skia_binaries_archive = os.path.join( + build_dir, f"{skia_platform}.tar.gz" + ) + + self.extract_file(skia_binaries_archive, unpack_dir) + + # Merge the static libraries into a single library + merged_lib_path = os.path.join(skia_dist_dir, "libskmerged.a") + + # Use libtool to merge the libraries + libtool_cmd = ( + [ + sh.Command("libtool"), + "-static", + ] + + ["-o", merged_lib_path] + + [ + os.path.join("unpacked", "bin", lib) + for lib in self.skia_libraries + ] + ) + shprint(*libtool_cmd) + + for skia_src in ["include", "modules", "src"]: + # Add include files to the distribution directory + include_dir = os.path.join(unpack_dir, skia_src) + dist_include_dir = os.path.join(skia_dist_dir, "include_dirs", skia_src) + + if os.path.exists(dist_include_dir): + shutil.rmtree(dist_include_dir) + + if not os.path.exists(dist_include_dir): + os.makedirs(dist_include_dir) + + # Copy all the files and directories from include_dir to dist_include_dir + for item in os.listdir(include_dir): + s = os.path.join(include_dir, item) + d = os.path.join(dist_include_dir, item) + if os.path.isdir(s): + shutil.copytree(s, d) + else: + shutil.copy2(s, d) + + +recipe = LibSkiaRecipe() diff --git a/kivy_ios/toolchain.py b/kivy_ios/toolchain.py index bc61a149..bb3e5642 100755 --- a/kivy_ios/toolchain.py +++ b/kivy_ios/toolchain.py @@ -944,7 +944,6 @@ def lipoize_libraries(self): if plat.sdk not in sdks_args: sdks_args[plat.sdk] = [] sdks_args[plat.sdk].extend([ - "-arch", plat.arch, join(self.get_build_dir(plat), library_fp.format(plat=plat)) ])