diff options
-rwxr-xr-x | pkg/osx/cp-with-libs | 102 |
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" |