summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xpkg/osx/cp-with-libs102
1 files changed, 93 insertions, 9 deletions
diff --git a/pkg/osx/cp-with-libs b/pkg/osx/cp-with-libs
index bb4fa001..18274172 100755
--- a/pkg/osx/cp-with-libs
+++ b/pkg/osx/cp-with-libs
@@ -1,16 +1,100 @@
-#!/bin/sh
+#!/bin/bash
#
# Copy a program to the specified destination, along
-# with SDL libraries it depends upon.
+# with libraries it depends upon.
-BINARY=$1
-DEST=$2
+src_bin=$1
+dest_dir=$2
-cp "$BINARY" "$DEST"
+# Returns true if the specified file is a dylib.
-# Copy libraries; only those with libSDL in the name
+is_dylib() {
+ case "$1" in
+ *.dylib)
+ true
+ ;;
+ *)
+ false
+ ;;
+ esac
+}
-otool -L "$BINARY" | grep libSDL | sed 's/^.//; s/ (.*//' | while read; do
- cp "$REPLY" "$DEST"
-done
+# Returns true if the specified file is in a system location
+# (/System or /usr):
+
+is_sys_lib() {
+ case "$1" in
+ /System/*)
+ true
+ ;;
+ /usr/*)
+ true
+ ;;
+ *)
+ false
+ ;;
+ esac
+}
+
+# Install the specified file to the location in dest_dir, along with
+# any libraries it depends upon (recursively):
+
+install_with_deps() {
+ local src_file
+ local bin_name
+ local dest_file
+ local lib_name
+
+ src_file=$1
+ bin_name=$(basename "$src_file")
+ dest_file="$dest_dir/$bin_name"
+
+ # Already copied into the package? Don't copy again.
+ # Prevents endless recursion.
+
+ if [ -e "$dest_file" ]; then
+ return
+ fi
+
+ echo "Installing $bin_name..."
+
+ # Copy file into package.
+
+ cp "$src_file" "$dest_file"
+
+ # Copy libraries that this file depends on:
+
+ otool -L "$src_file" | tail -n +2 | sed 's/^.//; s/ (.*//' | while read; do
+
+ # Don't copy system libraries
+
+ if is_sys_lib "$REPLY"; then
+ continue
+ fi
+
+ #echo " - $bin_name depends on $REPLY"
+
+ # Copy this library into the package, and:
+ # recursively install any libraries that _this_ library depends on:
+
+ install_with_deps "$REPLY"
+
+ # Change destination binary to depend on the
+ # copy inside the package:
+
+ lib_name=$(basename "$REPLY")
+ install_name_tool -change "$REPLY" "@executable_path@/$lib_name" \
+ "$dest_file"
+ done
+
+ # If this is a library that we have installed, change its id:
+
+ if is_dylib "$dest_file"; then
+ install_name_tool -id "@executable_path@/$bin_name" "$dest_file"
+ fi
+}
+
+# Install the file, and recursively install any libraries:
+
+install_with_deps "$src_bin"