#!/bin/bash SCRIPT_ABS_FILENAME=`perl -e 'use Cwd "abs_path";print abs_path(shift)' "${BASH_SOURCE[0]}"` SCRIPT_DIR=`dirname "$SCRIPT_ABS_FILENAME"` #set -x #sudo chown -R $(id -F) "$SCRIPT_DIR" #sudo chmod -R u+w "$SCRIPT_DIR" if [ -z "$1" ] then echo "Usage: $0 executable_file [dest dir] [dylib dir name]" exit 1 fi file="$1" filebasename="$(basename "$file")" filedir="$(dirname "$file")" if [ -z "$2" ] then dir="." else dir="$2" fi if [ -z "$3" ] then dylib_dir_name="$filebasename".dylibs else dylib_dir_name="$3" fi process_a_file () { echo '------------------------------------------> Checking file ' \'"$1"\' #otool -L "$1" #set -x if false && [ -L "$1" ] then #We don't process symlinks. We'll process the original instead : echo Symlink : nothing to do. Process the original instead. return 1 else current_file="$1" local libbasename=`basename "$1"` #echo libbasename=$libbasename local libdirname=`dirname "$1"` #echo libdirname=$libdirname local destdir="$2" #cd "$libdirname" local returnValue=0 local nbline=$(otool -D "$libdirname"/"$libbasename" | wc -l) if [ $nbline -gt 1 ] then local firstline_is_id=1 else local firstline_is_id=0 fi while read -r line; do # line would be something like "/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)" #echo line=$line \(firstline_is_id=$firstline_is_id\) ex='^(.*) \(.*\)$' if [[ "$line" =~ $ex ]] then local dependent_lib_path="${BASH_REMATCH[1]}" #this could be a path starting with @loader_path/ local dependent_lib_realpath="${dependent_lib_path/@loader_path/$filedir}" #this could be a path starting with @loader_path/ #echo dependent_lib_path="$dependent_lib_path" #echo dependent_lib_realpath="$dependent_lib_realpath" ex2='^/System/Library/Frameworks/.*$' ex3='^/usr/lib/.*$' if ! [[ "$dependent_lib_path" =~ $ex2 ]] && ! [[ "$dependent_lib_path" =~ $ex3 ]] then local dependent_lib_basename=$(basename "$dependent_lib_path") #echo libbasename=$libbasename if [ $firstline_is_id -eq 1 ] then local libabsolutepath=$(cd "$libdirname"; pwd)/"$libbasename" if [ "$dependent_lib_path" = "$libabsolutepath" ] then : echo already correct # Do nothing, ID is already correct else #CMD="install_name_tool -id "$libabsolutepath" "$libdirname"/"$libbasename"" cmd=() cmd=( install_name_tool -id "$libabsolutepath" "$libdirname"/"$libbasename" ) #echo issuing cmd : "${cmd[@]}" "${cmd[@]}" fi firstline_is_id=0 else local dependent_lib_newpath="$destdir"/"$dependent_lib_basename" #echo Copy and process : "$dependent_lib_realpath" to "$dependent_lib_newpath" rm -f "$dependent_lib_newpath" cp "$dependent_lib_realpath" "$dependent_lib_newpath" || exit 1 chmod u+w "$dependent_lib_newpath" local cd_bak="$(pwd)" #echo cd "$destdir" cd "$destdir" process_a_file "$dependent_lib_basename" . local ret=$? cd "$cd_bak" if ! [ $? -eq 0 ] then echo Processing "$dependent_lib_newpath" failed. return -1 fi #echo '----------------------------> Back in file ' \'"$1"\' if [[ "$destdir" == "." ]] then local new_lib_relative_path="@loader_path"/"$dependent_lib_basename" else local new_lib_relative_path="@loader_path"/"$destdir"/"$dependent_lib_basename" fi if [ "$dependent_lib_path" != "$dependent_lib_newpath" ] then cmd=() cmd=( install_name_tool -change "$dependent_lib_path" "$new_lib_relative_path" "$libdirname"/"$libbasename" ) #echo issuing cmd : "${cmd[@]}" "${cmd[@]}" fi fi else : #echo "$libfullpath" failed at =~ $ex2 =~ $ex3 fi else : #echo "$libfullpath" failed at '^(.*) \(.*\)$' fi done <<< "$(otool -XL "$libdirname"/"$libbasename")" fi } #otool -L "$file" cd "$dir" rm -f "$filebasename" cp "$file" . chmod u+w "$filebasename" mkdir -p "$dir"/"$dylib_dir_name" process_a_file "$filebasename" "$dylib_dir_name" #echo $?