diff --git a/deployment/linux/create_bundle_alt.py b/deployment/linux/create_bundle_alt.py new file mode 100755 index 0000000000000000000000000000000000000000..6e5cf9bcf26311b4d7e1acd2ee61a18b9fc36a9f --- /dev/null +++ b/deployment/linux/create_bundle_alt.py @@ -0,0 +1,183 @@ +import os,os.path +import shutil +import sys +import tarfile +import subprocess +import re + +def get_libdir(): + machine=os.uname()[4] + if machine.find('x86_64') !=-1: + return 'lib64' + else: + return 'lib' + +def get_arch(): + machine=os.uname()[4] + if machine.find('x86_64') !=-1: + return '64bit' + else: + return '32bit' + +def clean(standalonedir): + if os.path.exists(standalonedir): + shutil.rmtree(standalonedir) + +def copy_stage(stagedir,standalonedir): + libdir=get_libdir() + copytree_ex(os.path.join(stagedir,'bin'),os.path.join(standalonedir,'bin')) + copytree_ex(os.path.join(stagedir,libdir),os.path.join(standalonedir,libdir)) + if os.path.exists(os.path.join(stagedir,'share')): + copytree_ex(os.path.join(stagedir,'share'),os.path.join(standalonedir,'share')) + +def collect_deps(binaries,exclude_list): + dependencies=set() + for binary in binaries: + collect_deps_recursive_(binary,dependencies,exclude_list) + return dependencies + +def collect_deps_recursive_(binary,collected,exclude_list): + ldd_stdout=subprocess.Popen(['ldd',binary],stdout=subprocess.PIPE).stdout + output=ldd_stdout.readlines() + new_dependencies=set() + for entry in output: + if entry.find("statically linked")!=-1: + continue + sp=entry.split('(0x') + if len(sp)>0: # only continue if line is dependency + sp2=sp[0].split('=>',1)[-1].split() + if sp2: #ensure libname exists (fix for virtual linux-gate) + text=sp2[0] + if not text.split('.')[0].split('/')[-1] in exclude_list and not text in collected: + collect_deps_recursive_(text,collected,exclude_list) + collected.add(text) + + +def copy_deps(binaries,standalonedir,exclude_list): + dependencies=set() + walk_list=os.walk(standalonedir) + binaries_list=[] + for dir_entry in walk_list: + for file_entry in dir_entry[2]: + if file_entry.endswith('.so') or file_entry in binaries: + filepath=os.path.join(dir_entry[0],file_entry) + binaries_list.append(filepath) + dependencies=collect_deps(binaries_list,exclude_list) + for dep in dependencies: + shutil.copy2(dep,os.path.join(standalonedir,get_libdir())) + +def copy_examples(stagedir): + #todo + pass +def copy_qt_plugins(): + #todo + pass + +def process_scripts(scripts,standalonedir): + for script in scripts: + fp=open(os.path.join(standalonedir,'bin',script),'r') + text=fp.read() + fp.close() + text=re.sub('#export PYTHONPATH','export PYTHONPATH',text) + fp=open(os.path.join(standalonedir,'bin',script),'w') + fp.write(text) + fp.close() + +def create_package(name,standalonedir): + try: + import pysvn + try: + client=pysvn.Client() + svn_info=client.info('.') + revstring='-rev'+str(svn_info['revision'.number]) + except pysvn.ClientError: + print 'No svn directory found. Addin no revision number.' + revstring='' + except ImportError: + print 'Pysvn not installed. Adding no revision number.' + revstring='' + tar_name=name+'-linux-'+get_arch()+revstring+'.tgz' + if os.path.exists(tar_name): + os.remove(tar_name) + tar = tarfile.open(tar_name, "w:gz") + tar.add(standalonedir,name+'-linux-'+get_arch()+revstring) + tar.close() + +def ignorer(dirpath,files): + ignores=[] + for f in files: + base=os.path.splitext(f)[0] + if f.endswith('.py'): + if base+'.pyc' in files or base+'.pyo' in files: + ignores.append(f) + elif f.endswith('.pyc'): + if base+'.pyo' in files: + ignores.append(f) + return ignores + +def copy_python_dirs(standalonedir): + dirs=sys.path[1:] + dirs.sort() #get toplevel dir to the beginning + toplevel=dirs[0] + shutil.copytree(toplevel,os.path.join(standalonedir,get_libdir(),'python'),ignore=ignorer) + for d in dirs[1:]: + if not d.startswith(toplevel) and os.path.isdir(d): + toplevel=d + copytree_ex(toplevel,os.path.join(standalonedir,get_libdir(),'python'),ignore=ignorer) + + +def copytree_ex(source,destination, symlinks=False,ignore=None): + if not os.path.exists(destination): + shutil.copytree(source,destination,symlinks,ignore) + elif os.path.isdir(destination): + files=os.listdir(source) + if ignore: + ignores=ignore(source,files) + else: + ignores=[] + for f in files: + srcname=os.path.join(source,f) + dstname=os.path.join(destination,f) + if os.path.isdir(os.path.join(source,f)): + copytree_ex(srcname,dstname,symlinks,ignore=ignorer) + elif f not in ignores: + if symlinks and os.path.islink(srcname): + linkto = os.readlink(srcname) + os.symlink(linkto, dstname) + else: + shutil.copy2(srcname, dstname) + else: + raise IOError("destination is not a directory") + + + +############ main script #################### + +stagedir='../../stage' +ost_stagedir='../../../openstructure/stage' +standalonedir=os.path.join(os.getcwd(),'standalone') +binaries=['gosty'] +exclude_list=['ld-linux','libexpat','libgcc_s','libglib','cmov','libice','libSM','libX','libg','libGL','libfontconfig','libfreetype','libdrm','libxcb','libICE'] +scripts=['dng','ost'] + +#compile_stage() + +clean(standalonedir) +print 'copying stage' +copy_stage(stagedir,standalonedir) +print 'copying ost stage' +copy_stage(ost_stagedir,standalonedir) +print 'copying python' +shutil.copy(sys.executable,os.path.join(stagedir,'bin')) +copy_python_dirs(standalonedir) +print 'copying dependencies' +binaries.append(sys.executable) +copy_deps(binaries,standalonedir,exclude_list) +print 'copying examples' +copy_examples(stagedir) +print 'copying plugins' +copy_qt_plugins() +print 'processing scripts' +process_scripts(scripts,standalonedir) +print 'creating package' +create_package('openstructure','standalone')