Marble/MacPackaging: Difference between revisions

    From KDE TechBase
    (update to new syntaxhighlighter)
    (update dmg script to latest version)
    Line 13: Line 13:


    <syntaxhighlight lang="bash">
    <syntaxhighlight lang="bash">
    VERSION=0.8
    VERSION=1.3.0
    APPNAME=Marble
    APPNAME=Marble
       
       
    Line 21: Line 21:
       
       
    function deploy_file() {
    function deploy_file() {
    LOCAL_LIB_PATH=/usr/local/Cellar/qt/4.8.0/lib
    for n in $(otool -L $1 | grep -E \(Qt\|phonon\)); do
    for n in $(otool -L $1 | grep -E \(Qt\|phonon\)); do
    path=`echo $n | grep -E \(Qt\|phonon\)`
    path=`echo $n | grep -E \(Qt\|phonon\)`
    Line 31: Line 32:
    for framework in $FRAMEWORKS ; do
    for framework in $FRAMEWORKS ; do
    install_name_tool -change \
    install_name_tool -change \
    $framework.framework/Versions/4/$framework \
    $LOCAL_LIB_PATH/$framework.framework/Versions/4/$framework \
    @executable_path/../Frameworks/$framework.framework/Versions/4/$framework \
    @executable_path/../Frameworks/$framework.framework/Versions/4/$framework \
    $1
    $1
    Line 38: Line 39:
       
       
    function deploy_plugins() {
    function deploy_plugins() {
    for plugin in $1/Contents/Resources/plugins/*; do
    find $1/Contents/MacOS/resources/plugins -iname *.so | while read plugin; do
    deploy_file $plugin
    deploy_file $plugin
    done
    done
    Line 59: Line 60:
                 set icon size of the icon view options of container window to 64
                 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 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 {100,150}
                 set position of item "Applications" to {280, 150}
                 set position of item "Marble.app" to {280, 150}
                 set background picture of the icon view options of container window to file "background.png" of folder "Pictures"
                 set background picture of the icon view options of container window to file "background.jpg" of folder "Pictures"
                 set the bounds of the container window to {0, 0, 300, 400}
                 set the bounds of the container window to {0, 0, 300, 400}
                 update without registering applications
                 update without registering applications
    Line 101: Line 102:
    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.8.dylib"
    deploy_file "${VOLUME}/${APPNAME}.app/Contents/MacOS/lib/libmarblewidget.13.dylib"
    deploy_plugins ${VOLUME}/${APPNAME}.app
    deploy_plugins ${VOLUME}/${APPNAME}.app
     
    # copy the translations
    cp -r marble/tools/translations/lang ${VOLUME}/${APPNAME}.app/Contents/MacOS/resources/data
     
    # copy in background image
    # copy in background image
    mkdir -p ${VOLUME}/Pictures
    mkdir -p ${VOLUME}/Pictures
    # fixme: path
    cp marble/install_mac/marble_mac.jpg ${VOLUME}/Pictures/background.jpg
    cp ~/Desktop/marble-dmg-background.png ${VOLUME}/Pictures/background.png
    # symlink applications
    # symlink applications
    ln -s /Applications/ ${VOLUME}/Applications
    ln -s /Applications/ ${VOLUME}/Applications

    Revision as of 17:41, 19 January 2013

    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=1.3.0
    APPNAME=Marble
     
    VOLNAME=${APPNAME}-${VERSION}
    DMGNAME=${VOLNAME}Uncompressed.dmg
    COMPRESSEDDMGNAME=${VOLNAME}.dmg
     
    function deploy_file() {
    	LOCAL_LIB_PATH=/usr/local/Cellar/qt/4.8.0/lib
    	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 \
    			$LOCAL_LIB_PATH/$framework.framework/Versions/4/$framework \
    			@executable_path/../Frameworks/$framework.framework/Versions/4/$framework \
    			$1
    	done
    }
     
    function deploy_plugins() {
    	find $1/Contents/MacOS/resources/plugins -iname *.so | while read plugin; 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 "Applications" to {100,150}
                set position of item "Marble.app" to {280, 150}
                set background picture of the icon view options of container window to file "background.jpg" 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}
     
    # Mount the disk image
    hdiutil attach ~/Desktop/${DMGNAME}
     
    # 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 ' ')
     
    # copy in the application bundle
    cp -Rp /Applications/${APPNAME}.app ${VOLUME}/${APPNAME}.app
     
    # fix the libs
    macdeployqt ${VOLUME}/${APPNAME}.app
    create_symlinks ${VOLUME}/${APPNAME}.app
    deploy_file "${VOLUME}/${APPNAME}.app/Contents/MacOS/lib/libmarblewidget.13.dylib"
    deploy_plugins ${VOLUME}/${APPNAME}.app
    
    # copy the translations
    cp -r marble/tools/translations/lang ${VOLUME}/${APPNAME}.app/Contents/MacOS/resources/data
    
    # copy in background image
    mkdir -p ${VOLUME}/Pictures
    cp marble/install_mac/marble_mac.jpg ${VOLUME}/Pictures/background.jpg
    # symlink applications
    ln -s /Applications/ ${VOLUME}/Applications
    set_bundle_display_options ${VOLUME}
    mv ${VOLUME}/Pictures ${VOLUME}/.Pictures
     
    # Unmount the disk image
    hdiutil detach $DEV
     
    # 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.