Marble/MacPackaging: Difference between revisions

    From KDE TechBase
    (moved from Projects/Marble)
     
    (→‎Qt-Only: update script for 0.8)
    Line 13: Line 13:


    <code bash>
    <code bash>
    VERSION=0.7.1
    VERSION=0.8
    APPNAME=Marble
    APPNAME=Marble
     
    VOLNAME=${APPNAME}-${VERSION}
    VOLNAME=${APPNAME}-${VERSION}
    DMGNAME=${VOLNAME}Uncompressed.dmg
    DMGNAME=${VOLNAME}Uncompressed.dmg
    COMPRESSEDDMGNAME=${VOLNAME}.dmg
    COMPRESSEDDMGNAME=${VOLNAME}.dmg
     
    function deploy_file() {
    function deploy_file() {
    for n in $(otool -L $1 | grep Qt); do
    for n in $(otool -L $1 | grep -E \(Qt\|phonon\)); do
    path=`echo $n | grep Qt`
    path=`echo $n | grep -E \(Qt\|phonon\)`
        if [ $path ] ; then
        if [ $path ] ; then
        name=$(basename $path)
        name=$(basename $path)
    Line 28: Line 28:
    fi
    fi
    done
    done
     
    for framework in $FRAMEWORKS ; do
    for framework in $FRAMEWORKS ; do
    install_name_tool -change \
    install_name_tool -change \
    Line 36: Line 36:
    done
    done
    }
    }
     
    function deploy_plugins() {
    function deploy_plugins() {
    for plugin in $1/Contents/Resources/plugins/*; do
    for plugin in $1/Contents/Resources/plugins/*; do
    Line 42: Line 42:
    done
    done
    }
    }
     
    function set_bundle_display_options() {
    function set_bundle_display_options() {
    osascript <<-EOF
    osascript <<-EOF
    Line 70: Line 70:
         end tell
         end tell
    EOF
    EOF
     
    }
    }
     
    function create_symlinks() {
    function create_symlinks() {
    cd "$1/Contents/Resources"
    cd "$1/Contents/Resources"
    Line 79: Line 79:
    cd -
    cd -
    }
    }
     
     
     
     
    rm ~/Desktop/${DMGNAME}
    rm ~/Desktop/${DMGNAME}
    rm ~/Desktop/${COMPRESSEDDMGNAME}
    rm ~/Desktop/${COMPRESSEDDMGNAME}
    hdiutil create -size 150m -fs HFS+ -volname ${VOLNAME} ~/Desktop/${DMGNAME}
    hdiutil create -size 250m -fs HFS+ -volname ${VOLNAME} ~/Desktop/${DMGNAME}
     
    # Mount the disk image
    # Mount the disk image
    hdiutil attach ~/Desktop/${DMGNAME}
    hdiutil attach ~/Desktop/${DMGNAME}
     
    # Obtain device information
    # Obtain device information
    DEVS=$(hdiutil attach ~/Desktop/${DMGNAME} | cut -f 1)
    DEVS=$(hdiutil attach ~/Desktop/${DMGNAME} | cut -f 1)
    DEV=$(echo $DEVS | cut -f 1 -d ' ')
    DEV=$(echo $DEVS | cut -f 1 -d ' ')
    VOLUME=$(mount |grep ${DEV} | cut -f 3 -d ' ')
    VOLUME=$(mount |grep ${DEV} | cut -f 3 -d ' ')
     
    # copy in the application bundle
    # copy in the application bundle
    cp -Rp /Applications/${APPNAME}.app ${VOLUME}/${APPNAME}.app
    cp -Rp /Applications/${APPNAME}.app ${VOLUME}/${APPNAME}.app
     
    # fix the libs
    # fix the libs
    macdeployqt ${VOLUME}/${APPNAME}.app
    macdeployqt ${VOLUME}/${APPNAME}.app
    create_symlinks ${VOLUME}/${APPNAME}.app
    create_symlinks ${VOLUME}/${APPNAME}.app
    deploy_file "${VOLUME}/${APPNAME}.app/Contents/MacOS/lib/libmarblewidget.7.dylib"
    deploy_file "${VOLUME}/${APPNAME}.app/Contents/MacOS/lib/libmarblewidget.8.dylib"
    deploy_plugins ${VOLUME}/${APPNAME}.app
    deploy_plugins ${VOLUME}/${APPNAME}.app
     
    # copy in background image
    # copy in background image
    mkdir -p ${VOLUME}/Pictures
    mkdir -p ${VOLUME}/Pictures
    Line 112: Line 112:
    set_bundle_display_options ${VOLUME}
    set_bundle_display_options ${VOLUME}
    mv ${VOLUME}/Pictures ${VOLUME}/.Pictures
    mv ${VOLUME}/Pictures ${VOLUME}/.Pictures
     
    # Unmount the disk image
    # Unmount the disk image
    hdiutil detach $DEV
    hdiutil detach $DEV
    Line 118: Line 118:
    # Convert the disk image to read-only
    # Convert the disk image to read-only
    hdiutil convert ~/Desktop/${DMGNAME} -format UDBZ -o ~/Desktop/${COMPRESSEDDMGNAME}
    hdiutil convert ~/Desktop/${DMGNAME} -format UDBZ -o ~/Desktop/${COMPRESSEDDMGNAME}
    </code>
    </code>



    Revision as of 19:18, 29 July 2009

    Packaging Marble

    Here is some advice about how packaging is supposed to happen on the mac platform.

    Qt-Only

    Configure Marble with:

    cmake -DCMAKE_BUILD_TYPE=release -DQTONLY=ON -DCMAKE_INSTALL_PREFIX=/Applications/ ../marble
    

    To generate a Diskimage (.dmg) one can use this script (based on parts by Tim Sutton, thanks!):

    VERSION=0.8 APPNAME=Marble

    VOLNAME=${APPNAME}-${VERSION} DMGNAME=${VOLNAME}Uncompressed.dmg COMPRESSEDDMGNAME=${VOLNAME}.dmg

    function deploy_file() { for n in $(otool -L $1 | grep -E \(Qt\|phonon\)); do path=`echo $n | grep -E \(Qt\|phonon\)` if [ $path ] ; then name=$(basename $path) FRAMEWORKS="$FRAMEWORKS $name" fi done

    for framework in $FRAMEWORKS ; do install_name_tool -change \ $framework.framework/Versions/4/$framework \ @executable_path/../Frameworks/$framework.framework/Versions/4/$framework \ $1 done }

    function deploy_plugins() { for plugin in $1/Contents/Resources/plugins/*; do deploy_file $plugin done }

    function set_bundle_display_options() { osascript <<-EOF

       tell application "Finder"
           set f to POSIX file ("${1}" as string) as alias
           tell folder f
               open
               tell container window
                   set toolbar visible to false
                   set statusbar visible to false
                   set current view to icon view
                   delay 1 -- sync
                   set the bounds to {20, 50, 300, 400}
               end tell
               delay 1 -- sync
               set icon size of the icon view options of container window to 64
               set arrangement of the icon view options of container window to not arranged
               set position of item "Marble.app" to {100,150}
               set position of item "Applications" to {280, 150}
               set background picture of the icon view options of container window to file "background.png" of folder "Pictures"
               set the bounds of the container window to {0, 0, 300, 400}
               update without registering applications
               delay 5 -- sync
               close
           end tell
           delay 5 -- sync
       end tell
    

    EOF

    }

    function create_symlinks() { cd "$1/Contents/Resources" ln -s "../MacOS/resources/data/" "data" ln -s "../MacOS/resources/plugins/" "plugins" cd - }



    rm ~/Desktop/${DMGNAME} rm ~/Desktop/${COMPRESSEDDMGNAME} hdiutil create -size 250m -fs HFS+ -volname ${VOLNAME} ~/Desktop/${DMGNAME}

    1. Mount the disk image

    hdiutil attach ~/Desktop/${DMGNAME}

    1. Obtain device information

    DEVS=$(hdiutil attach ~/Desktop/${DMGNAME} | cut -f 1) DEV=$(echo $DEVS | cut -f 1 -d ' ') VOLUME=$(mount |grep ${DEV} | cut -f 3 -d ' ')

    1. copy in the application bundle

    cp -Rp /Applications/${APPNAME}.app ${VOLUME}/${APPNAME}.app

    1. fix the libs

    macdeployqt ${VOLUME}/${APPNAME}.app create_symlinks ${VOLUME}/${APPNAME}.app deploy_file "${VOLUME}/${APPNAME}.app/Contents/MacOS/lib/libmarblewidget.8.dylib" deploy_plugins ${VOLUME}/${APPNAME}.app

    1. copy in background image

    mkdir -p ${VOLUME}/Pictures

    1. fixme: path

    cp ~/Desktop/marble-dmg-background.png ${VOLUME}/Pictures/background.png

    1. symlink applications

    ln -s /Applications/ ${VOLUME}/Applications set_bundle_display_options ${VOLUME} mv ${VOLUME}/Pictures ${VOLUME}/.Pictures

    1. Unmount the disk image

    hdiutil detach $DEV

    1. Convert the disk image to read-only

    hdiutil convert ~/Desktop/${DMGNAME} -format UDBZ -o ~/Desktop/${COMPRESSEDDMGNAME}


    It uses the macdeployqt tool which copies Qt and its plugins into the App Bundle. macdeployqt also tells the main application to link against the libs contained in the bundle, instead of the system libs. This does not happen to the libmarblewidget and the Marble plugins, so it has to be done by the script. The script also sets a background Image for the dmg. (Place it at ~/Desktop/marble-dmg-background.png or change the path in the script)

    After that you should have Marble-version.dmg on you Desktop.