diff options
author | Simon Howard | 2010-01-10 18:42:35 +0000 |
---|---|---|
committer | Simon Howard | 2010-01-10 18:42:35 +0000 |
commit | da950e23214018c7dc80dff0cb5566ad46bf30cf (patch) | |
tree | fb623b98070c2cf0b80b5ba73e94f7479783bd77 | |
parent | a4f038a36435b5d4dd726c2f9e3f6a34e0269ec6 (diff) | |
download | chocolate-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-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" |