fixup_bundle.sh 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/bin/bash
  2. if [ "$#" != 2 ]; then
  3. echo "usage: $0 /path/to/install/root relative/lib/destination"
  4. exit 1
  5. fi
  6. cd "$1"
  7. function buildlist() {
  8. otool -L "$@" |
  9. grep -E '^\s+/' |
  10. grep -vE '^\s+/System/' |
  11. grep -vE '^\s+/usr/lib/' |
  12. perl -pe 's|^\s+(/.*)\s\(.*$|$1|' |
  13. grep -vE ":$" |
  14. sort -u
  15. }
  16. export -f buildlist
  17. DEST="$2"
  18. LDEST="@rpath"
  19. TARGETS="$(find . \( -perm +111 -and -type f \))"
  20. FOUNDLIBS="$(buildlist $TARGETS)"
  21. PFOUNDLIBS=""
  22. while [ "$FOUNDLIBS" != "$PFOUNDLIBS" ]; do
  23. PFOUNDLIBS="$FOUNDLIBS"
  24. FOUNDLIBS="$(buildlist $TARGETS $PFOUNDLIBS)"
  25. done
  26. INTOOL_CALL=()
  27. for lib in $FOUNDLIBS; do
  28. libname="$(basename "$lib")"
  29. INTOOL_CALL+=(-change "$lib" "$LDEST/$libname")
  30. cp "$lib" "$DEST/$libname"
  31. chmod 644 "$DEST/$libname"
  32. echo "Fixing up dependency: $libname"
  33. done
  34. for lib in $FOUNDLIBS; do
  35. libname="$(basename "$lib")"
  36. lib="$DEST/$libname"
  37. install_name_tool ${INTOOL_CALL[@]} -id "$LDEST/$libname" "$lib"
  38. done
  39. for target in $TARGETS; do
  40. install_name_tool ${INTOOL_CALL[@]} "$target"
  41. done