summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Howard2010-01-10 18:42:35 +0000
committerSimon Howard2010-01-10 18:42:35 +0000
commitda950e23214018c7dc80dff0cb5566ad46bf30cf (patch)
treefb623b98070c2cf0b80b5ba73e94f7479783bd77
parenta4f038a36435b5d4dd726c2f9e3f6a34e0269ec6 (diff)
downloadchocolate-doom-da950e23214018c7dc80dff0cb5566ad46bf30cf.tar.gz
chocolate-doom-da950e23214018c7dc80dff0cb5566ad46bf30cf.tar.bz2
chocolate-doom-da950e23214018c7dc80dff0cb5566ad46bf30cf.zip
Recursively copy library dependencies into destination package. Identify
libraries to be installed based on the path in which they are located, rather than whether there is "libSDL" in the name. Use install_name_tool to change the search path so that the system looks for libraries in @executable_path@ rather than their location on the machine upon which the program was built. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1796
-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"