#!/usr/bin/env python from __future__ import print_function import os import sys import subprocess import re re_needso = re.compile(r'^.*\(NEEDED\)\s+Shared library: \[lib(.*)\.so\]\s*$') blacklist_libs = ( 'c', 'stdc++', 'dl', 'python2.7', 'sdl', 'sdl_image', 'sdl_ttf', 'z', 'm', 'GLESv2', 'jpeg', 'png', 'log', ) found_libs = [] sofiles = [ ] for directory in sys.argv[2:]: for fn in os.listdir(directory): fn = os.path.join(directory, fn) if not fn.endswith(".libs"): continue dirfn = fn[:-1] + 'dirs' if not os.path.exists(dirfn): continue with open(fn) as f: needed_libs = [lib for lib in {ln.strip() for ln in f} if lib not in blacklist_libs and lib not in found_libs] while needed_libs: print('need libs:\n\t' + '\n\t'.join(needed_libs)) start_needed_libs = needed_libs[:] found_sofiles = [] with open(dirfn) as f: for libdir in f: if not needed_libs: break libdir = libdir.strip() print('scanning %s' % libdir) for lib in needed_libs[:]: if lib in found_libs: continue if lib.endswith('.a'): needed_libs.remove(lib) found_libs.append(lib) continue lib_a = 'lib' + lib + '.a' libpath_a = os.path.join(libdir, lib_a) lib_so = 'lib' + lib + '.so' libpath_so = os.path.join(libdir, lib_so) plain_so = lib + '.so' plainpath_so = os.path.join(libdir, plain_so) sopath = None if os.path.exists(libpath_so): sopath = libpath_so elif os.path.exists(plainpath_so): sopath = plainpath_so if sopath: print('found %s in %s' % (lib, libdir)) found_sofiles.append(sopath) needed_libs.remove(lib) found_libs.append(lib) continue if os.path.exists(libpath_a): print('found %s (static) in %s' % (lib, libdir)) needed_libs.remove(lib) found_libs.append(lib) continue for sofile in found_sofiles: print('scanning dependencies for %s' % sofile) out = subprocess.check_output([os.environ['READELF'], '-d', sofile]) for line in out.splitlines(): needso = re_needso.match(line) if needso: lib = needso.group(1) if lib not in needed_libs and lib not in found_libs and lib not in blacklist_libs: needed_libs.append(needso.group(1)) sofiles += found_sofiles if needed_libs == start_needed_libs: raise RuntimeError('Failed to locate needed libraries!\n\t' + '\n\t'.join(needed_libs)) output = sys.argv[1] with open(output, 'w') as f: f.write('\n'.join(sofiles))