File: complete-bundle.sh

package info (click to toggle)
pgadmin3 1.20.0~beta2-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 73,704 kB
  • ctags: 18,591
  • sloc: cpp: 193,786; ansic: 18,736; sh: 5,154; pascal: 1,120; yacc: 927; makefile: 516; lex: 421; xml: 126; perl: 40
file content (77 lines) | stat: -rwxr-xr-x 2,497 bytes parent folder | download | duplicates (4)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/sh
bundle="$1"

if ! test -d "$bundle" ; then
	echo "$bundle is no bundle!" >&2
	exit 1
fi

test -d "$bundle/Contents/Frameworks" || mkdir -p "$bundle/Contents/Frameworks" || exit 1

function CompleteSingleApp() {
	local bundle=$1 tag=$(basename "$1") todo todo_old fw_relpath lib lib_bn nested_app na_relpath

	echo "Completing app: $bundle"
	pushd "$bundle" > /dev/null

	#We skip nested apps here - those are treated specially
	todo=$(file `find ./ -perm +0111 ! -type d ! -path "*.app/*" ! -name "*.app"` | grep "Mach-O executable" | awk -F ':| ' '{ORS=" "; print $1}' | uniq)

	echo "App: $tag: Found executables: $todo"
	while test "$todo" != ""; do
		todo_old=$todo ;
		todo="" ;
		for todo_obj in $todo_old; do
			echo "App: $tag: Post-processing: $todo_obj"

			#Figure out the relative path from todo_obj to Contents/Frameworks
			fw_relpath=$(echo "$todo_obj" |\
				sed -n 's|^\(\.//*\)\(\([^/][^/]*/\)*\)[^/][^/]*$|\2|gp' | \
				sed -n 's|[^/][^/]*/|../|gp' \
			)"Contents/Frameworks"

			#Find all libraries $todo_obj depends on, but skip system libraries
			for lib in $(
				otool -L $todo_obj | \
				sed -n 's|^.*[[:space:]]\([^[:space:]]*\.dylib\).*$|\1|p' | \
				egrep -v '^(/usr/lib)|(/System)|@executable_path@' \
			); do
				lib_bn="$(basename "$lib")" ;
				if ! test -f "Contents/Frameworks/$lib_bn"; then
					echo "App: $tag: Adding library: $lib_bn (because of: $todo_obj)"
					cp "$lib" "Contents/Frameworks/$lib_bn"
					chmod 755 "Contents/Frameworks/$lib_bn"
					install_name_tool \
						-id "$lib_bn" \
						"Contents/Frameworks/$lib_bn" || exit 1
					todo="$todo ./Contents/Frameworks/$lib_bn"
				fi
				install_name_tool -change \
					"$lib" \
					"@executable_path/$fw_relpath/$lib_bn" \
					"$todo_obj" || exit 1
			done
		done
	done

	#We handle only one level here, because this is recursive anyway
	for nested_app in $(find ./ -type d -name "*.app" ! -path "*.app/*"); do
		echo "App: $tag: Post-processing nested app: $nested_app"
		
		if ! test -d "$nested_app/Contents/Frameworks"; then
			echo "App: "$(basename "$nested_app")": Symlinking Frameworks-folder to parent $bundle"
			na_relpath=$(echo "$nested_app" |\
				sed -n 's|^\(\.//*\)\(\([^/][^/]*/\)*\)[^/][^/]*$|\2|gp' | \
				sed -n 's|[^/][^/]*/|../|gp' \
			)"Contents/Frameworks"
			ln -s "../../$na_relpath" "$nested_app/Contents/Frameworks"
		fi
		
		CompleteSingleApp "$nested_app"
	done

	echo "App completed: $bundle"
	popd > /dev/null
}

CompleteSingleApp "$bundle"