Difference between revisions of "Marble/MacPackaging"

Jump to: navigation, search
(update dmg script to latest version)
(Page moved to community wiki)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
== Packaging Marble ==
+
{{ Moved To Community }}
 
+
Here is some advice about how packaging is supposed to happen on the mac platform.
+
 
+
==== Qt-Only ====
+
 
+
Configure Marble with:
+
<pre>
+
cmake -DCMAKE_BUILD_TYPE=release -DQTONLY=ON -DCMAKE_INSTALL_PREFIX=/Applications/ ../marble
+
</pre>
+
 
+
To generate a Diskimage (.dmg) one can use this script (based on parts by Tim Sutton, thanks!):
+
 
+
<syntaxhighlight lang="bash">
+
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}
+
 
+
</syntaxhighlight>
+
 
+
 
+
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.
+

Latest revision as of 04:50, 26 October 2016

This page is now on the community wiki.


This page was last modified on 26 October 2016, at 04:50. Content is available under Creative Commons License SA 4.0 unless otherwise noted.