def py_compile(basedir): run(PYTHON, '-OO', '-m', 'compileall', '-d', '', '-f', '-q', basedir, library_path=True) for f in walk(basedir): ext = f.rpartition('.')[-1] if ext in ('py', 'pyc'): os.remove(f)
def py_compile(basedir): run(PYTHON, '-OO', '-c', 'import compileall; compileall.compile_dir("%s", force=True, quiet=True)' % basedir, library_path=True) for f in walk(basedir): ext = f.rpartition('.')[-1] if ext in ('py', 'pyc'): os.remove(f)
def add_stdlib(self): print('\nAdding python stdlib') src = PREFIX + '/python/Python.framework/Versions/Current/lib/python' src += py_ver dest = join(self.resources_dir, 'Python', 'lib', 'python') dest += py_ver os.makedirs(dest) for x in os.listdir(src): if x in ('site-packages', 'config', 'test', 'lib2to3', 'lib-tk', 'lib-old', 'idlelib', 'plat-mac', 'plat-darwin', 'site.py'): continue x = join(src, x) if os.path.isdir(x): self.add_package_dir(x, dest) elif os.path.splitext(x)[1] in ('.so', '.py'): shutil.copy2(x, dest) dest2 = join(dest, basename(x)) if dest2.endswith('.so'): self.fix_dependencies_in_lib(dest2) target = join(self.resources_dir, 'Python', 'lib') self.remove_bytecode(target) for path in walk(target): if path.endswith('.so'): self.fix_dependencies_in_lib(path)
def sign_executables(env): files_to_sign = [] for path in walk(env.base): if path.lower().endswith('.exe'): files_to_sign.append(path) printf('Signing {} exe files'.format(len(files_to_sign))) sign_files(env, files_to_sign)
def embed_manifests(env): printf('Embedding remaining manifests...') for manifest in walk(env.base): dll, ext = os.path.splitext(manifest) if ext != '.manifest': continue res = 2 if os.path.splitext(dll)[1] == '.exe': res = 1 if os.path.exists(dll) and open(manifest, 'rb').read().strip(): run('mt.exe', '-manifest', manifest, '-outputresource:%s;%d' % (dll, res)) os.remove(manifest)
def strip_binaries(env): files = {j(env.bin_dir, x) for x in os.listdir(env.bin_dir)} | { x for x in { j(os.path.dirname(env.bin_dir), x) for x in os.listdir(env.bin_dir)} if os.path.exists(x)} for x in walk(env.lib_dir): x = os.path.realpath(x) if x not in files and is_elf(x): files.add(x) print('Stripping %d files...' % len(files)) before = sum(os.path.getsize(x) for x in files) strip_files(files) after = sum(os.path.getsize(x) for x in files) print('Stripped %.1f MB' % ((before - after) / (1024 * 1024.)))
def add_site_packages(self): print('\nAdding site-packages') os.makedirs(self.site_packages) sys_path = cPickle.loads( subprocess.check_output([ PYTHON, '-c', 'import sys, cPickle; cPickle.dump(sys.path, sys.stdout)' ])) paths = reversed( map(abspath, [ x for x in sys_path if x.startswith('/') and not x.startswith('/Library/') ])) upaths = [] for x in paths: if x not in upaths and (x.endswith('.egg') or x.endswith('/site-packages')): upaths.append(x) upaths.append(join(CALIBRE_DIR, 'src')) for x in upaths: print('\t', x) tdir = None try: if not os.path.isdir(x): zf = zipfile.ZipFile(x) tdir = tempfile.mkdtemp() zf.extractall(tdir) x = tdir self.add_modules_from_dir(x) self.add_packages_from_dir(x) finally: if tdir is not None: shutil.rmtree(tdir) try: shutil.rmtree( os.path.join(self.site_packages, 'calibre', 'plugins')) except OSError as err: if err.errno != errno.ENOENT: raise sp = join(self.resources_dir, 'Python', 'site-packages') for x in os.listdir(join(sp, 'PyQt5')): if x.endswith('.so') and x.rpartition('.')[0] not in PYQT_MODULES: os.remove(join(sp, 'PyQt5', x)) os.remove(join(sp, 'PyQt5', 'uic/port_v3/proxy_base.py')) self.remove_bytecode(sp) for path in walk(sp): if path.endswith('.so'): self.fix_dependencies_in_lib(path)
def add_package_dir(self, x, dest=None): def ignore(root, files): ans = [] for y in files: ext = os.path.splitext(y)[1] if ext not in ('', '.py', '.so') or \ (not ext and not os.path.isdir(join(root, y))): ans.append(y) return ans if dest is None: 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)
def add_misc_libraries(self): for x in ( 'sqlite3.0', 'z.1', 'glfw.3', 'crypto.1.0.0', 'ssl.1.0.0', ): print('\nAdding', x) x = 'lib%s.dylib' % x src = join(PREFIX, 'lib', x) shutil.copy2(src, self.frameworks_dir) 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)
def freeze(env, ext_dir): shutil.copy2(j(env.src_root, 'LICENSE'), env.base) printf('Adding resources...') tgt = j(env.app_base, 'resources') if os.path.exists(tgt): shutil.rmtree(tgt) shutil.copytree(j(env.src_root, 'resources'), tgt) printf('\tAdding misc binary deps') def copybin(x): shutil.copy2(x, env.dll_dir) try: shutil.copy2(x + '.manifest', env.dll_dir) except EnvironmentError as err: if err.errno != errno.ENOENT: raise bindir = os.path.join(PREFIX, 'bin') for x in ('pdftohtml', 'pdfinfo', 'pdftoppm', 'jpegtran-calibre', 'cjpeg-calibre', 'optipng-calibre', 'JXRDecApp-calibre'): copybin(os.path.join(bindir, x + '.exe')) for f in glob.glob(os.path.join(bindir, '*.dll')): if re.search(r'(easylzma|icutest)', f.lower()) is None: copybin(f) copybin(os.path.join(env.python_base, 'python%s.dll' % env.py_ver.replace('.', ''))) for x in glob.glob(os.path.join(env.python_base, 'DLLs', '*')): # python pyd modules copybin(x) for f in walk(os.path.join(env.python_base, 'Lib')): if f.lower().endswith('.dll') and 'scintilla' not in f.lower(): copybin(f) add_plugins(env, ext_dir) printf('Adding Qt...') for x in QT_DLLS: copybin(os.path.join(QT_DIR, 'bin', x + '.dll')) plugdir = j(QT_DIR, 'plugins') tdir = j(env.app_base, 'qt_plugins') for d in QT_PLUGINS: imfd = os.path.join(plugdir, d) tg = os.path.join(tdir, d) if os.path.exists(tg): shutil.rmtree(tg) shutil.copytree(imfd, tg) for f in walk(tdir): if not f.lower().endswith('.dll'): os.remove(f) printf('Adding python...') def ignore_lib(root, items): ans = [] for x in items: ext = os.path.splitext(x)[1].lower() if ext in ('.dll', '.chm', '.htm', '.txt'): ans.append(x) return ans shutil.copytree(r'%s\Lib' % env.python_base, env.lib_dir, ignore=ignore_lib) install_site_py(env) # Fix win32com sp_dir = j(env.lib_dir, 'site-packages') comext = j(sp_dir, 'win32comext') shutil.copytree(j(comext, 'shell'), j(sp_dir, 'win32com', 'shell')) shutil.rmtree(comext) for pat in ('PyQt5\\uic\\port_v3', ): x = glob.glob(j(env.lib_dir, 'site-packages', pat))[0] shutil.rmtree(x) pyqt = j(env.lib_dir, 'site-packages', 'PyQt5') for x in {x for x in os.listdir(pyqt) if x.endswith('.pyd')}: if x.partition('.')[0] not in PYQT_MODULES: os.remove(j(pyqt, x)) printf('Adding calibre sources...') for x in glob.glob(j(CALIBRE_DIR, 'src', '*')): if os.path.isdir(x): if os.path.exists(os.path.join(x, '__init__.py')): shutil.copytree(x, j(sp_dir, b(x))) else: shutil.copy(x, j(sp_dir, b(x))) for x in (r'calibre\manual', r'calibre\plugins', 'pythonwin'): deld = j(sp_dir, x) if os.path.exists(deld): shutil.rmtree(deld) for x in os.walk(j(sp_dir, 'calibre')): for f in x[-1]: if not f.endswith('.py'): os.remove(j(x[0], f)) extract_pyd_modules(env, sp_dir) printf('Byte-compiling all python modules...') for x in ('test', 'lib2to3', 'distutils'): x = j(env.lib_dir, x) if os.path.exists(x): shutil.rmtree(x) py_compile(env.lib_dir.replace(os.sep, '/'))
def py_compile(basedir): run(PYTHON, '-OO', '-m', 'compileall', '-f', '-q', '-b', basedir, library_path=True) for f in walk(basedir): if f.endswith('.py'): os.remove(f)