Thread: [PATCH] Nested app support for complete-bundle.sh
Hi That symlinking-Framworks idea proved to be easier than I initially thought - here is a patch ;-) This patch also moves pkg to the end of the list of subdirs in the main Makefile.am. If pkg is listed before debugger, than complete-bundle.sh is run _before_ the debugger binary is copied into the bundle, which obviously causes all kinds of trouble ;-) greetings, Florian Pflug Index: Makefile.am =================================================================== --- Makefile.am (revision 6194) +++ Makefile.am (working copy) @@ -9,7 +9,7 @@ AUTOMAKE_OPTIONS = foreign -SUBDIRS = branding i18n pgadmin pkg xtra debugger +SUBDIRS = branding i18n pgadmin xtra debugger pkg EXTRA_DIST = \ $(top_srcdir)/BUGS \ Index: pkg/mac/complete-bundle.sh =================================================================== --- pkg/mac/complete-bundle.sh (revision 6194) +++ pkg/mac/complete-bundle.sh (working copy) @@ -8,47 +8,70 @@ test -d "$bundle/Contents/Frameworks" || mkdir -p "$bundle/Contents/Frameworks" || exit 1 -echo "Completing bundle: $bundle" +function CompleteSingleApp() { + local bundle=$1 tag=$(basename "$1") todo todo_old fw_relpath lib lib_bn nested_app na_relpath -cd "$bundle" + echo "Completing app: $bundle" + pushd "$bundle" > /dev/null -todo=$(file `find ./ -perm +0111 ! -type d` | grep "Mach-O executable" | awk -F ':| ' '{ORS=" "; print $1}' | uniq) + #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 "Found executables: $todo" + 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" -while test "$todo" != ""; do - todo_old=$todo ; - todo="" ; - for todo_obj in $todo_old; do - echo "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" - #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 "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 + #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 -done -echo "Bundle completed" + + #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"
Hi. From: "Florian G. Pflug" <fgp@phlo.org> > That symlinking-Framworks idea proved to be easier than I > initially thought - here is a patch ;-) > > This patch also moves pkg to the end of the list of subdirs > in the main Makefile.am. If pkg is listed before debugger, > than complete-bundle.sh is run _before_ the debugger binary > is copied into the bundle, which obviously causes all kinds > of trouble ;-) Ooops, It was my mistake. and Thank you for correction of MAC-OSX. It was applied now. Thanks!!:-) Reagrds, Hiroshi Saito
Florian G. Pflug wrote: > Hi > > That symlinking-Framworks idea proved to be easier than I > initially thought - here is a patch ;-) > > This patch also moves pkg to the end of the list of subdirs > in the main Makefile.am. If pkg is listed before debugger, > than complete-bundle.sh is run _before_ the debugger binary > is copied into the bundle, which obviously causes all kinds > of trouble ;-) Cool - I do notice that you haven't removed my if-appbundle-force-static-link hack - were you definitely testing a dynamic build? Either way, that hack should be removed again to properly enable this fix. Regards, Dave.
Dave Page wrote: > Florian G. Pflug wrote: >> Hi >> >> That symlinking-Framworks idea proved to be easier than I >> initially thought - here is a patch ;-) >> >> This patch also moves pkg to the end of the list of subdirs >> in the main Makefile.am. If pkg is listed before debugger, >> than complete-bundle.sh is run _before_ the debugger binary >> is copied into the bundle, which obviously causes all kinds >> of trouble ;-) > > Cool - I do notice that you haven't removed my > if-appbundle-force-static-link hack - were you definitely testing a > dynamic build? Either way, that hack should be removed again to properly > enable this fix. Yeah - I didn't include my changes to acinclude.m4 in the patch, because it also includes other changes that I want to test more before I submit them (The cleanup of SSL-Detection & usage of pg_config --libs that we discussed). I wanted to mention that in my e-mail, but, well, I forgot... Anyway, I did test the new complete-bundle.sh with a fully dynamic build, and it seems to work fine. I don't have a postgres instance with the debugger plugin running, so "fine" means "Complains about not being able to connect to localhost". ;-) greetings, Florian Pflug