diff --git a/make-app-bundle.sh b/make-app-bundle.sh index c38844518f185ac905cef69af3017db05c2a684d..a9210c67076a51b0c88db27925e1a809f529bb30 100755 --- a/make-app-bundle.sh +++ b/make-app-bundle.sh @@ -5,15 +5,68 @@ test -e $1 && ( echo "$1 already exists, will not overwrite."; exit 1 ) echo "Making directory structure..." mkdir $1 || ( echo "Failed creating directory $1"; exit 1 ) -mkdir $1/Contents mkdir $1/Contents/MacOS -mkdir $1/Contents/Resources +mkdir $1/Contents $1/Contents/MacOS $1/Contents/Resources echo "Copying files into package..." cp aegisub/macosx/Info.plist $1/Contents cp aegisub/aegisub $1/Contents/MacOS cp aegisub/macosx/*.icns $1/Contents/Resources -echo "Here we should be finding and fixing up libraries" +echo "Now about to collect and fix up shared libraries..." + +python - $1/Contents/MacOS/aegisub <<FIXLIBS_END +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!" +FIXLIBS_END echo "Done creating $1!"