diff --git a/src/macosx/cleanup_rpath.py b/src/macosx/cleanup_rpath.py index 00360db..b7a8e74 100755 --- a/src/macosx/cleanup_rpath.py +++ b/src/macosx/cleanup_rpath.py @@ -5,15 +5,41 @@ import os import subprocess import re +MODE_COMPONENT = 1 +MODE_BINARY = 2 +MODE_LIBRARY = 3 + +MODES = {'c': MODE_COMPONENT, + 'b': MODE_BINARY, + 'l': MODE_LIBRARY} + +is_library = False +is_component = False +is_binary = False + def usage(): - print(u"Usage: %s component/path.dylib" % sys.argv[0]) + print(u"Usage: %s MODE component/path.dylib" % sys.argv[0]) + print(u" MODE is c: component or b: binary or l: library") -if len(sys.argv) < 2: +if len(sys.argv) < 3: usage() exit(0) component = sys.argv[1] +mode = MODES.get(sys.argv[2].lower()) + +if not mode: + usage() + exit(1) + +# mode switchers +if mode == MODE_COMPONENT: + is_component = True +elif mode == MODE_LIBRARY: + is_library = True +else: + is_binary = True if not os.path.exists(component): print(u"Unable to access component at: %s" % component) @@ -21,20 +47,18 @@ if not os.path.exists(component): # we'll also allow binaries to be fixed. # -# if not component.endswith('.dylib'): -# print(u"%s is not a dylib component" % component) -# exit(1) +if (is_library or is_component) and not component.endswith('.dylib'): + print(u"%s is not a dylib component" % component) + exit(1) print("Fixing %s..." % component) basename = os.path.basename(component) try: name, ext = basename.rsplit('.', 1) - is_library = True except ValueError: name = basename ext = '' - is_library = False libname = u'lib%s%s.0.dylib' % (name[0].upper(), name[1:]) # run otool to get a list of deps. @@ -64,10 +88,13 @@ for line in otool_out.split('\n'): match = re.match(r'lib([a-z\_\-\d]+)([\.?\d]*)\.dylib', _basename) if match: print("match: %s" % match.groups()[0]) - if is_library: + if is_component: newpath = u'@executable_path/../Frameworks/lib%s.dylib' % match.groups()[0] - else: + elif is_binary: newpath = u'@executable_path/../../Frameworks/lib%s.dylib' % match.groups()[0] + else: + newpath = u'@loader_path/lib%s.dylib' % match.groups()[0] + print('install_name_tool -change %s %s %s' % (path, newpath, component)) os.system('install_name_tool -change %s %s %s' % (path, newpath, component)) continue