diff --git a/bypy/linux/__main__.py b/bypy/linux/__main__.py index 0d1842051..06176a613 100644 --- a/bypy/linux/__main__.py +++ b/bypy/linux/__main__.py @@ -110,7 +110,8 @@ def copy_python(env): pdir = os.path.join(env.lib_dir, 'kitty-extensions') os.makedirs(pdir, exist_ok=True) kitty_dir = os.path.join(env.base, 'lib', 'kitty') - for x in ('kitty', 'kittens'): + bases = ('kitty', 'kittens') + for x in bases: dest = os.path.join(env.py_dir, x) os.rename(os.path.join(kitty_dir, x), dest) if x == 'kitty': @@ -120,9 +121,10 @@ def copy_python(env): print('Extracting extension modules from', env.py_dir, 'to', pdir) ext_map = extract_extension_modules(env.py_dir, pdir) shutil.copy(os.path.join(os.path.dirname(self_dir), 'site.py'), os.path.join(env.py_dir, 'site.py')) - for q in walk(os.path.join(env.py_dir, 'kitty')): - if os.path.splitext(q)[1] not in ('.py', '.glsl'): - os.unlink(q) + for x in bases: + for q in walk(os.path.join(env.py_dir, x)): + if os.path.splitext(q)[1] not in ('.py', '.glsl'): + os.unlink(q) py_compile(env.py_dir) freeze_python(env.py_dir, pdir, env.obj_dir, ext_map, develop_mode_env_var='KITTY_DEVELOP_FROM') diff --git a/bypy/macos/__main__.py b/bypy/macos/__main__.py index df3915ed6..856e3a86e 100644 --- a/bypy/macos/__main__.py +++ b/bypy/macos/__main__.py @@ -13,16 +13,23 @@ import tempfile import zipfile from bypy.constants import PREFIX, PYTHON, SW, python_major_minor_version +from bypy.freeze import ( + extract_extension_modules, freeze_python, path_to_freeze_dir +) from bypy.macos_sign import ( codesign, create_entitlements_file, make_certificate_useable, notarize_app, verify_signature ) -from bypy.utils import current_dir, py_compile, run_shell, timeit, walk +from bypy.utils import ( + current_dir, mkdtemp, py_compile, run_shell, timeit, walk +) iv = globals()['init_env'] kitty_constants = iv['kitty_constants'] +self_dir = os.path.dirname(os.path.abspath(__file__)) join = os.path.join basename = os.path.basename +dirname = os.path.dirname abspath = os.path.abspath APPNAME = kitty_constants['appname'] VERSION = kitty_constants['version'] @@ -147,6 +154,7 @@ class Freeze(object): self.py_ver = py_ver self.python_stdlib = join(self.resources_dir, 'Python', 'lib', 'python' + self.py_ver) self.site_packages = self.python_stdlib # hack to avoid needing to add site-packages to path + self.obj_dir = mkdtemp('launchers-') self.run() @@ -160,10 +168,10 @@ class Freeze(object): self.add_site_packages() self.add_stdlib() self.add_misc_libraries() - self.compile_py_modules() - self.fix_dependencies_in_kitty() + self.freeze_python() if not self.dont_strip: self.strip_files() + self.check_build() # self.run_shell() ret = self.makedmg(self.build_dir, APPNAME + '-' + VERSION) @@ -175,6 +183,10 @@ class Freeze(object): print('\nStripping files...') strip_files(self.to_strip) + @flush + def check_build(self): + iv['check_build'](os.path.join(self.contents_dir, 'MacOS', 'kitty')) + @flush def set_id(self, path_to_lib, new_id): old_mode = flipwritable(path_to_lib) @@ -239,7 +251,6 @@ class Freeze(object): self.set_id( join(currd, 'Python'), self.FID + '/Python.framework/Versions/%s/Python' % basename(curr)) - self.fix_dependencies_in_lib(join(self.contents_dir, 'MacOS', 'kitty')) # The following is needed for codesign with current_dir(x): os.symlink(basename(curr), 'Versions/Current') @@ -265,6 +276,7 @@ class Freeze(object): 'lcms2.2', 'crypto.1.1', 'ssl.1.1', + 'ffi.7', ): print('\nAdding', x) x = 'lib%s.dylib' % x @@ -273,11 +285,6 @@ class Freeze(object): dest = join(self.frameworks_dir, x) self.set_id(dest, self.FID + '/' + x) self.fix_dependencies_in_lib(dest) - base = join(self.frameworks_dir, 'kitty') - for lib in walk(base): - if lib.endswith('.so'): - self.set_id(lib, self.FID + '/' + os.path.relpath(lib, self.frameworks_dir)) - self.fix_dependencies_in_lib(lib) @flush def add_package_dir(self, x, dest=None): @@ -295,21 +302,10 @@ class Freeze(object): dest = self.site_packages dest = join(dest, basename(x)) shutil.copytree(x, dest, symlinks=True, ignore=ignore) - self.postprocess_package(x, dest) for f in walk(dest): if f.endswith('.so'): self.fix_dependencies_in_lib(f) - @flush - def fix_dependencies_in_kitty(self): - for f in walk(join(self.resources_dir, 'kitty')): - if f.endswith('.so'): - self.fix_dependencies_in_lib(f) - - @flush - def postprocess_package(self, src_path, dest_path): - pass - @flush def add_stdlib(self): print('\nAdding python stdlib') @@ -331,6 +327,37 @@ class Freeze(object): if dest2.endswith('.so'): self.fix_dependencies_in_lib(dest2) + @flush + def freeze_python(self): + print('\nFreezing python') + kitty_dir = join(self.resources_dir, 'kitty') + bases = ('kitty', 'kittens') + for x in bases: + dest = os.path.join(self.python_stdlib, x) + os.rename(os.path.join(kitty_dir, x), dest) + if x == 'kitty': + shutil.rmtree(os.path.join(dest, 'launcher')) + os.rename(os.path.join(kitty_dir, '__main__.py'), os.path.join(self.python_stdlib, 'kitty_main.py')) + shutil.rmtree(os.path.join(kitty_dir, '__pycache__')) + pdir = os.path.join(dirname(self.python_stdlib), 'kitty-extensions') + os.mkdir(pdir) + print('Extracting extension modules from', self.python_stdlib, 'to', pdir) + ext_map = extract_extension_modules(self.python_stdlib, pdir) + shutil.copy(os.path.join(os.path.dirname(self_dir), 'site.py'), os.path.join(self.python_stdlib, 'site.py')) + for x in bases: + for q in walk(os.path.join(self.python_stdlib, x)): + if os.path.splitext(q)[1] not in ('.py', '.glsl'): + os.unlink(q) + self.compile_py_modules() + freeze_python(self.python_stdlib, pdir, self.obj_dir, ext_map, develop_mode_env_var='KITTY_DEVELOP_FROM') + iv['build_frozen_launcher']([path_to_freeze_dir(), self.obj_dir]) + os.rename(join(dirname(self.contents_dir), 'bin', 'kitty'), join(self.contents_dir, 'MacOS', 'kitty')) + shutil.rmtree(join(dirname(self.contents_dir), 'bin')) + self.fix_dependencies_in_lib(join(self.contents_dir, 'MacOS', 'kitty')) + for f in walk(pdir): + if f.endswith('.so') or f.endswith('.dylib'): + self.fix_dependencies_in_lib(f) + @flush def add_site_packages(self): print('\nAdding site-packages') @@ -389,11 +416,8 @@ class Freeze(object): @flush def compile_py_modules(self): - print('\nCompiling Python modules') self.remove_bytecode(join(self.resources_dir, 'Python')) py_compile(join(self.resources_dir, 'Python')) - self.remove_bytecode(join(self.resources_dir, 'kitty')) - py_compile(join(self.resources_dir, 'kitty')) @flush def makedmg(self, d, volname, internet_enable=True, format='ULFO'): diff --git a/bypy/sources.json b/bypy/sources.json index 0577c70b6..69d43a31f 100644 --- a/bypy/sources.json +++ b/bypy/sources.json @@ -119,6 +119,7 @@ { "name": "xcrypt", + "os": "linux", "unix": { "filename": "xcrypt-4.4.17.tar.gz", "hash": "sha256:7665168d0409574a03f7b484682e68334764c29c21ca5df438955a381384ca07",