3 # script for pulling together a MacOSX app bundle.
5 GTKSTACK_ROOT=$HOME/gtk/inst
6 ARDOURSTACK_ROOT=$HOME/a3/inst
16 while [ $# -gt 0 ] ; do
21 # top level build targets
28 PRODUCT_PKG_DIR=ArdourSAE ;
36 PRODUCT_PKG_DIR=MixBus;
43 PRODUCT_PKG_DIR=Ardour;
50 PRODUCT_PKG_DIR=Ardour ;
52 --test) SAE= ; WITH_LADSPA=; STRIP= ; shift ;;
55 # specific build flags
58 --noladspa) WITH_LADSPA= ; shift ;;
59 --nostrip) STRIP= ; shift ;;
60 --sysdeps) PRINT_SYSDEPS=1; shift ;;
61 --nls) WITH_NLS=1 ; shift ;;
65 #release_version=`grep -m 1 '[^A-Za-z_]OSX_VERSION = ' ../../wscript | cut -d' ' -f 3 | sed "s/'//g"`
67 svn_version=`grep -m 1 'svn_revision =' ../../libs/ardour/svn_revision.cc | cut -d' ' -f 8 | sed 's/[^0-9]//g'`
68 echo "Version is $release_version / $svn_version"
69 info_string="$release_version/$svn_version built on `hostname` by `whoami` on `date`"
70 echo "Info string is $info_string"
72 # setup directory structure
75 APPROOT=$APPDIR/Contents
76 Frameworks=$APPROOT/lib
77 Resources=$APPROOT/Resources
79 # Since this is OS X, don't try to distinguish between etc and shared
80 # (machine dependent and independent data) - just put everything
85 Locale=$Resources/locale
87 # Bundled Plugins live in a top level folder
89 Plugins=$APPROOT/Plugins
90 Surfaces=$Frameworks/surfaces
91 Panners=$Frameworks/panners
92 MidiMaps=$Shared/midi_maps
93 ExportFormats=$Shared/export
94 Templates=$Shared/templates
95 PatchFiles=$Shared/patchfiles
96 MackieControl=$Shared/mcp
98 if [ x$PRINT_SYSDEPS != x ] ; then
100 # print system dependencies
103 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Plugins/*.so ; do
104 if ! file $file | grep -qs Mach-O ; then
107 otool -L $file | awk '{print $1}' | egrep -v "(^@executable_path|^Ardour[0-9][.0-9]*.app)"
112 echo "Removing old $APPDIR tree ..."
116 echo "Building new app directory structure ..."
118 # only bother to make the longest paths
120 mkdir -p $APPROOT/MacOS
121 mkdir -p $APPROOT/Resources
126 mkdir -p $ExportFormats
128 mkdir -p $Frameworks/modules
129 mkdir -p $Shared/templates
131 mkdir -p $MackieControl
133 # maybe set variables
135 if test x$SAE != x ; then
136 appname="Ardour3/SAE"
137 env="$env<key>ARDOUR_SAE</key><string>true</string>"
139 # current default for SAE version is German keyboard layout without a keypad
141 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>de-nokeypad</string>"
142 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui_sae.conf</string>"
143 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark_sae.rc</string>"
144 elif test x$MIXBUS != x ; then
145 appname="Ardour3/Mixbus"
146 env="$env<key>ARDOUR_MIXBUS</key><string>true</string>"
148 # current default for MIXBUS version is US keyboard layout without a keypad
150 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>us-nokeypad</string>"
151 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui.conf</string>"
152 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark.rc</string>"
158 # if we're not going to bundle JACK, make sure we can find
159 # jack in the places where it might be
162 env="$env<key>PATH</key><string>/usr/local/bin:/opt/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>"
163 env="$env<key>DYLIB_FALLBACK_LIBRARY_PATH</key><string>/usr/local/lib:/opt/lib</string>"
165 env="<key>LSEnvironment</key><dict>$env<key>ARDOUR_BUNDLED</key><string>true</string></dict>"
168 sed -e "s?@ENV@?$env?g" \
169 -e "s?@VERSION@?$release_version/$svn_version?g" \
170 -e "s?@INFOSTRING@?$info_string?g" < Info.plist.in > Info.plist
172 sed -e "s?@APPNAME@?$appname?" \
173 -e "s?@ENV@?$env?g" \
174 -e "s?@VERSION@?$release_version/$svn_version?g" \
175 -e "s?@INFOSTRING@?$info_string?g" < InfoPlist.strings.in > Resources/InfoPlist.strings || exit 1
179 cp Info.plist $APPROOT
180 cp -R Resources $APPROOT
183 # if we build a bundle without jack, then
184 # make the Ardour3 executable a helper
185 # script that checks to see if JACK is
189 cp startup_script $APPROOT/MacOS/Ardour3
190 chmod 775 $APPROOT/MacOS/Ardour3
191 MAIN_EXECUTABLE=Ardour3.bin
193 echo "Copying ardour executable ...."
194 cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTABLE
195 if test x$SAE != x ; then
196 # cp $BUILD_ROOT/gtk2_ardour/evtest $APPROOT/MacOS/gtkevents
197 cp Ardour3-SAE.icns $Resources/appIcon.icns
198 elif test x$MIXBUS != x ; then
199 cp Mixbus.icns $Resources/appIcon.icns
201 cp Ardour3.icns $Resources/appIcon.icns
203 cp typeArdour.icns $Resources/
204 if test x$STRIP != x ; then
205 strip $APPROOT/MacOS/Ardour3
209 if test x$WITH_NLS != x ; then
210 echo "NLS support ..."
211 echo "I hope you remembered to run scons msgupdate!"
213 for file in $BUILD_ROOT/gtk2_ardour/*.mo
215 lang=`basename $file | sed 's/\.mo//'`
216 mkdir -p $Locale/$lang/LC_MESSAGES
217 cp $file $Locale/$lang/LC_MESSAGES/gtk2_ardour.mo
218 LINGUAS="$LINGUAS $lang"
220 for file in $BUILD_ROOT/libs/ardour/*.mo
222 lang=`basename $file | sed 's/\.mo//'`
223 mkdir -p $Locale/$lang/LC_MESSAGES
224 cp $file $Locale/$lang/LC_MESSAGES/libardour.mo
228 if [ -d $GTKSTACK_ROOT/share/locale/$l ] ; then
229 echo "Copying GTK i18n files for $l..."
230 cp -r $GTKSTACK_ROOT/share/locale/$l $Locale
232 # try with just the language spec
233 just_lang=`echo $l | sed 's/_[A-Z][A-Z]$//'`
234 if [ -d $GTKSTACK_ROOT/share/locale/$just_lang ] ; then
235 echo "Copying GTK i18n files for $l..."
236 cp -r $GTKSTACK_ROOT/share/locale/$just_lang $Locale
241 echo "Skipping NLS support"
245 # Copy stuff that may be dynamically loaded
248 cp -R $GTKSTACK_ROOT/etc/* $Etc
249 echo "Copying all Pango modules ..."
250 cp -R $GTKSTACK_ROOT/lib/pango/1.6.0/modules/*.so $Frameworks/modules
251 echo "Copying all GDK Pixbuf loaders ..."
252 cp -R $GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so $Frameworks/modules
254 cp -R $GTKSTACK_ROOT/lib/charset.alias $Resources
256 # generate new Pango module file
259 ModulesPath=$GTKSTACK_ROOT/lib/pango/1.6.0/modules
261 env PANGO_RC_FILE=pangorc $GTKSTACK_ROOT/bin/pango-querymodules | sed "s?$GTKSTACK_ROOT/lib/pango/1.6.0/modules/?@executable_path/../lib/modules/?" > $Resources/pango.modules
264 # generate a new GDK pixbufs loaders file
265 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
267 # We rely on clearlooks, so include a version from our own build tree
268 # this one is special - we will set GTK_PATH to $Libraries/clearlooks
270 echo "Copying clearlooks ..."
271 cp $BUILD_ROOT/libs/clearlooks-newer/libclearlooks.dylib $Frameworks
272 mkdir -p $Frameworks/clearlooks/engines
273 (cd $Frameworks/clearlooks/engines && ln -s ../../libclearlooks.dylib libclearlooks.dylib && ln -s ../../libclearlooks.dylib libclearlooks.so)
275 if test x$WITH_LADSPA != x ; then
276 if test x$SAE != x ; then
278 elif test x$MIXBUS != x ; then
279 plugdir=mixbus_ladspa
283 if [ -d $plugdir -a "x$(ls $plugdir)" != x ] ; then
284 echo "Copying `ls $plugdir | wc -l` plugins ..."
285 cp -r $plugdir/* $Plugins
289 # Control Surface shared libraries
290 cp $BUILD_ROOT/libs/surfaces/*/libardour_*.dylib $Surfaces
291 cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks
294 cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
297 # Export Formats/Presets
298 for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do
299 cp "$f" $ExportFormats ;
302 # Session and Route templates
303 for f in $BUILD_ROOT/../templates/* ; do
304 if [ -d "$f" ] ; then
305 cp -r "$f" $Templates ;
310 # got to be careful with names here
311 for x in $BUILD_ROOT/../midi_maps/*.map ; do
316 # got to be careful with names here
317 for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
322 # got to be careful with names here
323 for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
324 cp "$x" $MackieControl
327 # VAMP plugins that we use
328 cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.dylib $Frameworks
331 cp $ARDOURSTACK_ROOT/lib/suil-0/lib* $Frameworks
335 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Panners/*.dylib $Surfaces/*.dylib $Plugins/*.so ; do
336 if ! file $file | grep -qs Mach-O ; then
339 deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | grep -v 'libjack\.'`
341 for dep in $deps ; do
343 if ! test -f $Frameworks/$base; then
344 if echo $dep | grep -sq '^libs' ; then
345 cp $BUILD_ROOT/$dep $Frameworks
353 if test x$missing = xfalse ; then
354 # everything has been found
360 echo "Copying other stuff to $APPDIR ..."
362 #cp $BUILD_ROOT/gtk2_ardour/ergonomic-us.bindings $Resources
364 cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings $Resources
365 cp ../../gtk2_ardour/mixer.bindings $Resources
366 cp ../../gtk2_ardour/step_editing.bindings $Resources
367 cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
369 if test x$SAE != x ; then
370 cp $BUILD_ROOT/gtk2_ardour/SAE-de-keypad.bindings $Resources
371 cp $BUILD_ROOT/gtk2_ardour/SAE-de-nokeypad.bindings $Resources
372 cp $BUILD_ROOT/gtk2_ardour/SAE-us-keypad.bindings $Resources
373 cp $BUILD_ROOT/gtk2_ardour/SAE-us-nokeypad.bindings $Resources
374 cp $BUILD_ROOT/ardour_system_sae.rc $Resources/ardour_system.rc
375 echo cp $BUILD_ROOT/ardour_system_sae.rc $Resources/ardour_system.rc
376 cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
377 echo cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
379 cp ../../ardour_system.rc $Resources/ardour_system.rc
380 cp ../../instant.xml $Resources/instant.xml
381 echo cp ../../instant.xml $Resources/instant.xml
383 cp ../../gtk2_ardour/ardour3_ui_default.conf $Resources
384 cp ../../gtk2_ardour/ardour3_ui_default.conf $Resources/ardour3_ui.conf
385 cp $BUILD_ROOT/gtk2_ardour/ardour3_ui_light.rc $Resources
386 cp $BUILD_ROOT/gtk2_ardour/ardour3_ui_dark.rc $Resources
388 cp -r ../../gtk2_ardour/icons $Resources
389 cp -r ../../gtk2_ardour/pixmaps $Resources
392 cp -R ../../gtk2_ardour/splash.png $Shared
393 cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared
395 # go through and recursively remove any .svn dirs in the bundle
396 for svndir in `find $APPDIR -name .svn -type dir`; do
400 # now fix up the executables
401 echo "Fixing up executable dependency names ..."
402 executables=$MAIN_EXECUTABLE
403 if test x$SAE != x ; then
404 executables="$executables"
407 for exe in $executables; do
408 EXE=$APPROOT/MacOS/$exe
410 for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
412 changes="$changes -change $lib @executable_path/../lib/$base"
414 if test "x$changes" != "x" ; then
415 install_name_tool $changes $EXE
419 echo "Fixing up library names ..."
420 # now do the same for all the libraries we include
421 for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners ; do
423 libbase=`basename $libdir`
425 for dylib in $libdir/*.dylib $libdir/*.so ; do
429 if test -L $dylib ; then
433 # change all the dependencies
436 for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
438 if echo $lib | grep -s libbase; then
439 changes="$changes -change $lib @executable_path/../$libbase/$base"
441 changes="$changes -change $lib @executable_path/../lib/$base"
445 if test "x$changes" != x ; then
446 if install_name_tool $changes $dylib ; then
453 # now the change what the library thinks its own name is
455 base=`basename $dylib`
456 install_name_tool -id @executable_path/../$libbase/$base $dylib
461 # and now ... the DMG
464 rm -rf $PRODUCT_PKG_DIR
465 mkdir $PRODUCT_PKG_DIR
467 if [ x$SAE != x ] ; then
471 echo "Creating SAE packaging directory"
472 mv $APPDIR $PRODUCT_PKG_DIR/Ardour3-SAE.app
473 cp HowToInstallArdourSAE.pdf "$PRODUCT_PKG_DIR/How To Install Ardour SAE.pdf"
474 cp SAE-de-keypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts (keypad).pdf"
475 cp SAE-de-nokeypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts.pdf"
477 elif [ x$MIXBUS != x ] ; then
481 echo "Creating Mixbus packaging directory"
482 mv $APPDIR $PRODUCT_PKG_DIR/
483 cp MixBus_Install_QuickStart.pdf "$PRODUCT_PKG_DIR/Mixbus Install & Quick Start Guide.pdf"
487 echo "Creating $APPNAME packaging directory"
488 mv $APPDIR $PRODUCT_PKG_DIR/
492 echo "Building DMG ..."
494 # UC_DMG=$APPNAME-${release_version}-${svn_version}-UC.dmg
495 # FINAL_DMG=$APPNAME-${release_version}-${svn_version}.dmg
496 UC_DMG=$APPNAME-${release_version}-${svn_version}.dmg
497 VOLNAME=$APPNAME-$release_version
500 MNTPATH=`mktemp -d -t ardourimg`
501 TMPDMG=`mktemp -t ardour`
502 ICNSTMP=`mktemp -t ardouricon`
503 DMGSIZE=$[ `du -sm "$PRODUCT_PKG_DIR" | cut -f 1` * 1049 / 1000 + 3 ]
505 rm -f $UC_DMG "$TMPDMG" "${TMPDMG}.dmg" "$ICNSTMP"
509 TMPDMG="${TMPDMG}.dmg"
511 hdiutil create -megabytes $DMGSIZE "$TMPDMG"
512 DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
513 newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
514 mount -t hfs "${DiskDevice}" "${MNTPATH}"
516 cp -r ${PRODUCT_PKG_DIR}/${APPDIR} "${MNTPATH}" || exit
517 mkdir "${MNTPATH}/.background"
518 cp -vi dmgbg.png "${MNTPATH}/.background/dmgbg.png"
520 echo "setting DMG background ..."
523 tell application "Finder"
524 tell disk "'${VOLNAME}'"
526 set current view of container window to icon view
527 set toolbar visible of container window to false
528 set statusbar visible of container window to false
529 set the bounds of container window to {400, 200, 800, 440}
530 set theViewOptions to the icon view options of container window
531 set arrangement of theViewOptions to not arranged
532 set icon size of theViewOptions to 64
533 set background picture of theViewOptions to file ".background:dmgbg.png"
534 make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
535 set position of item "'${APPDIR}'" of container window to {90, 100}
536 set position of item "Applications" of container window to {310, 100}
539 update without registering applications
546 chmod -Rf go-w "${MNTPATH}"
549 echo "compressing Image ..."
552 umount "${DiskDevice}"
553 hdiutil eject "${DiskDevice}"
554 # Create a read-only version, use zlib compression
555 hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
556 # Delete the temporary files
560 echo "setting file icon ..."
562 cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
563 /usr/bin/sips -i ${ICNSTMP}.icns
564 /Developer/Tools/DeRez -only icns ${ICNSTMP}.icns > ${ICNSTMP}.rsrc
565 /Developer/Tools/Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
566 /Developer/Tools/SetFile -a C "$UC_DMG"
568 rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
571 echo "packaging suceeded."