Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
    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)
Пример #4
0
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)
Пример #5
0
    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)
Пример #6
0
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)
Пример #7
0
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.)))
Пример #8
0
 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)
Пример #9
0
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)
Пример #10
0
    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)
Пример #11
0
 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)
Пример #12
0
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, '/'))
Пример #13
0
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)