On OS X, set the rpath for executables to include
@executable_path/../lib as well as /usr/local/lib, so we can use @rpath in the install names in the executables and libraries in the application bundle. Have the osx-app.sh script tweak all references to libraries from /usr/local/lib in all executables, libraries, and plugins in the app bundle to use @rpath. (The "all" is important; it fixes the GTK+ crash mentioned in the comment in osx-app.sh. The notion of doing all of them came from the osx-app.sh script in a newer version of Inkscape.) This renders the setting of DYLD_LIBRARY_PATH in the wrapper scripts in the bundle unnecessary; remove it. (Ideally, we should try to get rid of the wrapper scripts entirely, but that might have to wait for us to switch to using Qt.) svn path=/trunk/; revision=50560
This commit is contained in:
parent
94f44f7601
commit
bc239a7286
11
configure.ac
11
configure.ac
|
@ -992,8 +992,15 @@ darwin*)
|
|||
# with a static version installed in /usr/local/lib rather than
|
||||
# the system version in /usr/lib).
|
||||
#
|
||||
LDFLAGS="-Wl,-search_paths_first $LDFLAGS"
|
||||
AC_MSG_RESULT([Apple linker - added -Wl,-single_module and -Wl,-search_paths_first])
|
||||
# Also add -Wl,-rpath,@executable_path/../lib and
|
||||
# -Wl,-rpath,/usr/local/lib, so that, if we build an app
|
||||
# bundle, we can tweak all the executable images, shared
|
||||
# libraries, and plugins in the bundle to look for non-system
|
||||
# libraries in the rpath, rather than having a script tweak
|
||||
# DYLD_LIBRARY_PATH.
|
||||
#
|
||||
LDFLAGS="-Wl,-search_paths_first -Wl,-rpath,@executable_path/../lib -Wl,-rpath,/usr/local/lib $LDFLAGS"
|
||||
AC_MSG_RESULT([Apple linker - added -Wl,-single_module and -Wl,-search_paths_first, and rpaths])
|
||||
;;
|
||||
cygwin*)
|
||||
#
|
||||
|
|
|
@ -28,7 +28,7 @@ APPNAME=`basename "$0"`
|
|||
# MacPorts (former DarwinPorts)
|
||||
export PATH="/opt/local/bin:/sw/bin/:/Library/Frameworks/Python.framework/Versions/Current/bin:/usr/local/bin:$CWD:$PATH"
|
||||
|
||||
export DYLD_LIBRARY_PATH="$TOP/lib"
|
||||
# export DYLD_LIBRARY_PATH="$TOP/lib"
|
||||
|
||||
export WIRESHARK_DATA_DIR="$TOP/share/wireshark"
|
||||
export WIRESHARK_PLUGIN_DIR="$TOP/lib/wireshark/plugins"
|
||||
|
|
|
@ -380,47 +380,121 @@ if [ "$strip" = "true" ]; then
|
|||
strip -ur "$binpath"
|
||||
fi
|
||||
|
||||
# NOTE: This works for all the dylibs but causes GTK to crash at startup.
|
||||
# Instead we leave them with their original install_names and set
|
||||
# DYLD_LIBRARY_PATH within the app bundle before running Wireshark.
|
||||
# XXX - is that because some plugins need fixing?
|
||||
# NOTE: we must rpathify *all* files, *including* plugins for GTK+ etc.,
|
||||
# to keep GTK+ from crashing at startup.
|
||||
#
|
||||
# fixlib () {
|
||||
# # Fix a given executable or library to be relocatable
|
||||
# if [ ! -d "$1" ]; then
|
||||
# echo $1
|
||||
# libs="`otool -L $1 | egrep -v '/System|/usr/lib|/opt' | fgrep compatibility | cut -d\( -f1`"
|
||||
# for lib in $libs; do
|
||||
# echo " $lib"
|
||||
# base=`echo $lib | awk -F/ '{print $NF}'`
|
||||
# first=`echo $lib | cut -d/ -f1-3`
|
||||
# to=@rpath/$base
|
||||
# if [ $first != /usr/lib -a $first != /usr/X11R6 ]; then
|
||||
# /usr/bin/install_name_tool -change $lib $to $1
|
||||
# if [ "`echo $lib | fgrep libcrypto`" = "" ]; then
|
||||
# /usr/bin/install_name_tool -id $to ../lib/$base
|
||||
# for ll in $libs; do
|
||||
# base=`echo $ll | awk -F/ '{print $NF}'`
|
||||
# first=`echo $ll | cut -d/ -f1-3`
|
||||
# to=@rpath/$base
|
||||
# if [ $first != /usr/lib -a $first != /usr/X11R6 -a "`echo $ll | fgrep libcrypto`" = "" ]; then
|
||||
# /usr/bin/install_name_tool -change $ll $to ../lib/$base
|
||||
# fi
|
||||
# done
|
||||
# fi
|
||||
# fi
|
||||
# done
|
||||
# fi
|
||||
# }
|
||||
#
|
||||
# Fix package deps
|
||||
# (cd "$package/Contents/Resources/bin"
|
||||
# for file in *; do
|
||||
# fixlib "$file"
|
||||
# done
|
||||
# cd ../lib
|
||||
# for file in *; do
|
||||
# fixlib "$file"
|
||||
# done)
|
||||
rpathify_file () {
|
||||
# Fix a given executable, library, or plugin to be relocatable
|
||||
if [ ! -d "$1" ]; then
|
||||
#
|
||||
# OK, what type of file is this?
|
||||
#
|
||||
filetype=`otool -hv "$1" | sed -n '4p' | awk '{print $5}'`
|
||||
case "$filetype" in
|
||||
|
||||
EXECUTE|DYLIB|BUNDLE)
|
||||
#
|
||||
# Executable, library, or plugin. (Plugins
|
||||
# can be either DYLIB or BUNDLE; shared
|
||||
# libraries are DYLIB.)
|
||||
#
|
||||
# For DYLIB and BUNDLE, fix the shared
|
||||
# library identification.
|
||||
#
|
||||
if [[ "$filetype" = "DYLIB" || "$filetype" = "BUNDLE" ]]; then
|
||||
echo "Changing shared library identification of $1"
|
||||
base=`echo $1 | awk -F/ '{print $NF}'`
|
||||
#
|
||||
# The library will end up in a directory in
|
||||
# the rpath; this is what we should change its
|
||||
# ID to.
|
||||
#
|
||||
to=@rpath/$base
|
||||
/usr/bin/install_name_tool -id $to $1
|
||||
fi
|
||||
|
||||
#
|
||||
# Get the list of dynamic libraries on which this
|
||||
# file depends, and select only the libraries that
|
||||
# are in $LIBPREFIX, as those are the only ones
|
||||
# that we'll be shipping in the app bundle; the
|
||||
# other libraries are system-supplied or supplied
|
||||
# as part of X11, will be expected to be on the
|
||||
# system on which the bundle will be installed,
|
||||
# and should be referred to by their full pathnames.
|
||||
#
|
||||
libs="`otool -L $1 | egrep "$LIBPREFIX.* \(compatibility" | cut -d\( -f1`"
|
||||
for lib in $libs; do
|
||||
#
|
||||
# Get the file name of the library.
|
||||
#
|
||||
base=`echo $lib | awk -F/ '{print $NF}'`
|
||||
#
|
||||
# The library will end up in a directory in
|
||||
# the rpath; this is what we should change its
|
||||
# file name to.
|
||||
#
|
||||
to=@rpath/$base
|
||||
#
|
||||
# Change the reference to that library.
|
||||
#
|
||||
echo "Changing reference to $lib in $1"
|
||||
/usr/bin/install_name_tool -change $lib $to $1
|
||||
done
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
rpathify_dir () {
|
||||
#
|
||||
# Make sure we *have* that directory
|
||||
#
|
||||
if [ -d "$1" ]; then
|
||||
(cd "$1"
|
||||
#
|
||||
# Make sure we *have* files to fix
|
||||
#
|
||||
files=`ls $2 2>/dev/null`
|
||||
if [ ! -z "$files" ]; then
|
||||
for file in $files; do
|
||||
rpathify_file "$file" "`pwd`"
|
||||
done
|
||||
fi
|
||||
)
|
||||
fi
|
||||
}
|
||||
|
||||
rpathify_files () {
|
||||
#
|
||||
# Fix package deps
|
||||
#
|
||||
rpathify_dir "$pkglib" "*.dylib"
|
||||
rpathify_dir "$pkglib/gtk-2.0/$gtk_version/loaders" "*.so"
|
||||
rpathify_dir "$pkglib/gtk-2.0/$gtk_version/engines" "*.so"
|
||||
rpathify_dir "$pkglib/gtk-2.0/$gtk_version/immodules" "*.so"
|
||||
rpathify_dir "$pkglib/gtk-2.0/$gtk_version/printbackends" "*.so"
|
||||
rpathify_dir "$pkglib/gnome-vfs-2.0/modules" "*.so"
|
||||
rpathify_dir "$pkglib/gdk-pixbuf-2.0/$gtk_version/loaders" "*.so"
|
||||
rpathify_dir "$pkglib/pango/$pango_version/modules" "*.so"
|
||||
rpathify_dir "$pkgbin" "*"
|
||||
}
|
||||
|
||||
PATHLENGTH=`echo $LIBPREFIX | wc -c`
|
||||
if [ "$PATHLENGTH" -ge "6" ]; then
|
||||
# If the LIBPREFIX path is long enough to allow
|
||||
# path rewriting, then do this.
|
||||
# 6 is the length of @rpath, which replaces LIBPREFIX.
|
||||
rpathify_files
|
||||
else
|
||||
echo "Could not rewrite dylib paths for bundled libraries. This requires" >&2
|
||||
echo "the support libraries to be installed in a PREFIX of at least 6 characters in length." >&2
|
||||
echo "" >&2
|
||||
echo "The package will still work if the following line is uncommented in" >&2
|
||||
echo "Wireshark.app/Contents/Resources/bin/{various scripts}:" >&2
|
||||
echo ' export DYLD_LIBRARY_PATH="$TOP/lib"' >&2
|
||||
exit 1
|
||||
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
Loading…
Reference in New Issue