Marble/MacPackaging: Difference between revisions
(moved from Projects/Marble) |
(→Qt-Only: update script for 0.8) |
||
Line 13: | Line 13: | ||
<code bash> | <code bash> | ||
VERSION=0. | 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 | 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. | 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}
- 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}
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.