diff options
author | Gerald Combs <gerald@wireshark.org> | 2008-03-15 18:31:52 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2008-03-15 18:31:52 +0000 |
commit | 46bcad885a7a0c8e7d9b0009b0e231cb3c3677e9 (patch) | |
tree | da6234e8eb1c99e0c4c0bc9f7dbfa6eb303f12fe /packaging/macosx/osx-app.sh | |
parent | dca49accfae6990c6a1dcef28c09104adc82828d (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-x | packaging/macosx/osx-app.sh | 372 |
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 |