find-dylib-name.py 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env python3
  2. import subprocess
  3. import os
  4. import re
  5. import sys
  6. import pathlib
  7. def verbose(*args):
  8. print(*args, file=sys.stderr)
  9. def main(argv):
  10. libname = argv[1]
  11. cc = argv[2:]
  12. verbose('Looking for', libname)
  13. verbose('cc:', cc)
  14. o = subprocess.run(cc + ['-print-search-dirs'], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  15. libdirs = re.search(r'[\^\n]libraries: =(.*)', o.stdout.decode('utf-8')).group(1).strip().split(os.pathsep)
  16. verbose('Search path:\n\t' + '\n\t'.join(libdirs))
  17. for libdir in libdirs:
  18. p = pathlib.Path(libdir) / 'lib{}.so'.format(libname)
  19. if p.is_file():
  20. verbose('Found', p)
  21. p = p.resolve()
  22. verbose('Real path', p)
  23. verbose('Name', p.name)
  24. dlname = re.search(r'(.*?\.so(?:\.[^.]+)?)', p.name).group(0)
  25. verbose('Reduced name', dlname)
  26. assert p.with_name(dlname).resolve() == p
  27. print(dlname)
  28. quit(0)
  29. quit(1)
  30. if __name__ == '__main__':
  31. main(sys.argv)