summaryrefslogtreecommitdiff
path: root/packaging/macosx
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2015-10-21 18:18:57 -0700
committerGerald Combs <gerald@wireshark.org>2015-10-22 17:04:08 +0000
commit1c2ed18723f9238e3537119e88b2b5da70014225 (patch)
treefeffb4df21f7e0d7ee41d2e55439e89202c0c4fe /packaging/macosx
parent1a383f8a8245c7baf142d8b3085c4f7f83a6e4a7 (diff)
downloadwireshark-1c2ed18723f9238e3537119e88b2b5da70014225.tar.gz
osx-app.sh fixups.
For libraries, instead of prefixing dependent library paths with @executable_path/../Framework, prefix them with @rpath. This should let us load them from different directory depths. Remove any LC_RPATH not in an allowed list of prefixes. This should keep us from leaking paths specific to the build environment and user, and should make any portability problems more obvious. Add either @executable_path/../Frameworks or @executable_path/../../Frameworks as an LC_RPATH depending on which actually exists. This lets us place androiddump in the extcap subdirectory. Add error checking in a few places and make sure we detect failures in subshells. Add a macdeployqt buglink. Bug: 11620 Change-Id: I43ef02ecc6f741761fcb9827c0b0b7b2ef16fa9a Reviewed-on: https://code.wireshark.org/review/11205 Reviewed-by: Gerald Combs <gerald@wireshark.org>
Diffstat (limited to 'packaging/macosx')
-rwxr-xr-xpackaging/macosx/osx-app.sh206
1 files changed, 129 insertions, 77 deletions
diff --git a/packaging/macosx/osx-app.sh b/packaging/macosx/osx-app.sh
index 6a7f061f51..b12cb329c6 100755
--- a/packaging/macosx/osx-app.sh
+++ b/packaging/macosx/osx-app.sh
@@ -50,7 +50,6 @@ ui_toolkit="qt"
wireshark_bin_name="wireshark"
binary_list="
- androiddump
capinfos
dftest
dumpcap
@@ -60,6 +59,7 @@ binary_list="
rawshark
text2pcap
tshark
+ extcap/androiddump
"
cs_binary_list=
@@ -487,6 +487,10 @@ if [ "$strip" = "true" ]; then
fi
if [ "$ui_toolkit" = "qt" ] ; then
+ #
+ # This may not work on Qt 5.5.0 or 5.5.1:
+ # https://bugreports.qt.io/browse/QTBUG-47868
+ #
macdeployqt "$bundle" -verbose=2 || exit 1
#
@@ -502,92 +506,134 @@ fi
#
rpathify_file () {
# Fix a given executable, library, or plugin to be relocatable
- if [ ! -d "$1" ]; then
+ if [ ! -f "$1" ]; then
+ return 0;
+ fi
+
+ #
+ # OK, what type of file is this?
+ #
+ filetype=$( otool -hv "$1" | sed -n '4p' | awk '{print $5}' ; exit ${PIPESTATUS[0]} )
+ if [ $? -ne 0 ] ; then
+ echo "Unable to rpathify $1 in $( pwd ): file type failed."
+ exit 1
+ fi
+
+ case "$filetype" in
+
+ EXECUTE|DYLIB|BUNDLE)
#
- # OK, what type of file is this?
+ # Executable, library, or plugin. (Plugins
+ # can be either DYLIB or BUNDLE; shared
+ # libraries are DYLIB.)
#
- filetype=`otool -hv "$1" | sed -n '4p' | awk '{print $5}'`
- case "$filetype" in
-
- EXECUTE|DYLIB|BUNDLE)
+ # 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}'`
#
- # Executable, library, or plugin. (Plugins
- # can be either DYLIB or BUNDLE; shared
- # libraries are DYLIB.)
+ # The library will end up in a directory in
+ # the rpath; this is what we should change its
+ # ID to.
#
- # For DYLIB and BUNDLE, fix the shared
- # library identification.
+ to=@rpath/$base
+ /usr/bin/install_name_tool -id $to $1
+
+ #
+ # If we're a library and we depend on something in
+ # @executable_path/../Frameworks, replace that with
+ # @rpath.
#
- 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
+ otool -L $1 | grep @executable_path/../Frameworks | awk '{print $1}' | \
+ while read dep_lib ; do
+ base=`echo $dep_lib | awk -F/ '{print $NF}'`
+ to="@rpath/$base"
+ echo "Changing reference to $dep_lib to $to in $1"
+ /usr/bin/install_name_tool -change $dep_lib $to $1
+ done
+ fi
+
+ #
+ # Find our local rpaths and remove them.
+ #
+ otool -l $1 | grep -A2 LC_RPATH \
+ | awk '$1=="path" && $2 !~ /^@/ {print $2}' \
+ | egrep -v "$exclude_prefixes" | \
+ while read lc_rpath ; do
+ echo "Stripping LC_RPATH $lc_rpath from $1"
+ install_name_tool -delete_rpath $lc_rpath $1
+ done
+
+ #
+ # Add -Wl,-rpath,@executable_path/../Frameworks
+ # to the rpath, so it'll find the bundled
+ # frameworks and libraries if they're referred
+ # to by @rpath/, rather than having a wrapper
+ # script tweak DYLD_LIBRARY_PATH.
+ #
+ if [[ "$filetype" = "EXECUTE" ]]; then
+ if [ -d ../Frameworks ] ; then
+ framework_path=../Frameworks
+ elif [ -d ../../Frameworks ] ; then
+ framework_path=../../Frameworks
+ else
+ echo "Unable to find relative path to Frameworks for $1 from $( pwd )"
+ exit 1
fi
+ echo "Adding @executable_path/$framework_path to rpath of $1"
+ /usr/bin/install_name_tool -add_rpath @executable_path/$framework_path $1
+ fi
+
+ #
+ # Show the minimum supported version of Mac OS X
+ # for each executable or library
+ #
+ if [[ "$filetype" = "EXECUTE" || "$filetype" = "DYLIB" ]] && [[ "$VERSION" -ge "7" ]] ; then
+ echo "Minimum Mac OS X version for $1:"
+ otool -l $1 | grep -A3 LC_VERSION_MIN_MACOSX
+ 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 \
+ | fgrep compatibility \
+ | cut -d\( -f1 \
+ | egrep -v "$exclude_prefixes" \
+ | sort \
+ | uniq \
+ `"
+
+ for lib in $libs; do
#
- # Add -Wl,-rpath,@executable_path/../Frameworks
- # to the rpath, so it'll find the bundled
- # frameworks and libraries if they're referred
- # to by @rpath/, rather than having a wrapper
- # script tweak DYLD_LIBRARY_PATH.
+ # Get the file name of the library.
#
- echo "Adding @executable_path/../Frameworks to rpath of $1"
- /usr/bin/install_name_tool -add_rpath @executable_path/../Frameworks $1
-
+ base=`echo $lib | awk -F/ '{print $NF}'`
#
- # Show the minimum supported version of Mac OS X
- # for each executable or library
+ # The library will end up in a directory in
+ # the rpath; this is what we should change its
+ # file name to.
#
- if [[ "$filetype" = "EXECUTE" || "$filetype" = "DYLIB" ]] && [[ "$VERSION" -ge "7" ]] ; then
- echo "Minimum Mac OS X version for $1:"
- otool -l $1 | grep -A3 LC_VERSION_MIN_MACOSX
- fi
-
+ to=@rpath/$base
#
- # 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.
+ # Change the reference to that library.
#
- libs="`\
- otool -L $1 \
- | fgrep compatibility \
- | cut -d\( -f1 \
- | egrep -v "$exclude_prefixes" \
- | sort \
- | uniq \
- `"
-
- 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 to $to in $1"
- /usr/bin/install_name_tool -change $lib $to $1
- done
- ;;
- esac
- fi
+ echo "Changing reference to $lib to $to in $1"
+ /usr/bin/install_name_tool -change $lib $to $1
+ done
+ ;;
+ esac
}
rpathify_dir () {
@@ -606,6 +652,8 @@ rpathify_dir () {
done
fi
)
+ rf_ret=$?
+ if [ $rf_ret -ne 0 ] ; then exit $rf_ret ; fi
fi
}
@@ -614,6 +662,13 @@ rpathify_files () {
# Fix bundle deps
#
rpathify_dir "$pkglib" "*.dylib"
+ rpathify_dir "$pkgbin" "*"
+ rpathify_dir "$pkgplugin" "*"
+
+ if [ "$ui_toolkit" = "qt" ] ; then
+ rpathify_dir "$pkgbin/extcap" "*"
+ fi
+
if [ "$ui_toolkit" = "gtk" ] ; then
rpathify_dir "$pkglib/gtk-2.0/$gtk_version/loaders" "*.so"
rpathify_dir "$pkglib/gtk-2.0/$gtk_version/engines" "*.so"
@@ -623,9 +678,6 @@ rpathify_files () {
rpathify_dir "$pkglib/gdk-pixbuf-2.0/$gtk_version/loaders" "*.so"
rpathify_dir "$pkglib/pango/$pango_version/modules" "*.so"
fi
- rpathify_dir "$pkgbin" "*"
- rpathify_dir "$pkgbin/extcap" "*"
- rpathify_dir "$pkgplugin" "*"
}
PATHLENGTH=`echo $LIBPREFIX | wc -c`