Difference between revisions of "Marble/MacPackaging"

(update to new syntaxhighlighter)
(Page moved to community wiki)
 
(2 intermediate revisions by 2 users 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=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}
 
 
# 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.8.dylib"
 
deploy_plugins ${VOLUME}/${APPNAME}.app
 
 
# copy in background image
 
mkdir -p ${VOLUME}/Pictures
 
# fixme: path
 
cp ~/Desktop/marble-dmg-background.png ${VOLUME}/Pictures/background.png
 
# 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 edited on 26 October 2016, at 04:50. Content is available under Creative Commons License SA 4.0 unless otherwise noted.