On OS X, add an rpath for the Qt frameworks, and remove it in the app bundle.

Qt 5.5 and later have @rpath-based install names for the frameworks,
which means that, if they're not installed in some frameworks directory
searched by default (such as /Library/Frameworks) - which is the default
case with the Qt installer - they won't be found by default.

Add the directory in which the frameworks exist as an rpath in the
Wireshark binary, so that they'll be found, and then remove it from the
Wireshark binary in the app bundle, as the directory in which the
frameworks exist on the machine on which Wireshark was built is
irrelevant to the machines on which it's being deployed - the frameworks
are included in the bundle, and we already add an rpath to find them
there.

Change-Id: I54e033743e7b17eab26976064dcd7cd000f97c78
Reviewed-on: https://code.wireshark.org/review/9625
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2015-07-13 10:34:50 -07:00
parent 7b9b3d4693
commit 9f03aa131e
3 changed files with 43 additions and 2 deletions

View File

@ -372,7 +372,7 @@ if HAVE_GTK
wireshark_gtk_LDFLAGS = -export-dynamic
endif
if HAVE_Qt
wireshark_LDFLAGS = -export-dynamic
wireshark_LDFLAGS = -export-dynamic @Qt_LDFLAGS@
endif
endif

View File

@ -1625,7 +1625,7 @@ if test "x$enable_wireshark" = "xyes"; then
fi
if test "x$with_qt" != "xno"; then
#
# Qt was specified; Make sure we have a C++ compiler.
# Qt was specified; make sure we have a C++ compiler.
#
if test -z "$CXX"; then
AC_MSG_ERROR(Need a working C++ compiler to build Wireshark with Qt)
@ -1663,6 +1663,26 @@ if test "x$enable_wireshark" = "xyes"; then
AC_SUBST(MOC)
AC_WIRESHARK_QT_TOOL_CHECK(RCC, rcc, "$qt_version")
AC_SUBST(RCC)
#
# On Darwin, find where the Qt frameworks are
# located, and add that to the rpath, just in
# case this is Qt 5.5 or later and the frameworks
# have an install name that begins with @rpath
# and aren't installed in a frameworks directory
# that's searched by default.
#
case "$host_os" in
darwin*)
if test $qt_version -le 4
then
Qt_LDFLAGS="-Wl,-rpath,"`$PKG_CONFIG --libs QtCore | sed -e 's/-F//' -e 's/ -framework.*//'`
else
Qt_LDFLAGS="-Wl,-rpath,"`$PKG_CONFIG --libs Qt${qt_version}Core | sed -e 's/-F//' -e 's/ -framework.*//'`
fi
;;
esac
AC_SUBST(Qt_LDFLAGS)
],
[
case "$with_qt" in

View File

@ -178,6 +178,21 @@ elif [ ! -d "$bundle" ] ; then
exit 1
fi
if [ "$ui_toolkit" = "qt" ] ; then
for i in 5 ""
do
qt_frameworks_dir=`pkg-config --libs Qt${i}Core | sed -e 's/-F//' -e 's/ -framework.*//'`
if [ ! -z "$qt_frameworks_dir" ] ; then
# found it
break;
fi
done
if [ -z "$qt_frameworks_dir" ] ; then
echo "Can't find the Qt frameworks directory" >&2
exit 1
fi
fi
# Package paths
pkgexec="$bundle/Contents/MacOS"
pkgres="$bundle/Contents/Resources"
@ -468,6 +483,12 @@ fi
if [ "$ui_toolkit" = "qt" ] ; then
macdeployqt "$bundle" -verbose=3 || exit 1
#
# The build process added to the Wireshark binary an rpath entry
# pointing to the directory containing the Qt frameworks; remove
# that entry from the Wireshark binary in the package.
/usr/bin/install_name_tool -delete_rpath "$qt_frameworks_dir" $pkgbin/Wireshark
fi
# NOTE: we must rpathify *all* files, *including* plugins for GTK+ etc.,