aboutsummaryrefslogtreecommitdiffstats
path: root/packaging/macosx/osx-app.sh
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2008-03-15 18:31:52 +0000
committerGerald Combs <gerald@wireshark.org>2008-03-15 18:31:52 +0000
commit46bcad885a7a0c8e7d9b0009b0e231cb3c3677e9 (patch)
treeda6234e8eb1c99e0c4c0bc9f7dbfa6eb303f12fe /packaging/macosx/osx-app.sh
parentdca49accfae6990c6a1dcef28c09104adc82828d (diff)
Check in the OS X packaging patch from bug 2341, since I've had
confirmation that the OS X package works on at least one system other than my laptop. svn path=/trunk/; revision=24640
Diffstat (limited to 'packaging/macosx/osx-app.sh')
-rwxr-xr-xpackaging/macosx/osx-app.sh372
1 files changed, 372 insertions, 0 deletions
diff --git a/packaging/macosx/osx-app.sh b/packaging/macosx/osx-app.sh
new file mode 100755
index 0000000000..e617aef8a9
--- /dev/null
+++ b/packaging/macosx/osx-app.sh
@@ -0,0 +1,372 @@
+#!/bin/bash
+#
+# $Id$
+#
+# USAGE
+# osx-app [-s] [-l /path/to/libraries] -bp /path/to/wireshark/bin -p /path/to/Info.plist
+#
+# This script attempts to build an Wireshark.app package for OS X, resolving
+# dynamic libraries, etc.
+# It strips the executable and libraries if '-s' is given.
+# It adds python modules if the '-py option' is given
+# The Info.plist file can be found in the base wireshark directory once
+# configure has been run.
+#
+# AUTHORS
+# Kees Cook <kees@outflux.net>
+# Michael Wybrow <mjwybrow@users.sourceforge.net>
+# Jean-Olivier Irisson <jo.irisson@gmail.com>
+#
+# Copyright (C) 2005 Kees Cook
+# Copyright (C) 2005-2007 Michael Wybrow
+# Copyright (C) 2007 Jean-Olivier Irisson
+#
+# Released under GNU GPL, read the file 'COPYING' for more information
+#
+# Thanks to GNUnet's "build_app" script for help with library dep resolution.
+# https://gnunet.org/svn/GNUnet/contrib/OSX/build_app
+#
+# NB:
+# When packaging Wireshark for OS X, configure should be run with the
+# "--enable-osxapp" option which sets the correct paths for support
+# files inside the app bundle.
+#
+
+# Defaults
+strip=false
+binary_path="/tmp/inst/bin"
+plist="./Info.plist"
+util_dir="./Utilities"
+cli_dir="$util_dir/Command Line"
+startup_dir="$util_dir/Startup"
+
+binary_list="
+ capinfos
+ dftest
+ dumpcap
+ editcap
+ idl2wrs
+ mergecap
+ randpkt
+ rawshark
+ text2pcap
+ tshark
+ wireshark
+"
+
+# Location for libraries (MacPorts defaults to /opt/local)
+if [ -z $LIBPREFIX ]; then
+ LIBPREFIX="/opt/local"
+fi
+
+
+# Help message
+#----------------------------------------------------------
+help()
+{
+echo -e "
+Create an app bundle for OS X
+
+\033[1mUSAGE\033[0m
+ $0 [-s] [-l /path/to/libraries] -bp /path/to/wireshark/binaries -p /path/to/Info.plist
+
+\033[1mOPTIONS\033[0m
+ \033[1m-h,--help\033[0m
+ display this help message
+ \033[1m-s\033[0m
+ strip the libraries and executables from debugging symbols
+ \033[1m-l,--libraries\033[0m
+ specify the path to the librairies Wireshark depends on
+ (typically /sw or /opt/local)
+ \033[1m-bp,--binary-path\033[0m
+ specify the path to the Wireshark binaries. By default it
+ is in $binary_path
+ \033[1m-p,--plist\033[0m
+ specify the path to Info.plist. Info.plist can be found
+ in the base directory of the source code once configure
+ has been run
+
+\033[1mEXAMPLE\033[0m
+ $0 -s -l /opt/local -bp ../../Build/bin -p Info.plist
+"
+}
+
+
+# Parse command line arguments
+#----------------------------------------------------------
+while [ "$1" != "" ]
+do
+ case $1 in
+ -s)
+ strip=true ;;
+ -l|--libraries)
+ LIBPREFIX="$2"
+ shift 1 ;;
+ -bp|--binary-path)
+ binary_path="$2"
+ shift 1 ;;
+ -p|--plist)
+ plist="$2"
+ shift 1 ;;
+ -h|--help)
+ help
+ exit 0 ;;
+ *)
+ echo "Invalid command line option: $1"
+ exit 2 ;;
+ esac
+ shift 1
+done
+
+echo -e "\n\033[1mCREATE WIRESHARK APP BUNDLE\033[0m\n"
+
+# Safety tests
+if [ ! -e "$LIBPREFIX" ]; then
+ echo "Cannot find the directory containing the libraires: $LIBPREFIX" >&2
+ exit 1
+fi
+
+for binary in wireshark $binary_list ; do
+ if [ ! -x "$binary_path/$binary" ]; then
+ echo "Couldn't find $binary (or it's not executable)" >&2
+ exit 1
+ fi
+done
+
+if [ ! -f "$plist" ]; then
+ echo "Need plist file" >&2
+ exit 1
+fi
+
+
+# Handle some version specific details.
+VERSION=`/usr/bin/sw_vers | grep ProductVersion | cut -f2 -d'.'`
+if [ "$VERSION" -ge "4" ]; then
+ # We're on Tiger (10.4) or later.
+ # XCode behaves a little differently in Tiger and later.
+ XCODEFLAGS="-configuration Deployment"
+ SCRIPTEXECDIR="ScriptExec/build/Deployment/ScriptExec.app/Contents/MacOS"
+ EXTRALIBS=""
+else
+ # Panther (10.3) or earlier.
+ XCODEFLAGS="-buildstyle Deployment"
+ SCRIPTEXECDIR="ScriptExec/build/ScriptExec.app/Contents/MacOS"
+ EXTRALIBS=""
+fi
+
+
+# Package always has the same name. Version information is stored in
+# the Info.plist file which is filled in by the configure script.
+package="Wireshark.app"
+
+# Remove a previously existing package if necessary
+if [ -d $package ]; then
+ echo "Removing previous Wireshark.app"
+ rm -Rf $package
+fi
+
+# Remove a previously existing utility directory if necessary
+if [ -d "$util_dir" ]; then
+ echo "Removing $util_dir directory"
+ rm -Rf "$util_dir"
+fi
+
+# Set the 'macosx' directory, usually the current directory.
+resdir=`pwd`
+
+
+# Prepare Package
+#----------------------------------------------------------
+pkgexec="$package/Contents/MacOS"
+pkgres="$package/Contents/Resources"
+pkgbin="$pkgres/bin"
+pkglib="$pkgres/lib"
+pkgplugin="$pkglib/wireshark/plugins"
+
+mkdir -p "$pkgexec"
+mkdir -p "$pkgbin"
+mkdir -p "$pkgplugin"
+
+mkdir -p "$cli_dir"
+mkdir -p "$startup_dir"
+
+# Build and add the launcher
+#----------------------------------------------------------
+(
+ # Build fails if CC happens to be set (to anything other than CompileC)
+ unset CC
+
+ cd "$resdir/ScriptExec"
+ echo -e "\033[1mBuilding launcher...\033[0m\n"
+ xcodebuild $XCODEFLAGS clean build
+)
+cp "$resdir/$SCRIPTEXECDIR/ScriptExec" "$pkgexec/Wireshark"
+
+
+# Copy all files into the bundle
+#----------------------------------------------------------
+echo -e "\n\033[1mFilling app bundle and utility directory...\033[0m\n"
+
+# Wireshark executables
+for binary in $binary_list ; do
+ # Copy the binary to its destination
+ dest_path="$pkgbin/$binary-bin"
+ cp -v "$binary_path/$binary" "$dest_path"
+ # TODO Add a "$verbose" variable and command line switch, which sets wether these commands are verbose or not
+
+ case $binary in
+ wireshark)
+ cp -v utility-launcher "$cli_dir/$binary"
+ ;;
+ *)
+ ln -sv ./wireshark "$pkgbin/$binary"
+ ln -sv ./wireshark "$cli_dir/$binary"
+ ;;
+ esac
+done
+
+# ChmodBPF
+cp -v ChmodBPF/* "$startup_dir"
+
+# The rest of the Wireshark installation (we handled bin above)
+rsync -av \
+ --exclude bin/ \
+ --exclude lib/wireshark/plugins/ \
+ "$binary_path/.."/* "$pkgres"
+
+# Remove the version number from the plugin path
+find "$binary_path/../lib/wireshark/plugins" -type f \
+ -exec cp -fv "{}" "$pkgplugin/" \;
+
+cp "$plist" "$package/Contents/Info.plist"
+
+# Icons and the rest of the script framework
+rsync -av --exclude ".svn" "$resdir"/Resources/* "$package"/Contents/Resources/
+
+# PkgInfo must match bundle type and creator code from Info.plist
+echo "APPLWshk" > $package/Contents/PkgInfo
+
+# Pull in extra requirements for Pango and GTK
+pkgetc="$package/Contents/Resources/etc"
+mkdir -p $pkgetc/pango
+cp $LIBPREFIX/etc/pango/pangox.aliases $pkgetc/pango/
+# Need to adjust path and quote in case of spaces in path.
+sed -e "s,$LIBPREFIX,\"\${CWD},g" -e 's,\.so ,.so" ,g' $LIBPREFIX/etc/pango/pango.modules > $pkgetc/pango/pango.modules
+cat > $pkgetc/pango/pangorc <<END_PANGO
+[Pango]
+ModuleFiles=\${HOME}/.wireshark-etc/pango.modules
+[PangoX]
+AliasFiles=\${HOME}/.wireshark-etc/pangox.aliases
+END_PANGO
+
+# We use a modified fonts.conf file so only need the dtd
+mkdir -p $pkgetc/fonts
+cp $LIBPREFIX/etc/fonts/fonts.dtd $pkgetc/fonts/
+cp -r $LIBPREFIX/etc/fonts/conf.avail $pkgetc/fonts/
+cp -r $LIBPREFIX/etc/fonts/conf.d $pkgetc/fonts/
+
+mkdir -p $pkgetc/gtk-2.0
+sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/etc/gtk-2.0/gdk-pixbuf.loaders > $pkgetc/gtk-2.0/gdk-pixbuf.loaders
+sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/etc/gtk-2.0/gtk.immodules > $pkgetc/gtk-2.0/gtk.immodules
+
+for item in gnome-vfs-mime-magic gnome-vfs-2.0
+do
+ cp -r $LIBPREFIX/etc/$item $pkgetc/
+done
+
+pango_version=`pkg-config --variable=pango_module_version pango`
+mkdir -p $pkglib/pango/$pango_version/modules
+cp $LIBPREFIX/lib/pango/$pango_version/modules/*.so $pkglib/pango/$pango_version/modules/
+
+gtk_version=`pkg-config --variable=gtk_binary_version gtk+-2.0`
+mkdir -p $pkglib/gtk-2.0/$gtk_version/{engines,immodules,loaders}
+cp -r $LIBPREFIX/lib/gtk-2.0/$gtk_version/* $pkglib/gtk-2.0/$gtk_version/
+
+mkdir -p $pkglib/gnome-vfs-2.0/modules
+cp $LIBPREFIX/lib/gnome-vfs-2.0/modules/*.so $pkglib/gnome-vfs-2.0/modules/
+
+# Find out libs we need from fink, darwinports, or from a custom install
+# (i.e. $LIBPREFIX), then loop until no changes.
+a=1
+nfiles=0
+endl=true
+lib_dep_search_list="
+ $pkglib/gtk-2.0/$gtk_version/loaders/*
+ $pkglib/gtk-2.0/$gtk_version/immodules/*
+ $pkglib/gtk-2.0/$gtk_version/engines/*.so
+ $pkglib/pango/$pango_version/modules/*
+ $pkglib/gnome-vfs-2.0/modules/*
+ $package/Contents/Resources/lib/*
+ $pkgbin/*-bin
+ "
+while $endl; do
+ echo -e "\033[1mLooking for dependencies.\033[0m Round" $a
+ libs="`otool -L $lib_dep_search_list 2>/dev/null | fgrep compatibility | cut -d\( -f1 | grep $LIBPREFIX | sort | uniq`"
+ cp -f $libs "$pkglib"
+ let "a+=1"
+ nnfiles=`ls "$pkglib" | wc -l`
+ if [ $nnfiles = $nfiles ]; then
+ endl=false
+ else
+ nfiles=$nnfiles
+ fi
+done
+
+# Add extra libraries of necessary
+for libfile in $EXTRALIBS
+do
+ cp -f $libfile "$pkglib"
+done
+
+# Strip libraries and executables if requested
+#----------------------------------------------------------
+if [ "$strip" = "true" ]; then
+ echo -e "\n\033[1mStripping debugging symbols...\033[0m\n"
+ chmod +w "$pkglib"/*.dylib
+ strip -x "$pkglib"/*.dylib
+ 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.
+#
+# fixlib () {
+# # Fix a given executable or library to be relocatable
+# if [ ! -d "$1" ]; then
+# echo $1
+# libs="`otool -L $1 | 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=@executable_path/../lib/$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=@executable_path/../lib/$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/MacOS/bin"
+# for file in *; do
+# fixlib "$file"
+# done
+# cd ../lib
+# for file in *; do
+# fixlib "$file"
+# done)
+
+exit 0