3 # script for pulling together a MacOSX app bundle.
5 GTKSTACK_ROOT=$HOME/gtk/inst
6 ARDOURSTACK_ROOT=$HOME/a3/inst
9 # where harvid and xjadeo binaries are cached
10 if test -z "$CACHEDIR" -o ! -d "$CACHEDIR"; then
22 while [ $# -gt 0 ] ; do
27 # top level build targets
34 PRODUCT_PKG_DIR=ArdourSAE ;
42 PRODUCT_PKG_DIR=MixBus;
49 PRODUCT_PKG_DIR=Ardour;
56 PRODUCT_PKG_DIR=Ardour ;
58 --test) SAE= ; WITH_LADSPA=; STRIP= ; shift ;;
61 # specific build flags
64 --noharvid) WITH_HARVID= ; shift ;;
65 --noladspa) WITH_LADSPA= ; shift ;;
66 --nostrip) STRIP= ; shift ;;
67 --sysdeps) PRINT_SYSDEPS=1; shift ;;
68 --nls) WITH_NLS=1 ; shift ;;
72 if test -z "$PRODUCT_PKG_DIR" -o -z "$APPNAME"; then
73 echo "application or product-name was not specified"
77 . ../define_versions.sh
78 echo "Version is $release_version / $revision"
79 info_string="$version built on `hostname` by `whoami` on `date`"
80 echo "Info string is $info_string"
82 # setup directory structure
85 APPROOT=$APPDIR/Contents
86 Frameworks=$APPROOT/lib
87 Resources=$APPROOT/Resources
89 # Since this is OS X, don't try to distinguish between etc and shared
90 # (machine dependent and independent data) - just put everything
95 Locale=$Resources/locale
97 # Bundled Plugins live in a top level folder
99 Plugins=$APPROOT/Plugins
100 Surfaces=$Frameworks/surfaces
101 Panners=$Frameworks/panners
102 Backends=$Frameworks/backends
103 MidiMaps=$Shared/midi_maps
104 ExportFormats=$Shared/export
105 Templates=$Shared/templates
106 PatchFiles=$Shared/patchfiles
107 MackieControl=$Shared/mcp
109 if [ x$PRINT_SYSDEPS != x ] ; then
111 # print system dependencies
114 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Plugins/*.so ; do
115 if ! file $file | grep -qs Mach-O ; then
118 otool -L $file | awk '{print $1}' | egrep -v "(^@executable_path|^Ardour[0-9][.0-9]*.app)"
123 echo "Removing old $APPDIR tree ..."
127 echo "Building new app directory structure ..."
129 # only bother to make the longest paths
131 mkdir -p $APPROOT/MacOS
132 mkdir -p $APPROOT/Resources
138 mkdir -p $ExportFormats
140 mkdir -p $Frameworks/modules
142 mkdir -p $MackieControl
144 # maybe set variables
146 if test x$SAE != x ; then
147 appname="Ardour3/SAE"
148 env="$env<key>ARDOUR_SAE</key><string>true</string>"
150 # current default for SAE version is German keyboard layout without a keypad
152 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>de-nokeypad</string>"
153 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui_sae.conf</string>"
154 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark_sae.rc</string>"
155 elif test x$MIXBUS != x ; then
156 appname="Ardour3/Mixbus"
157 env="$env<key>ARDOUR_MIXBUS</key><string>true</string>"
159 # current default for MIXBUS version is US keyboard layout without a keypad
161 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>us-nokeypad</string>"
162 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui.conf</string>"
163 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark.rc</string>"
169 # if we're not going to bundle JACK, make sure we can find
170 # jack in the places where it might be
173 env="$env<key>PATH</key><string>/usr/local/bin:/opt/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>"
174 env="$env<key>DYLIB_FALLBACK_LIBRARY_PATH</key><string>/usr/local/lib:/opt/lib</string>"
176 env="<key>LSEnvironment</key><dict>$env<key>ARDOUR_BUNDLED</key><string>true</string></dict>"
179 sed -e "s?@ENV@?$env?g" \
180 -e "s?@VERSION@?$release_version/$revision?g" \
181 -e "s?@INFOSTRING@?$info_string?g" < Info.plist.in > Info.plist
183 sed -e "s?@APPNAME@?$appname?" \
184 -e "s?@ENV@?$env?g" \
185 -e "s?@VERSION@?$release_version/$revision?g" \
186 -e "s?@INFOSTRING@?$info_string?g" < InfoPlist.strings.in > Resources/InfoPlist.strings || exit 1
190 cp Info.plist $APPROOT
191 cp -R Resources $APPROOT
194 # if we build a bundle without jack, then
195 # make the Ardour3 executable a helper
196 # script that checks to see if JACK is
200 cp startup_script $APPROOT/MacOS/Ardour3
201 chmod 775 $APPROOT/MacOS/Ardour3
202 MAIN_EXECUTABLE=Ardour3.bin
204 echo "Copying ardour executable ...."
205 cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTABLE
206 if test x$SAE != x ; then
207 # cp $BUILD_ROOT/gtk2_ardour/evtest $APPROOT/MacOS/gtkevents
208 cp Ardour3-SAE.icns $Resources/appIcon.icns
209 elif test x$MIXBUS != x ; then
210 cp Mixbus.icns $Resources/appIcon.icns
212 cp Ardour3.icns $Resources/appIcon.icns
214 cp typeArdour.icns $Resources/
215 if test x$STRIP != x ; then
216 strip $APPROOT/MacOS/Ardour3
220 if test x$WITH_NLS != x ; then
221 echo "NLS support ..."
222 echo "I hope you remembered to run waf i18n"
225 for pkg in gtk2_ardour libs/ardour libs/gtkmm2ext ; do
226 files=`find ../../$pkg -name "*.mo"`
229 # the package name is appended with a number so that
230 # it can be parallel installed during a regular install
231 # with older (and newer) versions. it is just the major
232 # number of the release (i.e. leading digits)
235 vsuffix=`echo $release_version | sed 's/^\([0-9][0-9]*\).*/\1/'`
237 if [ -z "$files" ]; then
239 echo "!!!! WARNING !!!! - Did not find any .mo files in ../../$pkg"
246 lang=`basename $file | sed 's/\.mo//'`
247 mkdir -p $Locale/$lang/LC_MESSAGES
248 cp $file $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
249 echo copy $file to $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
250 if echo $LINGUAS | grep $lang >/dev/null 2>&1 ; then
253 LINGUAS="$LINGUAS $lang"
260 if [ -d $GTKSTACK_ROOT/share/locale/$l ] ; then
261 echo "Copying GTK i18n files for $l..."
262 cp -r $GTKSTACK_ROOT/share/locale/$l $Locale
264 # try with just the language spec
265 just_lang=`echo $l | sed 's/_[A-Z][A-Z]$//'`
266 if [ -d $GTKSTACK_ROOT/share/locale/$just_lang ] ; then
267 echo "Copying GTK i18n files for $l..."
268 cp -r $GTKSTACK_ROOT/share/locale/$just_lang $Locale
273 echo "Skipping NLS support"
277 # Copy stuff that may be dynamically loaded
280 cp -R $GTKSTACK_ROOT/etc/* $Etc
281 echo "Copying all Pango modules ..."
282 cp -R $GTKSTACK_ROOT/lib/pango/1.8.0/modules/*.so $Frameworks/modules
283 echo "Copying all GDK Pixbuf loaders ..."
284 cp -R $GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so $Frameworks/modules
286 cp -R $GTKSTACK_ROOT/lib/charset.alias $Resources
288 # generate new Pango module file
291 ModulesPath=$GTKSTACK_ROOT/lib/pango/1.8.0/modules
293 env PANGO_RC_FILE=pangorc $GTKSTACK_ROOT/bin/pango-querymodules | sed "s?$GTKSTACK_ROOT/lib/pango/1.8.0/modules/?@executable_path/../lib/modules/?" > $Resources/pango.modules
296 # generate a new GDK pixbufs loaders file
297 gdk-pixbuf-query-loaders | sed "s?$GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/?@executable_path/../lib/modules/?" > $Resources/gdk-pixbuf.loaders
299 # We rely on clearlooks, so include a version from our own build tree
300 # this one is special - we will set GTK_PATH to $Frameworks/gtkengines
302 GTK_ENGINE_DIR=$Frameworks/gtkengines/engines
303 mkdir -p $GTK_ENGINE_DIR
305 echo "Copying GTK engines ..."
306 cp $BUILD_ROOT/libs/clearlooks-newer/libclearlooks.dylib $Frameworks
307 (cd $GTK_ENGINE_DIR && ln -s ../../libclearlooks.dylib . && ln -s ../../libclearlooks.dylib libclearlooks.so)
309 cp $GTKSTACK_ROOT/lib/gtk-2.0/2.10.0/engines/libpixmap.so $Frameworks
310 (cd $GTK_ENGINE_DIR && ln -s ../../libpixmap.so)
313 if test x$WITH_LADSPA != x ; then
314 if test x$SAE != x ; then
316 elif test x$MIXBUS != x ; then
317 plugdir=mixbus_ladspa
321 if [ -d $plugdir -a "x$(ls $plugdir)" != x ] ; then
322 echo "Copying `ls $plugdir | wc -l` plugins ..."
323 cp -r $plugdir/* $Plugins
327 # Control Surface shared libraries
328 cp $BUILD_ROOT/libs/surfaces/*/libardour_*.dylib $Surfaces
329 cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks
332 cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
335 cp $BUILD_ROOT/libs/backends/*/lib*.dylib $Backends
337 # Export Formats/Presets
338 for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do
339 cp "$f" $ExportFormats ;
342 # Session and Route templates
343 #for f in $BUILD_ROOT/../templates/* ; do
344 # if [ -d "$f" ] ; then
345 # cp -r "$f" $Templates ;
350 # got to be careful with names here
351 for x in $BUILD_ROOT/../midi_maps/*.map ; do
356 # got to be careful with names here
357 for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
362 # got to be careful with names here
363 for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
364 cp "$x" $MackieControl
367 # VAMP plugins that we use
368 cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.dylib $Frameworks
371 cp $ARDOURSTACK_ROOT/lib/suil-0/lib* $Frameworks
375 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Panners/*.dylib $Backends/*.dylib $Surfaces/*.dylib $Plugins/*.so ; do
376 if ! file $file | grep -qs Mach-O ; then
379 deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | grep -v 'libjack\.'`
381 for dep in $deps ; do
383 if ! test -f $Frameworks/$base; then
384 if echo $dep | grep -sq '^libs' ; then
385 cp $BUILD_ROOT/$dep $Frameworks
393 if test x$missing = xfalse ; then
394 # everything has been found
400 echo "Copying other stuff to $APPDIR ..."
402 #cp $BUILD_ROOT/gtk2_ardour/ergonomic-us.bindings $Resources
404 cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings $Resources
405 cp ../../gtk2_ardour/mixer.bindings $Resources
406 cp ../../gtk2_ardour/step_editing.bindings $Resources
407 cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
409 if test x$SAE != x ; then
410 cp $BUILD_ROOT/gtk2_ardour/SAE-de-keypad.bindings $Resources
411 cp $BUILD_ROOT/gtk2_ardour/SAE-de-nokeypad.bindings $Resources
412 cp $BUILD_ROOT/gtk2_ardour/SAE-us-keypad.bindings $Resources
413 cp $BUILD_ROOT/gtk2_ardour/SAE-us-nokeypad.bindings $Resources
414 cp $BUILD_ROOT/ardour_system_sae.rc $Resources/ardour_system.rc
415 echo cp $BUILD_ROOT/ardour_system_sae.rc $Resources/ardour_system.rc
416 cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
417 echo cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
419 cp ../../ardour_system.rc $Resources/ardour_system.rc
420 cp ../../instant.xml $Resources/instant.xml
421 echo cp ../../instant.xml $Resources/instant.xml
423 cp ../../gtk2_ardour/ardour3_ui_default.conf $Resources
424 cp ../../gtk2_ardour/ardour3_ui_default.conf $Resources/ardour3_ui.conf
425 cp $BUILD_ROOT/gtk2_ardour/ardour3_ui_light.rc $Resources
426 cp $BUILD_ROOT/gtk2_ardour/ardour3_ui_dark.rc $Resources
428 cp -r ../../gtk2_ardour/icons $Resources
429 cp -r ../../gtk2_ardour/pixmaps $Resources
432 cp -R ../../gtk2_ardour/splash.png $Shared
433 cp -R ../../gtk2_ardour/small-splash.png $Shared
434 cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared
436 # go through and recursively remove any .svn dirs in the bundle
437 for svndir in `find $APPDIR -name .svn -type dir`; do
441 # install bundled LV2s to <app>/Contents/lib/LV2/
442 cp -R $BUILD_ROOT/libs/LV2 $Frameworks/
444 # now fix up the executables
445 echo "Fixing up executable dependency names ..."
446 executables=$MAIN_EXECUTABLE
447 if test x$SAE != x ; then
448 executables="$executables"
451 for exe in $executables; do
452 EXE=$APPROOT/MacOS/$exe
454 for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
456 changes="$changes -change $lib @executable_path/../lib/$base"
458 if test "x$changes" != "x" ; then
459 install_name_tool $changes $EXE
463 echo "Fixing up library names ..."
464 # now do the same for all the libraries we include
465 for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends ; do
467 libbase=`basename $libdir`
469 for dylib in $libdir/*.dylib $libdir/*.so ; do
473 if test -L $dylib ; then
477 # change all the dependencies
480 for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
482 if echo $lib | grep -s libbase; then
483 changes="$changes -change $lib @executable_path/../$libbase/$base"
485 changes="$changes -change $lib @executable_path/../lib/$base"
489 if test "x$changes" != x ; then
490 if install_name_tool $changes $dylib ; then
497 # now the change what the library thinks its own name is
499 base=`basename $dylib`
500 install_name_tool -id @executable_path/../$libbase/$base $dylib
505 # and now ... the DMG
508 rm -rf $PRODUCT_PKG_DIR
509 mkdir $PRODUCT_PKG_DIR
512 DMGBACKGROUND=dmgbg.png
514 if [ x$SAE != x ] ; then
518 echo "Creating SAE packaging directory"
519 mv $APPDIR $PRODUCT_PKG_DIR/Ardour3-SAE.app
520 cp HowToInstallArdourSAE.pdf "$PRODUCT_PKG_DIR/How To Install Ardour SAE.pdf"
521 cp SAE-de-keypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts (keypad).pdf"
522 cp SAE-de-nokeypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts.pdf"
524 elif [ x$MIXBUS != x ] ; then
528 echo "Creating Mixbus packaging directory"
529 mv $APPDIR $PRODUCT_PKG_DIR/
530 cp MixBus_Install_QuickStart.pdf "$PRODUCT_PKG_DIR/Mixbus Install & Quick Start Guide.pdf"
532 YPOS=$[ $DMGWINBOTTOM - 300 ]
533 MIXBUSPOS="set position of item \"MixBus_Install_QuickStart.pdf\" of container window to {90, ${YPOS}}"
536 echo "Creating $APPNAME packaging directory"
537 mv $APPDIR $PRODUCT_PKG_DIR/
541 if test x$WITH_HARVID != x ; then
542 echo "installing video tools.."
543 HARVID_VERSION=$(curl -s -S http://ardour.org/files/video-tools/harvid_version.txt)
544 XJADEO_VERSION=$(curl -s -S http://ardour.org/files/video-tools/xjadeo_version.txt)
545 echo "copying harvid and xjadeo ..."
548 rsync://ardour.org/video-tools/harvid-osx-${HARVID_VERSION}.tgz \
549 "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz"
552 rsync://ardour.org/video-tools/jadeo-${XJADEO_VERSION:1}.dmg \
553 "$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg"
556 -C $PRODUCT_PKG_DIR/$APPROOT \
557 -f "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz" || exit 1
559 JADEO=$(hdiutil attach "$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg" | grep Apple_HFS | grep dev/ | cut -f 3)
560 cp -r "${JADEO}/Jadeo.app" "$PRODUCT_PKG_DIR/"
561 hdiutil detach "${JADEO}"
564 YPOS=$[ $DMGWINBOTTOM - 300 ]
565 XJADEOPOS="set position of item \"Jadeo.app\" of container window to {310, ${YPOS}}"
567 DMGBACKGROUND=dmgbgxj.png
570 echo "Building DMG ..."
572 # UC_DMG=$APPNAME-${release_version}-${revision}-UC.dmg
573 # FINAL_DMG=$APPNAME-${release_version}-${revision}.dmg
574 UC_DMG=$APPNAME-$version.dmg
575 VOLNAME=$APPNAME-$version
579 MNTPATH=`mktemp -d -t /ardourimg`
580 TMPDMG=`mktemp -t ardour`
581 ICNSTMP=`mktemp -t ardouricon`
583 DMGMEGABYTES=$[ `du -sk "$PRODUCT_PKG_DIR" | cut -f 1` * 1024 / 1048576 + $EXTRA_SPACE_MB ]
585 echo "DMG MB = " $DMGMEGABYTES
587 rm -f $UC_DMG "$TMPDMG" "${TMPDMG}.dmg" "$ICNSTMP"
591 TMPDMG="${TMPDMG}.dmg"
593 hdiutil create -megabytes $DMGMEGABYTES "$TMPDMG"
594 DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
595 newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
596 mount -t hfs "${DiskDevice}" "${MNTPATH}"
598 cp -r ${PRODUCT_PKG_DIR}/* "${MNTPATH}" || exit
599 mkdir "${MNTPATH}/.background"
600 cp -vi ${DMGBACKGROUND} "${MNTPATH}/.background/dmgbg.png"
602 echo "setting DMG background ..."
605 tell application "Finder"
606 tell disk "'${VOLNAME}'"
608 set current view of container window to icon view
609 set toolbar visible of container window to false
610 set statusbar visible of container window to false
611 set the bounds of container window to {400, 200, 800, '${DMGWINBOTTOM}'}
612 set theViewOptions to the icon view options of container window
613 set arrangement of theViewOptions to not arranged
614 set icon size of theViewOptions to 64
615 set background picture of theViewOptions to file ".background:dmgbg.png"
616 make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
617 set position of item "'${APPDIR}'" of container window to {90, 100}
618 set position of item "Applications" of container window to {310, 100}
624 update without registering applications
631 chmod -Rf go-w "${MNTPATH}"
634 echo "compressing Image ..."
637 umount "${DiskDevice}"
638 hdiutil eject "${DiskDevice}"
639 # Create a read-only version, use zlib compression
640 hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
641 # Delete the temporary files
645 echo "setting file icon ..."
647 cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
648 /usr/bin/sips -i ${ICNSTMP}.icns
649 /Developer/Tools/DeRez -only icns ${ICNSTMP}.icns > ${ICNSTMP}.rsrc
650 /Developer/Tools/Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
651 /Developer/Tools/SetFile -a C "$UC_DMG"
653 rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
656 echo "packaging suceeded."