fixup_bundle.sh 951 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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 "(opt|Users)" |
  10. perl -pe 's|^\s+(/.*)\s\(.*$|$1|' |
  11. grep -vE ":$" |
  12. sort -u
  13. }
  14. export -f buildlist
  15. DEST="$2"
  16. LDEST="@rpath"
  17. TARGETS="$(find . \( -perm +111 -and -type f \))"
  18. FOUNDLIBS="$(buildlist $TARGETS)"
  19. PFOUNDLIBS=""
  20. while [ "$FOUNDLIBS" != "$PFOUNDLIBS" ]; do
  21. PFOUNDLIBS="$FOUNDLIBS"
  22. FOUNDLIBS="$(buildlist $TARGETS $PFOUNDLIBS)"
  23. done
  24. INTOOL_CALL=()
  25. for lib in $FOUNDLIBS; do
  26. libname="$(basename "$lib")"
  27. INTOOL_CALL+=(-change "$lib" "$LDEST/$libname")
  28. cp "$lib" "$DEST/$libname"
  29. echo "Fixing up dependency: $libname"
  30. done
  31. for lib in $FOUNDLIBS; do
  32. libname="$(basename "$lib")"
  33. lib="$DEST/$libname"
  34. install_name_tool ${INTOOL_CALL[@]} -id "$LDEST/$libname" "$lib"
  35. done
  36. for target in $TARGETS; do
  37. install_name_tool ${INTOOL_CALL[@]} "$target"
  38. done