pupy/client/build_library_zip.py

115 lines
4.1 KiB
Python

import sys
import os
PATCHES = os.path.join('..','library_patches')
sys.path.insert(0, PATCHES)
sys.path.insert(0, os.path.join('..','..','pupy'))
import additional_imports
import Crypto
import pp
import unicodedata # this is a builtin on linux and .pyd on windows that needs to be embedded
import site
all_dependencies=set(
[
x.split('.')[0] for x,m in [
(x,m) for x,m in sys.modules.iteritems()
] if not '(built-in)' in str(m) and x != '__main__'
] + [
'Crypto', 'yaml', 'rpyc', 'pyasn1', 'rsa',
'encodings.idna', 'stringprep',
]
)
all_dependencies.add('site')
all_dependencies = sorted(list(set(all_dependencies)))
all_dependencies.remove('pupy')
all_dependencies.remove('additional_imports')
print "ALLDEPS: ", all_dependencies
from distutils.core import setup
from glob import glob
import zipfile
import shutil
import compileall
compileall.compile_dir(PATCHES)
zf = zipfile.ZipFile(os.path.join('resources','library.zip'), mode='w', compression=zipfile.ZIP_DEFLATED)
if 'win' in sys.platform:
zf.write(r'C:\Python27\Lib\site-packages\pywin32_system32\pywintypes27.dll', 'pywintypes27.dll')
try:
content = set()
for dep in all_dependencies:
mdep = __import__(dep)
print "DEPENDENCY: ", dep, mdep
if hasattr(mdep, '__path__') and getattr(mdep, '__path__'):
print('adding package %s / %s'%(dep, mdep.__path__))
path, root = os.path.split(mdep.__path__[0])
for root, dirs, files in os.walk(mdep.__path__[0]):
for f in list(set([x.rsplit('.',1)[0] for x in files])):
found=False
for ext in ('.dll', '.so', '.pyo', '.pyd', '.pyc', '.py'):
if ( ext == '.py' or ext == '.pyc' ) and found:
continue
pypath = os.path.join(root,f+ext)
if os.path.exists(pypath):
if ext == '.py':
try:
compileall.compile_file(os.path.relpath(pypath))
except ValueError:
compileall.compile_file(pypath)
for extc in ( '.pyc', '.pyo' ):
if os.path.exists(os.path.join(root,f+extc)):
ext = extc
zipname = '/'.join([root[len(path)+1:], f.split('.', 1)[0] + ext])
zipname = zipname.replace('\\', '/')
found=True
# Remove various testcases if any
if any([ '/'+x+'/' in zipname for x in [
'tests', 'test', 'SelfTest', 'examples'
]
]):
continue
if zipname in content:
continue
for extp in ( '.pyo', '.pyc', '.py' ):
if os.path.exists(os.path.join(PATCHES, f+extp)):
root = PATCHES
ext = extp
print('adding file : {}'.format(zipname))
content.add(zipname)
zf.write(os.path.join(root,f+ext), zipname)
else:
if '<memimport>' in mdep.__file__:
continue
found_patch = None
for extp in ( '.pyo', '.pyc', '.py' ):
if os.path.exists(os.path.join(PATCHES, dep+extp)):
found_patch = (os.path.join(PATCHES, dep+extp), extp)
break
if found_patch:
print('adding [PATCH] %s -> %s'%(found_patch[0], dep+found_patch[1]))
zf.write(found_patch[0], dep+found_patch[1])
else:
_, ext = os.path.splitext(mdep.__file__)
print('adding %s -> %s'%(mdep.__file__, dep+ext))
zf.write(mdep.__file__, dep+ext)
finally:
zf.close()