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"
79 if [ "x$commit" != "x" ] ; then
80 info_string="$release_version ($commit) built on `hostname` by `whoami` on `date`"
82 info_string="$release_version built on `hostname` by `whoami` on `date`"
84 echo "Info string is $info_string"
86 # setup directory structure
89 APPROOT=$APPDIR/Contents
90 Frameworks=$APPROOT/lib
91 Resources=$APPROOT/Resources
93 # Since this is OS X, don't try to distinguish between etc and shared
94 # (machine dependent and independent data) - just put everything
99 Locale=$Resources/locale
101 # Bundled Plugins live in a top level folder
103 Plugins=$APPROOT/Plugins
104 Surfaces=$Frameworks/surfaces
105 Panners=$Frameworks/panners
106 Backends=$Frameworks/backends
107 MidiMaps=$Shared/midi_maps
108 ExportFormats=$Shared/export
109 Templates=$Shared/templates
110 PatchFiles=$Shared/patchfiles
111 MackieControl=$Shared/mcp
112 VFork=$Frameworks/vfork
114 if [ x$PRINT_SYSDEPS != x ] ; then
116 # print system dependencies
119 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Plugins/*.so ; do
120 if ! file $file | grep -qs Mach-O ; then
123 otool -L $file | awk '{print $1}' | egrep -v "(^@executable_path|^Ardour[0-9][.0-9]*.app)"
128 echo "Removing old $APPDIR tree ..."
132 echo "Building new app directory structure ..."
134 # only bother to make the longest paths
136 mkdir -p $APPROOT/MacOS
137 mkdir -p $APPROOT/Resources
143 mkdir -p $ExportFormats
145 mkdir -p $Frameworks/modules
147 mkdir -p $MackieControl
151 # maybe set variables
153 if test x$SAE != x ; then
154 appname="Ardour3/SAE"
155 env="$env<key>ARDOUR_SAE</key><string>true</string>"
157 # current default for SAE version is German keyboard layout without a keypad
159 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>de-nokeypad</string>"
160 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui_sae.conf</string>"
161 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark_sae.rc</string>"
162 elif test x$MIXBUS != x ; then
163 appname="Ardour3/Mixbus"
164 env="$env<key>ARDOUR_MIXBUS</key><string>true</string>"
166 # current default for MIXBUS version is US keyboard layout without a keypad
168 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>us-nokeypad</string>"
169 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui.conf</string>"
170 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark.rc</string>"
176 # if we're not going to bundle JACK, make sure we can find
177 # jack in the places where it might be
180 env="$env<key>PATH</key><string>/usr/local/bin:/opt/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>"
181 env="$env<key>DYLIB_FALLBACK_LIBRARY_PATH</key><string>/usr/local/lib:/opt/lib</string>"
183 env="<key>LSEnvironment</key><dict>$env<key>ARDOUR_BUNDLED</key><string>true</string></dict>"
186 sed -e "s?@ENV@?$env?g" \
187 -e "s?@VERSION@?$release_version?g" \
188 -e "s?@INFOSTRING@?$info_string?g" < Info.plist.in > Info.plist
190 sed -e "s?@APPNAME@?$appname?" \
191 -e "s?@ENV@?$env?g" \
192 -e "s?@VERSION@?$release_version?g" \
193 -e "s?@INFOSTRING@?$info_string?g" < InfoPlist.strings.in > Resources/InfoPlist.strings || exit 1
197 cp Info.plist $APPROOT
198 cp -R Resources $APPROOT
201 # if we build a bundle without jack, then
202 # make the Ardour3 executable a helper
203 # script that checks to see if JACK is
207 cp startup_script $APPROOT/MacOS/Ardour3
208 chmod 775 $APPROOT/MacOS/Ardour3
209 MAIN_EXECUTABLE=Ardour3.bin
211 echo "Copying ardour executable ...."
212 cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTABLE
213 if test x$SAE != x ; then
214 # cp $BUILD_ROOT/gtk2_ardour/evtest $APPROOT/MacOS/gtkevents
215 cp Ardour3-SAE.icns $Resources/appIcon.icns
216 elif test x$MIXBUS != x ; then
217 cp Mixbus.icns $Resources/appIcon.icns
219 cp Ardour3.icns $Resources/appIcon.icns
221 cp typeArdour.icns $Resources/
222 if test x$STRIP != x ; then
223 strip $APPROOT/MacOS/Ardour3
227 if test x$WITH_NLS != x ; then
228 echo "NLS support ..."
229 echo "I hope you remembered to run waf i18n"
232 for pkg in gtk2_ardour libs/ardour libs/gtkmm2ext ; do
233 files=`find ../../$pkg -name "*.mo"`
236 # the package name is appended with a number so that
237 # it can be parallel installed during a regular install
238 # with older (and newer) versions. it is just the major
239 # number of the release (i.e. leading digits)
242 vsuffix=`echo $release_version | sed 's/^\([0-9][0-9]*\).*/\1/'`
244 if [ -z "$files" ]; then
246 echo "!!!! WARNING !!!! - Did not find any .mo files in ../../$pkg"
253 lang=`basename $file | sed 's/\.mo//'`
254 mkdir -p $Locale/$lang/LC_MESSAGES
255 cp $file $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
256 echo copy $file to $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
257 if echo $LINGUAS | grep $lang >/dev/null 2>&1 ; then
260 LINGUAS="$LINGUAS $lang"
267 if [ -d $GTKSTACK_ROOT/share/locale/$l ] ; then
268 echo "Copying GTK i18n files for $l..."
269 cp -r $GTKSTACK_ROOT/share/locale/$l $Locale
271 # try with just the language spec
272 just_lang=`echo $l | sed 's/_[A-Z][A-Z]$//'`
273 if [ -d $GTKSTACK_ROOT/share/locale/$just_lang ] ; then
274 echo "Copying GTK i18n files for $l..."
275 cp -r $GTKSTACK_ROOT/share/locale/$just_lang $Locale
280 echo "Skipping NLS support"
284 # Copy stuff that may be dynamically loaded
287 cp -R $GTKSTACK_ROOT/etc/* $Etc
288 echo "Copying all Pango modules ..."
289 cp -R $GTKSTACK_ROOT/lib/pango/1.8.0/modules/*.so $Frameworks/modules
290 echo "Copying all GDK Pixbuf loaders ..."
291 cp -R $GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so $Frameworks/modules
293 cp -R $GTKSTACK_ROOT/lib/charset.alias $Resources
295 # generate new Pango module file
298 ModulesPath=$GTKSTACK_ROOT/lib/pango/1.8.0/modules
300 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
303 # generate a new GDK pixbufs loaders file
304 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
306 # We rely on clearlooks, so include a version from our own build tree
307 # this one is special - we will set GTK_PATH to $Frameworks/gtkengines
309 GTK_ENGINE_DIR=$Frameworks/gtkengines/engines
310 mkdir -p $GTK_ENGINE_DIR
312 echo "Copying GTK engines ..."
313 cp $BUILD_ROOT/libs/clearlooks-newer/libclearlooks.dylib $Frameworks
314 (cd $GTK_ENGINE_DIR && ln -s ../../libclearlooks.dylib . && ln -s ../../libclearlooks.dylib libclearlooks.so)
316 cp $GTKSTACK_ROOT/lib/gtk-2.0/2.10.0/engines/libpixmap.so $Frameworks
317 (cd $GTK_ENGINE_DIR && ln -s ../../libpixmap.so)
320 if test x$WITH_LADSPA != x ; then
321 if test x$SAE != x ; then
323 elif test x$MIXBUS != x ; then
324 plugdir=mixbus_ladspa
328 if [ -d $plugdir -a "x$(ls $plugdir)" != x ] ; then
329 echo "Copying `ls $plugdir | wc -l` plugins ..."
330 cp -r $plugdir/* $Plugins
334 # Control Surface shared libraries
335 cp $BUILD_ROOT/libs/surfaces/*/libardour_*.dylib $Surfaces
336 cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks
339 cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
342 for backend in jack wavesaudio dummy; do
343 cp $BUILD_ROOT/libs/backends/$backend/lib*.dylib $Backends
346 # Export Formats/Presets
347 for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do
348 cp "$f" $ExportFormats ;
351 # Session and Route templates
352 #for f in $BUILD_ROOT/../templates/* ; do
353 # if [ -d "$f" ] ; then
354 # cp -r "$f" $Templates ;
359 # got to be careful with names here
360 for x in $BUILD_ROOT/../midi_maps/*.map ; do
365 # got to be careful with names here
366 for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
371 # got to be careful with names here
372 for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
373 cp "$x" $MackieControl
376 # VAMP plugins that we use
377 cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.dylib $Frameworks
380 cp $ARDOURSTACK_ROOT/lib/suil-0/lib* $Frameworks
382 # VST scanner app and wrapper script, if they exist
383 cp $BUILD_ROOT/libs/fst/ardour-vst-scanner* $Frameworks/ || true
386 mkdir -p $Frameworks/vfork
387 cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $VFork
392 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Panners/*.dylib $Backends/*.dylib $Surfaces/*.dylib $Plugins/*.so ; do
393 if ! file $file | grep -qs Mach-O ; then
396 deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | grep -v 'libjack\.'`
398 for dep in $deps ; do
400 if ! test -f $Frameworks/$base; then
401 if echo $dep | grep -sq '^libs' ; then
402 cp $BUILD_ROOT/$dep $Frameworks
410 if test x$missing = xfalse ; then
411 # everything has been found
417 echo "Copying other stuff to $APPDIR ..."
419 #cp $BUILD_ROOT/gtk2_ardour/ergonomic-us.bindings $Resources
421 cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings $Resources
422 cp ../../gtk2_ardour/mixer.bindings $Resources
423 cp ../../gtk2_ardour/step_editing.bindings $Resources
424 cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
426 if test x$SAE != x ; then
427 cp $BUILD_ROOT/gtk2_ardour/SAE-de-keypad.bindings $Resources
428 cp $BUILD_ROOT/gtk2_ardour/SAE-de-nokeypad.bindings $Resources
429 cp $BUILD_ROOT/gtk2_ardour/SAE-us-keypad.bindings $Resources
430 cp $BUILD_ROOT/gtk2_ardour/SAE-us-nokeypad.bindings $Resources
431 cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
432 echo cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
434 cp ../../system_config $Resources/system_config
435 cp ../../instant.xml $Resources/instant.xml
436 echo cp ../../instant.xml $Resources/instant.xml
438 cp $BUILD_ROOT/gtk2_ardour/default_ui_config $Resources
439 cp $BUILD_ROOT/gtk2_ardour/dark_fonts.rc $Resources
440 cp $BUILD_ROOT/gtk2_ardour/dark_styles.rc $Resources
441 cp $BUILD_ROOT/gtk2_ardour/light_fonts.rc $Resources
442 cp $BUILD_ROOT/gtk2_ardour/light_styles.rc $Resources
443 cp $BUILD_ROOT/gtk2_ardour/ui_dark.rc $Resources
444 cp $BUILD_ROOT/gtk2_ardour/ui_light.rc $Resources
445 cp $BUILD_ROOT/gtk2_ardour/widgets.rc $Resources
447 cp -r ../../gtk2_ardour/icons $Resources
448 cp -r ../../gtk2_ardour/pixmaps $Resources
451 cp -R ../../gtk2_ardour/splash.png $Shared
452 cp -R ../../gtk2_ardour/small-splash.png $Shared
453 cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared
455 # go through and recursively remove any .svn dirs in the bundle
456 for svndir in `find $APPDIR -name .svn -type dir`; do
460 # install bundled LV2s to <app>/Contents/lib/LV2/
461 cp -R $BUILD_ROOT/libs/LV2 $Frameworks/
463 # now fix up the executables
464 echo "Fixing up executable dependency names ..."
465 executables=$MAIN_EXECUTABLE
466 if test x$SAE != x ; then
467 executables="$executables"
470 for exe in $executables; do
471 EXE=$APPROOT/MacOS/$exe
473 for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
475 changes="$changes -change $lib @executable_path/../lib/$base"
477 if test "x$changes" != "x" ; then
478 install_name_tool $changes $EXE
482 echo "Fixing up library names ..."
483 # now do the same for all the libraries we include
484 for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends ; do
486 libbase=`basename $libdir`
488 for dylib in $libdir/*.dylib $libdir/*.so ; do
492 if test -L $dylib ; then
496 # change all the dependencies
499 for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
501 if echo $lib | grep -s libbase; then
502 changes="$changes -change $lib @executable_path/../$libbase/$base"
504 changes="$changes -change $lib @executable_path/../lib/$base"
508 if test "x$changes" != x ; then
509 if install_name_tool $changes $dylib ; then
516 # now the change what the library thinks its own name is
518 base=`basename $dylib`
519 install_name_tool -id @executable_path/../$libbase/$base $dylib
524 # and now ... the DMG
527 rm -rf $PRODUCT_PKG_DIR
528 mkdir $PRODUCT_PKG_DIR
531 DMGBACKGROUND=dmgbg.png
533 if [ x$SAE != x ] ; then
537 echo "Creating SAE packaging directory"
538 mv $APPDIR $PRODUCT_PKG_DIR/Ardour3-SAE.app
539 cp HowToInstallArdourSAE.pdf "$PRODUCT_PKG_DIR/How To Install Ardour SAE.pdf"
540 cp SAE-de-keypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts (keypad).pdf"
541 cp SAE-de-nokeypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts.pdf"
543 elif [ x$MIXBUS != x ] ; then
547 echo "Creating Mixbus packaging directory"
548 mv $APPDIR $PRODUCT_PKG_DIR/
549 cp MixBus_Install_QuickStart.pdf "$PRODUCT_PKG_DIR/Mixbus Install & Quick Start Guide.pdf"
551 YPOS=$[ $DMGWINBOTTOM - 300 ]
552 MIXBUSPOS="set position of item \"MixBus_Install_QuickStart.pdf\" of container window to {90, ${YPOS}}"
555 echo "Creating $APPNAME packaging directory"
556 mv $APPDIR $PRODUCT_PKG_DIR/
560 if test x$WITH_HARVID != x ; then
561 echo "installing video tools.."
562 HARVID_VERSION=$(curl -s -S http://ardour.org/files/video-tools/harvid_version.txt)
563 XJADEO_VERSION=$(curl -s -S http://ardour.org/files/video-tools/xjadeo_version.txt)
565 echo "copying harvid and xjadeo ..."
568 rsync://ardour.org/video-tools/harvid-osx-${HARVID_VERSION}.tgz \
569 "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz"
572 rsync://ardour.org/video-tools/jadeo-${XJADEO_VERSION:1}.dmg \
573 "$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg"
576 -C $PRODUCT_PKG_DIR/$APPROOT \
577 -f "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz" || exit 1
579 JADEO=$(hdiutil attach "$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg" | grep Apple_HFS | grep dev/ | cut -f 3)
580 cp -r "${JADEO}/Jadeo.app" "$PRODUCT_PKG_DIR/"
581 hdiutil detach "${JADEO}"
584 YPOS=$[ $DMGWINBOTTOM - 300 ]
585 XJADEOPOS="set position of item \"Jadeo.app\" of container window to {310, ${YPOS}}"
587 DMGBACKGROUND=dmgbgxj.png
590 echo "Building DMG ..."
592 # UC_DMG=$APPNAME-${release_version}-UC.dmg
593 # FINAL_DMG=$APPNAME-${release_version}.dmg
594 UC_DMG=$APPNAME-$release_version.dmg
595 VOLNAME=$APPNAME-$release_version
599 MNTPATH=`mktemp -d -t ardourimg`
600 TMPDMG=`mktemp -t ardour`
601 ICNSTMP=`mktemp -t ardouricon`
603 DMGMEGABYTES=$[ `du -sk "$PRODUCT_PKG_DIR" | cut -f 1` * 1024 / 1048576 + $EXTRA_SPACE_MB ]
605 echo "DMG MB = " $DMGMEGABYTES
607 rm -f $UC_DMG "$TMPDMG" "${TMPDMG}.dmg" "$ICNSTMP"
611 TMPDMG="${TMPDMG}.dmg"
613 hdiutil create -megabytes $DMGMEGABYTES "$TMPDMG"
614 DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
615 newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
616 mount -t hfs "${DiskDevice}" "${MNTPATH}"
618 cp -r ${PRODUCT_PKG_DIR}/* "${MNTPATH}" || exit
619 mkdir "${MNTPATH}/.background"
620 cp -vi ${DMGBACKGROUND} "${MNTPATH}/.background/dmgbg.png"
622 echo "setting DMG background ..."
624 if test $(sw_vers -productVersion | cut -d '.' -f 2) -lt 9; then
628 # OSX 10.9.X and later
629 DISKNAME=`basename "${MNTPATH}"`
633 tell application "Finder"
635 tell disk "${DISKNAME}"
637 set current view of container window to icon view
638 set toolbar visible of container window to false
639 set statusbar visible of container window to false
640 set the bounds of container window to {400, 200, 800, ${DMGWINBOTTOM}}
641 set theViewOptions to the icon view options of container window
642 set arrangement of theViewOptions to not arranged
643 set icon size of theViewOptions to 64
644 set background picture of theViewOptions to file ".background:dmgbg.png"
645 make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
646 set position of item "${APPDIR}" of container window to {90, 100}
647 set position of item "Applications" of container window to {310, 100}
653 update without registering applications
660 chmod -Rf go-w "${MNTPATH}"
663 echo "compressing Image ..."
666 umount "${DiskDevice}"
667 hdiutil eject "${DiskDevice}"
668 # Create a read-only version, use zlib compression
669 hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
670 # Delete the temporary files
674 echo "setting file icon ..."
676 cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
677 sips -i ${ICNSTMP}.icns
678 DeRez -only icns ${ICNSTMP}.icns > ${ICNSTMP}.rsrc
679 Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
680 SetFile -a C "$UC_DMG"
682 rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
685 echo "packaging suceeded."