diff options
-rw-r--r-- | CMakeLists.txt | 37 | ||||
-rw-r--r-- | Makefile.am | 4 | ||||
-rwxr-xr-x | packaging/macosx/osx-app.sh | 415 |
3 files changed, 259 insertions, 197 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 982103da9d..a6e4618039 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1119,6 +1119,38 @@ if( (BUILD_wireshark AND QT_FOUND) OR (BUILD_wireshark_gtk AND GTK_FOUND) ) endif() if(ENABLE_APPLICATION_BUNDLE) + # + # Add -Wl,-single_module to the LDFLAGS used with shared + # libraries, to fix some error that show up in some cases; + # some Apple documentation recommends it for most shared + # libraries. + # + set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-single_module ${CMAKE_SHARED_LINKER_FLAGS}" ) + # + # Add -Wl,-headerpad_max_install_names to the LDFLAGS, as + # code-signing issues is running out of padding space. + # + # Add -Wl,-search_paths_first to make sure that if we search + # directories A and B, in that order, for a given library, a + # non-shared version in directory A, rather than a shared + # version in directory B, is chosen (so we can use + # --with-pcap=/usr/local to force all programs to be linked + # with a static version installed in /usr/local/lib rather than + # the system version in /usr/lib). + # + # 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. + # + + set(CMAKE_EXE_LINKER_FLAGS + "-Wl,-headerpad_max_install_names -Wl,-search_paths_first -Wl,-rpath,@executable_path/../lib -Wl,-rpath,@executable_path/../Frameworks -Wl,-rpath,/usr/local/lib ${CMAKE_EXE_LINKER_FLAGS}" + ) + + # Add files to the app bundle # Wireshark.app/Contents set(BUNDLE_CONTENTS_FILES ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo @@ -1618,6 +1650,11 @@ ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo COMMAND ${CMAKE_COMMAND} -E echo APPLWshk > ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo ) + +ADD_CUSTOM_TARGET(osx-app + COMMAND ${CMAKE_SOURCE_DIR}/packaging/macosx/osx-app.sh + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/run +) endif() pod2manhtml( ${CMAKE_SOURCE_DIR}/doc/capinfos 1 ) diff --git a/Makefile.am b/Makefile.am index 0e81c68232..0fc8f95cff 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1346,7 +1346,9 @@ osx-app: $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) packaging/macosx/Info.plist rm -rf $(stagedir) ; \ $(MAKE) DESTDIR=$(stagedir) install; \ cd $(srcdir)/packaging/macosx ; \ - ./osx-app.sh @OSX_APP_FLAGS@ -bp ../staging/$(PACKAGE).inst$(bindir) ; \ + ./osx-app.sh @OSX_APP_FLAGS@ \ + --create-bundle \ + --binary-path ../staging/$(PACKAGE).inst$(bindir) ; \ else \ echo "Error: OS X packaging tools not found." ; \ echo "Package build abandoned." ; \ diff --git a/packaging/macosx/osx-app.sh b/packaging/macosx/osx-app.sh index 3b67ac09c4..8c4bd79612 100755 --- a/packaging/macosx/osx-app.sh +++ b/packaging/macosx/osx-app.sh @@ -38,7 +38,11 @@ strip=false binary_path="/tmp/inst/bin" plist="./Info.plist" exclude_prefixes="/System/|/Library/|/usr/lib/|/usr/X11/|/opt/X11/|@rpath|@executable_path" +create_bundle=false +# Bundle always has the same name. Version information is stored in +# the Info.plist file which is filled in by the configure script. +bundle="Wireshark.app" # "qt" or "gtk" ui_toolkit="qt" @@ -78,22 +82,26 @@ USAGE OPTIONS -h,--help - display this help message + Display this help message. -s - strip the libraries and executables from debugging symbols + Strip the libraries and executables from debugging symbols. -l,--libraries - specify the path to the libraries Wireshark depends on - (typically /sw or /opt/local). By default it is + Specify the path to the libraries Wireshark depends on + (typically /sw or /opt/local). By default it is /usr/local. + -cb,--create-bundle + Create the application bundle (Wireshark.app). This flag + should be supplied when building using Autotools. It + should not be specified when building using CMake. -bp,--binary-path - specify the path to the Wireshark binaries. By default it + Specify the path to the Wireshark binaries. By default it is /tmp/inst/bin. -p,--plist - specify the path to Info.plist. Info.plist can be found + Specify the path to Info.plist. Info.plist can be found in the base directory of the source code once configure has been run. -sdkroot - specify the root of the SDK to use + Specify the root of the SDK to use. -qt,--qt-flavor Use the Qt flavor. This is the default. -gtk,--gtk-flavor @@ -118,6 +126,8 @@ do -bp|--binary-path) binary_path="$2" shift 1 ;; + -cb|--create-bundle) + create_bundle=true;; -p|--plist) plist="$2" shift 1 ;; @@ -150,235 +160,248 @@ if [ ! -e "$LIBPREFIX" ]; then exit 1 fi -for binary in $wireshark_bin_name $binary_list ; do - if [ ! -x "$binary_path/$binary" ]; then - echo "Couldn't find $binary (or it's not executable)" >&2 +if [ "$create_bundle" = "true" ]; then + for binary in $wireshark_bin_name $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 -done - -if [ ! -f "$plist" ]; then - echo "Need plist file" >&2 +elif [ ! -d "$bundle" ] ; then + echo "$bundle not found" >&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 - -# Set the SDK root, if an SDK was specified. -# (-sdk is only supported by the xcodebuild in the version of the -# developer tools that came with Snow Leopard and later versions) -if [ ! -z "$sdkroot" ] -then - XCODEFLAGS="$XCODEFLAGS SDKROOT=$sdkroot" -fi - -# Bundle always has the same name. Version information is stored in -# the Info.plist file which is filled in by the configure script. -bundle="Wireshark.app" - -# Remove a previously existing bundle if necessary -if [ -d $bundle ]; then - echo "Removing previous $bundle" - rm -Rf $bundle -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 -#---------------------------------------------------------- +# Package paths pkgexec="$bundle/Contents/MacOS" pkgres="$bundle/Contents/Resources" pkgbin="$pkgexec" pkglib="$bundle/Contents/Frameworks" pkgplugin="$bundle/Contents/PlugIns/wireshark" -# -# For Qt, the Wireshark binary is the main binary of the app bundle. -# For GTK+, the Wireshark binary is wireshark-bin in -# Contents/Resources/bin, so some of the above setting have to change. -# -if [ "$ui_toolkit" = "gtk" ] ; then - pkgbin="$pkgres/bin" - pkglib="$pkgres/lib" -fi +# Set the 'macosx' directory, usually the current directory. +resdir=`pwd` -mkdir -p "$pkgexec" -mkdir -p "$pkgbin" -mkdir -p "$pkgplugin" +# Create the application bundle. +# This is only used by Autotools. This can be removed if we start using +# CMake exclusively. +create_bundle() { + # 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 -if [ "$ui_toolkit" = "qt" ] ; then - cp -v "$binary_path/$wireshark_bin_name" "$pkgexec/Wireshark" -else -# Build and add the launcher -#---------------------------------------------------------- - ( - # Build fails if CC happens to be set (to anything other than CompileC) - unset CC + # Set the SDK root, if an SDK was specified. + # (-sdk is only supported by the xcodebuild in the version of the + # developer tools that came with Snow Leopard and later versions) + if [ ! -z "$sdkroot" ] + then + XCODEFLAGS="$XCODEFLAGS SDKROOT=$sdkroot" + fi - cd "$resdir/ScriptExec" - echo -e "Building launcher...\n" - xcodebuild $XCODEFLAGS clean build - ) - cp "$resdir/$SCRIPTEXECDIR/ScriptExec" "$pkgexec/Wireshark" + # Remove a previously existing bundle if necessary + if [ -d $bundle ]; then + echo "Removing previous $bundle" + rm -Rf $bundle + fi -fi + # Remove a previously existing utility directory if necessary + if [ -d "$util_dir" ]; then + echo "Removing $util_dir directory" + rm -Rf "$util_dir" + fi -# Copy all files into the bundle -#---------------------------------------------------------- -echo -e "\nFilling app bundle and utility directory...\n" + # Prepare Package + #---------------------------------------------------------- -# Wireshark executables -if [ "$ui_toolkit" = "gtk" ] ; then - for binary in $binary_list wireshark ; do - # Copy the binary to its destination - dest_path="$pkgbin/$binary-bin" - cs_binary_list="$cs_binary_list $dest_path" - 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 - - if [ "$binary" != "wireshark" ] ; then - ln -sv ./wireshark "$pkgbin/$binary" - fi - done -elif [ "$ui_toolkit" = "qt" ] ; then - for binary in $binary_list ; do - # Copy the binary to its destination - cp -v "$binary_path/$binary" "$pkgexec" - cs_binary_list="$cs_binary_list $pkgexec/$binary" - done -fi + # + # For Qt, the Wireshark binary is the main binary of the app bundle. + # For GTK+, the Wireshark binary is wireshark-bin in + # Contents/Resources/bin, so some of the above setting have to change. + # + if [ "$ui_toolkit" = "gtk" ] ; then + pkgbin="$pkgres/bin" + pkglib="$pkgres/lib" + fi -# The rest of the Wireshark installation (we handled bin above) -rsync -av \ - --exclude bin/ \ - --exclude lib/ \ - "$binary_path/.."/* "$pkgres" + mkdir -p "$pkgexec" + mkdir -p "$pkgbin" + mkdir -p "$pkgplugin" -rsync -av $binary_path/../lib/*.dylib "$pkglib/" + if [ "$ui_toolkit" = "qt" ] ; then + cp -v "$binary_path/$wireshark_bin_name" "$pkgexec/Wireshark" + else + # 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 "Building launcher...\n" + xcodebuild $XCODEFLAGS clean build + ) + cp "$resdir/$SCRIPTEXECDIR/ScriptExec" "$pkgexec/Wireshark" -# Copy the plugins from the "make install" location for them -# to the plugin directory, removing the version number -find "$binary_path/../lib/wireshark/plugins" -type f \ - -exec cp -fv "{}" "$pkgplugin/" \; + fi -cp "$plist" "$bundle/Contents/Info.plist" + # Copy all files into the bundle + #---------------------------------------------------------- + echo -e "\nFilling app bundle and utility directory...\n" -# Icons and the rest of the script framework -res_list=" - Wireshark.icns - Wiresharkdoc.icns -" + # Wireshark executables + if [ "$ui_toolkit" = "gtk" ] ; then + for binary in $binary_list wireshark ; do + # Copy the binary to its destination + dest_path="$pkgbin/$binary-bin" + cs_binary_list="$cs_binary_list $dest_path" + 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 + + if [ "$binary" != "wireshark" ] ; then + ln -sv ./wireshark "$pkgbin/$binary" + fi + done + elif [ "$ui_toolkit" = "qt" ] ; then + for binary in $binary_list ; do + # Copy the binary to its destination + cp -v "$binary_path/$binary" "$pkgexec" + cs_binary_list="$cs_binary_list $pkgexec/$binary" + done + fi -if [ "$ui_toolkit" = "gtk" ] ; then + # The rest of the Wireshark installation (we handled bin above) + rsync -av \ + --exclude bin/ \ + --exclude lib/ \ + "$binary_path/.."/* "$pkgres" + + rsync -av $binary_path/../lib/*.dylib "$pkglib/" + + # Copy the plugins from the "make install" location for them + # to the plugin directory, removing the version number + find "$binary_path/../lib/wireshark/plugins" -type f \ + -exec cp -fv "{}" "$pkgplugin/" \; + + cp "$plist" "$bundle/Contents/Info.plist" + + # Icons and the rest of the script framework res_list=" - $res_list - bin - etc - openDoc - script - MenuBar.nib - ProgressWindow.nib - themes + Wireshark.icns + Wiresharkdoc.icns " -fi -for rl_entry in $res_list ; do - rsync -av "$resdir"/Resources/$rl_entry "$bundle"/Contents/Resources/ -done + if [ "$ui_toolkit" = "gtk" ] ; then + res_list=" + $res_list + bin + etc + openDoc + script + MenuBar.nib + ProgressWindow.nib + themes + " + fi -# PkgInfo must match bundle type and creator code from Info.plist -echo "APPLWshk" > $bundle/Contents/PkgInfo + for rl_entry in $res_list ; do + rsync -av "$resdir"/Resources/$rl_entry "$bundle"/Contents/Resources/ + done -if [ "$ui_toolkit" = "gtk" ] ; then + # PkgInfo must match bundle type and creator code from Info.plist + echo "APPLWshk" > $bundle/Contents/PkgInfo - # Pull in extra requirements for Pango and GTK - pkgetc="$bundle/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 + if [ "$ui_toolkit" = "gtk" ] ; then + echo -e "\nPulling in GTK+ libraries and resources...\n" + + # Pull in extra requirements for Pango and GTK + pkgetc="$bundle/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 - # - # In newer versions of GTK+, the gdk-pixbuf library was split off from - # GTK+, and the gdk-pixbuf.loaders file moved, so we check for its - # existence here. - # - # The file is ultimately copied to the user's home directory, with - # the pathnames adjusted to refer to the installed bundle, so we - # always put it in the same location in the installed bundle, - # regardless of where it lives in the machine on which it's built. - # - if [ -e $LIBPREFIX/etc/gtk-2.0/gdk-pixbuf.loaders ] - then - sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/etc/gtk-2.0/gdk-pixbuf.loaders > $pkgetc/gtk-2.0/gdk-pixbuf.loaders - fi - sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/etc/gtk-2.0/gtk.immodules > $pkgetc/gtk-2.0/gtk.immodules - - 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/ + # 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/ - gdk_pixbuf_version=`pkg-config --variable=gdk_pixbuf_binary_version gdk-pixbuf-2.0` - if [ ! -z $gdk_pixbuf_version ]; then - mkdir -p $pkglib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders + mkdir -p $pkgetc/gtk-2.0 # - # As per the above, check whether we have a loaders.cache file - # in $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version, as - # that's where the output of gdk-pixbuf-query-loaders gets - # put if gdk-pixbuf and GTK+ are separated. + # In newer versions of GTK+, the gdk-pixbuf library was split off from + # GTK+, and the gdk-pixbuf.loaders file moved, so we check for its + # existence here. # - # The file is ultimately copied to the user's home directory, - # with the pathnames adjusted to refer to the installed bundle, - # so we always put it in the same location in the installed - # bundle, regardless of where it lives in the machine on which - # it's built. + # The file is ultimately copied to the user's home directory, with + # the pathnames adjusted to refer to the installed bundle, so we + # always put it in the same location in the installed bundle, + # regardless of where it lives in the machine on which it's built. # - if [ -e $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders.cache ] + if [ -e $LIBPREFIX/etc/gtk-2.0/gdk-pixbuf.loaders ] then - sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders.cache > $pkgetc/gtk-2.0/gdk-pixbuf.loaders + sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/etc/gtk-2.0/gdk-pixbuf.loaders > $pkgetc/gtk-2.0/gdk-pixbuf.loaders fi - cp -r $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders/* $pkglib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders - fi -fi # GTK+ / Qt + sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/etc/gtk-2.0/gtk.immodules > $pkgetc/gtk-2.0/gtk.immodules + + 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/ + + gdk_pixbuf_version=`pkg-config --variable=gdk_pixbuf_binary_version gdk-pixbuf-2.0` + if [ ! -z $gdk_pixbuf_version ]; then + mkdir -p $pkglib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders + # + # As per the above, check whether we have a loaders.cache file + # in $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version, as + # that's where the output of gdk-pixbuf-query-loaders gets + # put if gdk-pixbuf and GTK+ are separated. + # + # The file is ultimately copied to the user's home directory, + # with the pathnames adjusted to refer to the installed bundle, + # so we always put it in the same location in the installed + # bundle, regardless of where it lives in the machine on which + # it's built. + # + if [ -e $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders.cache ] + then + sed -e "s,$LIBPREFIX,\${CWD},g" $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders.cache > $pkgetc/gtk-2.0/gdk-pixbuf.loaders + fi + cp -r $LIBPREFIX/lib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders/* $pkglib/gdk-pixbuf-2.0/$gdk_pixbuf_version/loaders + fi + fi # GTK+ / Qt +} # create_bundle + +if [ "$create_bundle" = "true" ]; then + create_bundle +fi + +echo -e "\nFixing up $bundle...\n" # Find out libs we need from Fink, MacPorts, or from a custom install # (i.e. $LIBPREFIX), then loop until no changes. @@ -428,7 +451,7 @@ done # Add extra libraries of necessary for libfile in $EXTRALIBS do - cp -f $libfile "$pkglib" + cp -v -f $libfile "$pkglib" done chmod 755 "$pkglib"/*.dylib |