#!/usr/bin/env python

import re
import sys
import os
import shutil

is_bad_lib = re.compile(r'(/usr/local|/opt)').match
is_sys_lib = re.compile(r'(/usr|/System)').match
otool_libname_extract = re.compile(r'\s+(/.*?)[\(\s:]').search

def otool(cmdline):
	pipe = os.popen("otool " + cmdline, 'r')
	output = pipe.readlines()
	pipe.close()
	return output

def collectlibs(lib, masterlist, targetdir):
	liblist = otool("-L " + lib)
	locallist = []
	for l in liblist:
		lr = otool_libname_extract(l)
		if not lr: continue
		l = lr.group(1)
		if is_bad_lib(l):
			sys.exit("Linking with library in blacklisted location: " + l)
		if not is_sys_lib(l) and not l in masterlist:
			locallist.append(l)
			print " ...found ", l,
			shutil.copy(l, targetdir)
			print " ...copied to target"
	masterlist.extend(locallist)
	for l in locallist:
		collectlibs(l, masterlist, targetdir)

binname = sys.argv[1]
targetdir = os.path.dirname(binname)
print "Searching for libraries in ", binname, "..."
libs = [binname]
collectlibs(sys.argv[1], libs, targetdir)

print " ...done. Will now fix up library install names..."
in_tool_cmdline = "install_name_tool "
for lib in libs:
	libbase = os.path.basename(lib)
	in_tool_cmdline = in_tool_cmdline + ("-change %s @executable_path/%s " % (lib, libbase))
for lib in libs:
	libbase = os.path.basename(lib)
	os.system("%s -id @executable_path/%s '%s/%s'" % (in_tool_cmdline, libbase, targetdir, libbase))
	print libbase,
	sys.stdout.flush()
print
print "All done!"