shithub: choc

Download patch

ref: da950e23214018c7dc80dff0cb5566ad46bf30cf
parent: a4f038a36435b5d4dd726c2f9e3f6a34e0269ec6
author: Simon Howard <[email protected]>
date: Sun Jan 10 13:42:35 EST 2010

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

--- 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"