From 7baf869fac3f671846c15b493047d8faa4cbff94 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Wed, 31 Oct 2018 11:34:51 +0100 Subject: [PATCH] add hostpython3 recipe --- recipes/hostpython3/__init__.py | 119 ++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 recipes/hostpython3/__init__.py diff --git a/recipes/hostpython3/__init__.py b/recipes/hostpython3/__init__.py new file mode 100644 index 0000000..3fa646c --- /dev/null +++ b/recipes/hostpython3/__init__.py @@ -0,0 +1,119 @@ +from toolchain import Recipe, shprint, ensure_dir +from os.path import join, exists +import os +import sh +import shutil + + +class Hostpython3Recipe(Recipe): + version = "3.7.1" + url = "https://www.python.org/ftp/python/{version}/Python-{version}.tgz" + depends = [] + optional_depends = ["openssl"] + archs = ["x86_64"] + + def init_with_ctx(self, ctx): + super(Hostpython3Recipe, self).init_with_ctx(ctx) + self.ctx.hostpython = join(self.ctx.dist_dir, "hostpython3", "bin", "python") + self.ctx.hostpgen = join(self.ctx.dist_dir, "hostpython3", "bin", "pgen") + print("Global: hostpython located at {}".format(self.ctx.hostpython)) + print("Global: hostpgen located at {}".format(self.ctx.hostpgen)) + + 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") + shutil.copy("Modules/Setup.dist", "Modules/Setup") + # if "openssl.build_all" in self.ctx.state: + # self.append_file("ModulesSetup.openssl", "Modules/Setup.local") + self.set_marker("patched") + + def postbuild_arch(self, arch): + return + """ + makefile_fn = join(self.build_dir, "Makefile") + with open(makefile_fn) as fd: + lines = fd.readlines() + for index, line in enumerate(lines): + if "-bundle" not in line: + continue + parts = line.split(" ") + parts.remove("-bundle") + if "-bundle_loader" in parts: + i = parts.index("-bundle_loader") + parts.pop(i) + parts.pop(i) + lines[index] = " ".join(parts) + with open(makefile_fn, "w") as fd: + fd.writelines(lines) + """ + + def get_build_env(self): + sdk_path = sh.xcrun("--sdk", "macosx", "--show-sdk-path").strip() + build_env = self.ctx.env.copy() + self.build_env_x86_84 = build_env + ccache = (build_env["CCACHE"] + ' ') if 'CCACHE' in build_env else '' + build_env["CC"] = ccache + "clang -Qunused-arguments -fcolor-diagnostics" + build_env["LDFLAGS"] = " ".join([ + "-lsqlite3", + "-lffi", + "-L{}".format(join(self.ctx.dist_dir, "hostlibffi", "usr", "local", "lib")) + ]) + build_env["CFLAGS"] = " ".join([ + "--sysroot={}".format(sdk_path), + "-arch x86_64", + "-mmacosx-version-min=10.12", + "-I{}".format(join(self.ctx.dist_dir, "hostlibffi", "usr", "local", "include")) + ]) + if "openssl.build_all" in self.ctx.state: + build_env["LDFLAGS"] += " -L{}".format(join(self.ctx.dist_dir, "lib")) + build_env["CFLAGS"] += " -I{}".format(join(self.ctx.dist_dir, "include", + "x86_64", "openssl")) + return build_env + + def build_x86_64(self): + build_env = self.get_build_env() + configure = sh.Command(join(self.build_dir, "configure")) + shprint(configure, + "--prefix={}".format(join(self.ctx.dist_dir, "hostpython3")), + # "--disable-toolbox-glue", + # "--without-gcc", + _env=build_env) + shprint(sh.make, "-C", self.build_dir, self.ctx.concurrent_make, + _env=build_env) + # shutil.move("python", "hostpython") + # shutil.move("Parser/pgen", "Parser/hostpgen") + + def install(self): + arch = list(self.filtered_archs)[0] + build_env = self.get_build_env() + build_dir = self.get_build_dir(arch.arch) + build_env["PATH"] = os.environ["PATH"] + # Compiling sometimes looks for Python-ast.py in the 'Python' i.s.o. + # the 'hostpython' folder. Create a symlink to fix. See issue #201 + # shprint(sh.ln, "-s", + # join(build_dir, "hostpython3"), + # join(build_dir, "Python")) + shprint(sh.make, self.ctx.concurrent_make, + "-C", build_dir, + "bininstall", "inclinstall", + _env=build_env) + pylib_dir = join(self.ctx.dist_dir, "hostpython3", "lib", "python3.7") + if exists(pylib_dir): + shutil.rmtree(pylib_dir) + shutil.copytree( + join(build_dir, "Lib"), + pylib_dir) + ensure_dir(join(pylib_dir, "config")) + shutil.copy( + join(build_dir, "Makefile"), + join(pylib_dir, "config", "Makefile")) + # shutil.copy( + # join(build_dir, "Parser", "pgen"), + # join(self.ctx.dist_dir, "hostpython3", "bin", "pgen")) + + +recipe = Hostpython3Recipe()