112 lines
3.6 KiB
Text
112 lines
3.6 KiB
Text
|
#!/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))
|