File: addDependentLibsToBundle.py

package info (click to toggle)
glob2 0.9.4.4-2.3
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 34,452 kB
  • ctags: 10,285
  • sloc: cpp: 89,684; python: 868; ansic: 259; makefile: 62; sh: 49
file content (61 lines) | stat: -rwxr-xr-x 2,066 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python

import os, glob
import sys

def run(command) :
	print "\033[32m:: ", command, "\033[0m"
	return os.system(command)
def norun(command) :
	print "\033[31mXX ", command, "\033[0m"


def needsChange(binary, blacklist) :
	#with python2.5 we could just return all([not binary.startswith(blacksheep) for blacksheep in blacklist])
	for blacksheep in blacklist :
		if binary.startswith( blacksheep ) : 
#			print "found blackseep", binary
			return False
	return True

def libDependencies(binary, visited, blacklist) :
#	print "examining", binary
	for line in os.popen("otool -L "+binary).readlines()[1:] :
		entry = line.split()[0]
		if entry in visited : continue
		if not needsChange( entry, blacklist ) : continue
		visited.append( entry )
		libDependencies( entry, visited, blacklist )

def addDependentLibsToBundle( bundle ) :
	binaries = glob.glob(bundle+"/Contents/MacOS/*") 
	binaries += glob.glob(bundle+"/Contents/plugins/*") 
	doNotChange = [
		"/System/",
		"/usr/lib/",
		"@executable_path/",
	]
	libsPath = []
	for binary in binaries :
		libDependencies(binary, libsPath, doNotChange)
#	print libsPath

	libs = [ (os.path.basename(path), path) for path in libsPath ] 
	run("mkdir -p %(bundle)s/Contents/Frameworks/" % locals() )

	vars = {}
	# copy all dependent libs to the bundle and change its id (relative path to the bundle)
	for lib, path in libs :
		run("cp %(path)s %(bundle)s/Contents/Frameworks/%(lib)s" % locals() )
		run("install_name_tool -id @executable_path/../Frameworks/%(lib)s %(bundle)s/Contents/Frameworks/%(lib)s" % locals() )
	# fix binary dependencies
	for current in binaries :
		for lib, libpath in libs :
			run("install_name_tool -change %(libpath)s @executable_path/../Frameworks/%(lib)s %(current)s" % locals() )
	# fix libs dependencies
	for current, _ in libs :
		for lib, libpath in libs :
			run("install_name_tool -change %(libpath)s @executable_path/../Frameworks/%(lib)s %(bundle)s/Contents/Frameworks/%(current)s" % locals() )

if __name__ == "__main__":
	addDependentLibsToBundle( "Annotator.app" )