kivy-ios/recipes/python3/__init__.py

150 lines
5.9 KiB
Python

from toolchain import Recipe, shprint
from os.path import join
import sh
import shutil
import os
class Python3Recipe(Recipe):
version = "3.7.1"
url = "https://www.python.org/ftp/python/{version}/Python-{version}.tgz"
depends = ["hostpython3", "libffi", ]
optional_depends = ["openssl"]
library = "libpython3.7m.a"
pbx_libraries = ["libz", "libbz2", "libsqlite3"]
def init_with_ctx(self, ctx):
super(Python3Recipe, self).init_with_ctx(ctx)
self.ctx.python_ver_dir = "python3.7"
self.ctx.python_prefix = join(ctx.dist_dir, "root", "python")
self.ctx.site_packages_dir = join(
ctx.dist_dir, "root", "python", "lib", ctx.python_ver_dir,
"site-packages")
def prebuild_arch(self, arch):
# common to all archs
if self.has_marker("patched"):
return
# self.apply_patch("ssize-t-max.patch")
# self.apply_patch("dynload.patch")
# self.apply_patch("static-_sqlite3.patch")
shutil.copy("Modules/Setup.dist", "Modules/Setup")
self.apply_patch("xcompile.patch")
# self.copy_file("_scproxy.py", "Lib/_scproxy.py")
# self.apply_patch("xcompile.patch")
# self.apply_patch("setuppath.patch")
# self.append_file("ModulesSetup.mobile", "Modules/Setup.local")
# self.apply_patch("ipv6.patch")
# if "openssl.build_all" in self.ctx.state:
# self.append_file("ModulesSetup.openssl", "Modules/Setup.local")
# self.apply_patch("posixmodule.patch")
self.set_marker("patched")
def get_build_env(self, arch):
build_env = arch.get_env()
build_env["PATH"] = "{}:{}".format(
join(self.ctx.dist_dir, "hostpython3", "bin"),
os.environ["PATH"])
return build_env
def build_arch(self, arch):
build_env = self.get_build_env(arch)
configure = sh.Command(join(self.build_dir, "configure"))
py_arch = arch.arch
if py_arch == "armv7":
py_arch = "arm"
elif py_arch == "arm64":
py_arch = "aarch64"
prefix = join(self.ctx.dist_dir, "python3")
shprint(configure,
"CC={}".format(build_env["CC"]),
"LD={}".format(build_env["LD"]),
"CFLAGS={}".format(build_env["CFLAGS"]),
"LDFLAGS={} -undefined dynamic_lookup".format(build_env["LDFLAGS"]),
# "--without-pymalloc",
# "--disable-toolbox-glue",
"ac_cv_file__dev_ptmx=yes",
"ac_cv_file__dev_ptc=no",
"ac_cv_little_endian_double=yes",
"ac_cv_func_memrchr=no",
"ac_cv_func_getentropy=no",
"ac_cv_func_getresuid=no",
"ac_cv_func_getresgid=no",
"ac_cv_func_setresgid=no",
"ac_cv_func_setresuid=no",
"ac_cv_func_plock=no",
"ac_cv_func_dup3=no",
"ac_cv_func_pipe2=no",
"ac_cv_func_preadv=no",
"ac_cv_func_pwritev=no",
"ac_cv_func_preadv2=no",
"ac_cv_func_pwritev2=no",
"ac_cv_func_mkfifoat=no",
"ac_cv_func_mknodat=no",
"ac_cv_func_posix_fadvise=no",
"ac_cv_func_posix_fallocate=no",
"ac_cv_func_sigwaitinfo=no",
"ac_cv_func_sigtimedwait=no",
"ac_cv_func_clock_settime=no",
"ac_cv_func_pthread_getcpuclockid=no",
"ac_cv_func_sched_setscheduler=no",
"ac_cv_func_sched_setparam=no",
"ac_cv_func_clock_gettime=no",
"--host={}-apple-ios".format(py_arch),
"--build=x86_64-apple-darwin",
"--prefix={}".format(prefix),
"--exec-prefix={}".format(prefix),
"--without-ensurepip",
# "--with-system-ffi",
# "--without-doc-strings",
"--enable-ipv6",
_env=build_env)
# self._patch_pyconfig()
# self.apply_patch("ctypes_duplicate.patch")
# self.apply_patch("ctypes_duplicate_longdouble.patch")
shprint(sh.make, self.ctx.concurrent_make)
# "HOSTPYTHON={}".format(self.ctx.hostpython),
# "HOSTPGEN={}".format(self.ctx.hostpgen))
# "CROSS_COMPILE_TARGET=yes",
def install(self):
arch = list(self.filtered_archs)[0]
build_env = self.get_build_env(arch)
build_dir = self.get_build_dir(arch.arch)
shprint(sh.make, self.ctx.concurrent_make,
"-C", build_dir,
"install",
"prefix={}".format(join(self.ctx.dist_dir, "root", "python3")),
_env=build_env)
self.reduce_python()
def reduce_python(self):
print("Reduce python")
oldpwd = os.getcwd()
try:
print("Remove files unlikely to be used")
os.chdir(join(self.ctx.dist_dir, "root", "python3"))
sh.rm("-rf", "share")
os.chdir(join(
self.ctx.dist_dir, "root", "python3", "lib",
"python3.7", "config-3.7m-darwin"))
sh.rm("libpython3.7m.a")
sh.rm("python.o")
sh.rm("config.c.in")
sh.rm("makesetup")
sh.rm("install-sh")
os.chdir(join(self.ctx.dist_dir, "root", "python3", "lib", "python3.7"))
# sh.find(".", "-iname", "*.pyc", "-exec", "rm", "{}", ";")
# sh.find(".", "-iname", "*.py", "-exec", "rm", "{}", ";")
#sh.find(".", "-iname", "test*", "-exec", "rm", "-rf", "{}", ";")
sh.rm("-rf", "wsgiref", "curses", "idlelib", "lib2to3")
# now create the zip.
print("Create a stdlib.zip")
sh.zip("-r", "../stdlib.zip", sh.glob("*"))
finally:
os.chdir(oldpwd)
recipe = Python3Recipe()