From f353960298ef85de83fb973ae6dc404826a2560b Mon Sep 17 00:00:00 2001 From: akshayaurora Date: Wed, 25 Feb 2015 17:23:26 +0530 Subject: [PATCH] New: libjpeg and libz recipes, pil recipe WIP --- recipes/__init__.pyc | Bin 136 -> 134 bytes recipes/hostpython/ModulesSetup | 1 + recipes/hostpython/__init__.py | 1 + recipes/hostpython/_scproxy.py | 10 +++ recipes/libjpeg/__init__.py | 46 ++++++++++++ recipes/libz/__init__.py | 51 +++++++++++++ recipes/pil/__init__.py | 122 ++++++++++++++++++++++++++++++++ 7 files changed, 231 insertions(+) create mode 100644 recipes/hostpython/_scproxy.py create mode 100644 recipes/libjpeg/__init__.py create mode 100644 recipes/libz/__init__.py create mode 100644 recipes/pil/__init__.py diff --git a/recipes/__init__.pyc b/recipes/__init__.pyc index 1200419d9379b939cc7b8b8edee6c5e83a4d17e4..7fd7e046b58645c770fb6e1be473337e823b369e 100644 GIT binary patch delta 41 wcmeBRY-40+{>;mj?(ldbyP23i0|SG8XmM&$v3_A`VqSipesX?F>cmiE0P|uDrvLx| delta 43 ycmZo;>|kVP{>;nuWA^EZ>}C>%3=9nVp~b01#rh?gCHeZv`6;RTnfb*NgN*?w-wq`J diff --git a/recipes/hostpython/ModulesSetup b/recipes/hostpython/ModulesSetup index 7632c03..28403a9 100644 --- a/recipes/hostpython/ModulesSetup +++ b/recipes/hostpython/ModulesSetup @@ -53,3 +53,4 @@ future_builtins future_builtins.c # ctypes _ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c + diff --git a/recipes/hostpython/__init__.py b/recipes/hostpython/__init__.py index d6cc63b..21d913f 100644 --- a/recipes/hostpython/__init__.py +++ b/recipes/hostpython/__init__.py @@ -21,6 +21,7 @@ class HostpythonRecipe(Recipe): def prebuild_arch(self, arch): if self.has_marker("patched"): return + self.copy_file("_scproxy.py", "Lib/_scproxy.py") self.apply_patch("ssize-t-max.patch") self.apply_patch("dynload.patch") self.apply_patch("static-_sqlite3.patch") diff --git a/recipes/hostpython/_scproxy.py b/recipes/hostpython/_scproxy.py new file mode 100644 index 0000000..11c8409 --- /dev/null +++ b/recipes/hostpython/_scproxy.py @@ -0,0 +1,10 @@ +''' +Stub functions for _scproxy on OsX +No proxy is supported yet. +''' + +def _get_proxy_settings(): + return {'exclude_simple': 1} + +def _get_proxies(): + return {} diff --git a/recipes/libjpeg/__init__.py b/recipes/libjpeg/__init__.py new file mode 100644 index 0000000..09e693b --- /dev/null +++ b/recipes/libjpeg/__init__.py @@ -0,0 +1,46 @@ +from toolchain import Recipe, shprint +from os.path import join, exists +import sh +import os +import fnmatch +import shutil + + +class JpegRecipe(Recipe): + version = "v9a" + url = "http://www.ijg.org/files/jpegsrc.{}.tar.gz".format(version) + library = "libjpeg.la" + include_dir = [ + ("jpeglib.h", ""), + ("cdjpeg.h", ""), + ("jconfig.h", ""), + ("jdct.h", ""), + ("jerror.h", ""), + ("jinclude.h", ""), + ("jmemsys.h", ""), + ("jmorecfg.h", ""), + ("jpegint.h", ""), + ("jversion.h", ""), + ("transupp.h", "") + ] + include_per_arch = True + + + def build_arch(self, arch): + build_env = arch.get_env() + configure = sh.Command(join(self.build_dir, "configure")) + shprint(configure, + "CC={}".format(build_env["CC"]), + "LD={}".format(build_env["LD"]), + "CFLAGS={}".format(build_env["CFLAGS"]), + "LDFLAGS={}".format(build_env["LDFLAGS"]), + "--prefix=/", + "--host={}".format(arch.triple), + "--enable-static=yes", + "--enable-shared=no") + shprint(sh.make, "clean") + shprint(sh.make) + +recipe = JpegRecipe() + + diff --git a/recipes/libz/__init__.py b/recipes/libz/__init__.py new file mode 100644 index 0000000..dee0d6e --- /dev/null +++ b/recipes/libz/__init__.py @@ -0,0 +1,51 @@ +from toolchain import Recipe, shprint +from os.path import join, exists +import sh +import os +import fnmatch +import shutil + + +class ZlibRecipe(Recipe): + version = "1.2.8" + url = "http://liquidtelecom.dl.sourceforge.net/project/libpng/zlib/{version}/zlib-{version}.tar.gz".format(version=version) + library = "libz.a" + include_dir = [ + ("zlib.h", ""), + ("crc32.h", ""), + ("deflate.h", ""), + ("gzguts.h", ""), + ("inffast.h", ""), + ("inffixed.h", ""), + ("inflate.h", ""), + ("inftrees.h", ""), + ("trees.h", ""), + ("zconf.h", ""), + ("zutil.h", ""), + ("contrib/iostream/zfstream.h", "contrib/iostream/"), + ("contrib/iostream2/zstream.h", "contrib/iostream/"), + ("contrib/iostream3/zfstream.h", "contrib/iostream/"), + ("contrib/puff/puff.h", "contrib/puff"), + ("contrib/minizip/crypt.h", "contrib/minizip"), + ("contrib/minizip/ioapi.h", "contrib/minizip"), + ("contrib/minizip/mztools.h", "contrib/minizip"), + ("contrib/minizip/unzip.h", "contrib/minizip"), + ("contrib/minizip/zip.h", "contrib/minizip") + ] + include_per_arch = True + + + def build_arch(self, arch): + build_env = arch.get_env() + build_env['prefix'] = '/' + build_env['CHOST'] = arch.triple + configure = sh.Command(join(self.build_dir, "configure")) + shprint(configure, + "--static", + _env=build_env) + shprint(sh.make, "clean") + shprint(sh.make) + +recipe = ZlibRecipe() + + diff --git a/recipes/pil/__init__.py b/recipes/pil/__init__.py new file mode 100644 index 0000000..922bf15 --- /dev/null +++ b/recipes/pil/__init__.py @@ -0,0 +1,122 @@ +from toolchain import Recipe, shprint +from os.path import join +import sh +import os +import fnmatch + + +class PillowRecipe(Recipe): + version = "2.7.0" + url = "https://github.com/python-pillow/Pillow/archive/{}.zip".format(version) + library = "libpil.a" + depends = ["libz", "freetype", "libjpeg", "python", "ios"] + include_per_arch = True + + def get_pil_env(self, arch): + build_env = arch.get_env() + build_env["IOSROOT"] = self.ctx.root_dir + build_env["IOSSDKROOT"] = arch.sysroot + build_env["LDSHARED"] = join(self.ctx.root_dir, "tools", "liblink") + build_env["ARM_LD"] = build_env["LD"] + build_env["ARCH"] = arch.arch + #build_env["C_INCLUDE_PATH"] = join(arch.sysroot, "usr", "include") + #build_env["LIBRARY_PATH"] = join(arch.sysroot, "usr", "lib") + build_env["CFLAGS"] = " ".join([ + "-I{}".format(join(self.ctx.dist_dir, "include", arch.arch, "freetype")) + + " -I{}".format(join(self.ctx.dist_dir, "include", arch.arch, "libjpeg")) + + " -I{}".format(join(self.ctx.dist_dir, "include", arch.arch, "libz")) + ]) + return build_env + + def _patch_setup(self): + # patch setup to remove some functionnalities + pyconfig = join(self.build_dir, "setup.py") + self.lines = [] + def _remove_line(pattern, pattern2 = '', replace=False): + _lines = [] + for line in self.lines: + if pattern in line: + if replace: + _lines.append(pattern2) + #print 'replacing:\n {}\nwith:\n {} '.format(line, pattern2) + continue + _lines.append(line) + self.lines = _lines + + with open(pyconfig) as fd: + self.lines = fd.readlines() + + self.lines.insert(201, ' elif True:\n') + self.lines.insert(202, ' pass\n') + + _remove_line( + " import _tkinter", + pattern2=" _tkinter = None\n", + replace=True) + _remove_line('_add_directory(library_dirs, "/usr/local/lib")') + _remove_line('_add_directory(include_dirs, "/usr/local/include")') + _remove_line( + 'prefix = sysconfig.get_config_var("prefix")', + pattern2=' prefix = False\n', + replace=True) + + _remove_line('import mp_compile') + _remove_line('_add_directory(library_dirs, "/usr/lib")') + _remove_line('_add_directory(include_dirs, "/usr/include")') + _remove_line('if sys.platform == "darwin":', + pattern2 = ' if False:\n', replace=True) + _remove_line('zlib = jpeg = tiff = freetype = tcl = tk = lcms = webp = webpmux = None', + pattern2 = ' zlib = jpeg = tiff = freetype = tcl = tk = lcms = webp = webpmux = None\n', + replace=True) + with open(pyconfig, "wb") as fd: + fd.writelines(self.lines) + + def _prebuild_pil(self, hostpython): + sh.curl("-O", "https://bootstrap.pypa.io/ez_setup.py") + shprint(hostpython, "./ez_setup.py") + + def build_arch(self, arch): + self._patch_setup() + build_env = self.get_pil_env(arch) + #build_dir = self.get_build_dir(arch.arch) + hostpython = sh.Command(self.ctx.hostpython) + #build_env["PYTHONHOME"] = hostpython + self._prebuild_pil(hostpython) + # first try to generate .h + try: + shprint(hostpython, "setup.py", "build_ext", "-g", + _env=build_env) + except: + pass + shprint(hostpython, "setup.py", "build_ext", "-g", + _env=build_env) + self.biglink() + + def install(self): + arch = list(self.filtered_archs)[0] + build_dir = self.get_build_dir(arch.arch) + os.chdir(build_dir) + hostpython = sh.Command(self.ctx.hostpython) + build_env = self.get_pil_env(arch) + shprint(hostpython, "setup.py", "install", "-O2", + "--prefix", join(build_dir, "iosbuild"), + _env=build_env) + dest_dir = join(self.ctx.dist_dir, "root", "python", "lib", "python2.7", + "site-packages", "pil") + if exists(dest_dir): + shutil.rmtree(dest_dir) + shutil.copytree( + join(build_dir, "iosbuild", "lib", + "python2.7", "site-packages", "pil"), + dest_dir) + + def biglink(self): + dirs = [] + for root, dirnames, filenames in os.walk(self.build_dir): + if fnmatch.filter(filenames, "*.so.libs"): + dirs.append(root) + cmd = sh.Command(join(self.ctx.root_dir, "tools", "biglink")) + shprint(cmd, join(self.build_dir, "libpil.a"), *dirs) + +recipe = PillowRecipe() +