From a18a16e9d30a0f3b429c56a7772e949818339dd5 Mon Sep 17 00:00:00 2001 From: rgaudin Date: Thu, 8 May 2014 16:49:07 +0000 Subject: [PATCH] updated to handle libstdc++ and libgcc_s --- src/macosx/cleanup_rpath.py | 98 ++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/macosx/cleanup_rpath.py b/src/macosx/cleanup_rpath.py index 477a810..1315f36 100755 --- a/src/macosx/cleanup_rpath.py +++ b/src/macosx/cleanup_rpath.py @@ -10,8 +10,8 @@ MODE_BINARY = 2 MODE_LIBRARY = 3 MODES = {'c': MODE_COMPONENT, - 'b': MODE_BINARY, - 'l': MODE_LIBRARY} + 'b': MODE_BINARY, + 'l': MODE_LIBRARY} is_library = False is_component = False @@ -19,88 +19,88 @@ is_binary = False def usage(): - print(u"Usage: %s MODE component/path.dylib" % sys.argv[0]) - print(u" MODE is c: component or b: binary or l: library") + 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) < 3: - usage() - exit(0) + usage() + exit(0) component = sys.argv[-1] mode = MODES.get(sys.argv[-2].lower()) if not mode: - usage() - exit(1) + usage() + exit(1) # mode switchers if mode == MODE_COMPONENT: - is_component = True + is_component = True elif mode == MODE_LIBRARY: - is_library = True + is_library = True else: - is_binary = True + is_binary = True if not os.path.exists(component): - print(u"Unable to access component at: %s" % component) - exit(1) + print(u"Unable to access component at: %s" % component) + exit(1) # we'll also allow binaries to be fixed. # if (is_library or is_component) and not component.endswith('.dylib'): - print(u"%s is not a dylib component" % component) - exit(1) + 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) + name, ext = basename.rsplit('.', 1) except ValueError: - name = basename - ext = '' + name = basename + ext = '' libname = u'lib%s%s.0.dylib' % (name[0].upper(), name[1:]) # change ID if component to match new name/path if is_component: - os.system('install_name_tool -id %s %s' % (basename, component)) + os.system('install_name_tool -id %s %s' % (basename, component)) # run otool to get a list of deps. otool = subprocess.Popen(['otool', '-L', component], stdout=subprocess.PIPE) otool_out, otool_err = otool.communicate() for line in otool_out.split('\n'): - if ('executable_path' in line - or 'libSystem' in line - or 'libstdc++' in line - or 'libgcc' in line - or ':' in line - or not len(line) - or 'aria2c' in basename): - continue - path, junk = line.strip().split(' (', 1) - # erroneous_links.append(path) - - _basename = os.path.basename(path).strip() - - if _basename == basename: - continue - - # is it a library link? - match = re.match(r'lib([a-z\_\-\d]+)([\.?\d]*)\.dylib', _basename) - if match: - print("match: %s" % match.groups()[0]) - if is_component: + if ('executable_path' in line + or 'libSystem' in line + or ':' in line + or not len(line) + or 'aria2c' in basename): + continue + path, junk = line.strip().split(' (', 1) + # erroneous_links.append(path) + + _basename = os.path.basename(path).strip() + + if _basename == basename: + continue + + # is it a library link? + match = re.match(r'lib([a-z\_\-\d\+]+)([\.?\d]*)\.dylib', _basename) + if match: + print("match: %s" % match.groups()[0]) + if 'libstdc++' in line or 'libgcc' in line: + newpath = u'/usr/lib/lib%s%s.dylib' % (match.groups()[0], match.groups()[1]) + elif is_component: # newpath = u'@executable_path/../Frameworks/lib%s.dylib' % match.groups()[0] - newpath = u'@executable_path/lib%s.dylib' % match.groups()[0] - elif is_binary: + newpath = u'@executable_path/lib%s.dylib' % match.groups()[0] + elif is_binary: # newpath = u'@executable_path/../../Frameworks/lib%s.dylib' % match.groups()[0] - newpath = u'@executable_path/../lib%s.dylib' % match.groups()[0] - else: - newpath = u'@loader_path/lib%s.dylib' % match.groups()[0] + newpath = u'@executable_path/../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 + print('install_name_tool -change %s %s %s' % (path, newpath, component)) + os.system('install_name_tool -change %s %s %s' % (path, newpath, component)) + continue - print('\tUnmatched: %s' % path) \ No newline at end of file + print('\tUnmatched: %s' % path) \ No newline at end of file