lbry-fdroid/p4a/pythonforandroid/bootstraps/pygame/build/tools/biglink-jb

112 lines
3.6 KiB
Text
Raw Normal View History

2017-08-13 03:24:00 +02:00
#!/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))