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 '^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
394 # go through and recursively remove any .svn dirs in the bundle
395 for svndir in `find $APPDIR -name .svn -type dir`; do
399 # now fix up the executables
400 echo "Fixing up executable dependency names ..."
401 executables=$MAIN_EXECUTABLE
402 if test x$SAE != x ; then
403 executables="$executables"
406 for exe in $executables; do
407 EXE=$APPROOT/MacOS/$exe
409 for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
411 changes="$changes -change $lib @executable_path/../lib/$base"
413 if test "x$changes" != "x" ; then
414 install_name_tool $changes $EXE
418 echo "Fixing up library names ..."
419 # now do the same for all the libraries we include
420 for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners ; do
422 libbase=`basename $libdir`
424 for dylib in $libdir/*.dylib $libdir/*.so ; do
428 if test -L $dylib ; then
432 # change all the dependencies
435 for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
437 if echo $lib | grep -s libbase; then
438 changes="$changes -change $lib @executable_path/../$libbase/$base"
440 changes="$changes -change $lib @executable_path/../lib/$base"
444 if test "x$changes" != x ; then
445 if install_name_tool $changes $dylib ; then
452 # now the change what the library thinks its own name is
454 base=`basename $dylib`
455 install_name_tool -id @executable_path/../$libbase/$base $dylib
460 # and now ... the DMG
463 rm -rf $PRODUCT_PKG_DIR
464 mkdir $PRODUCT_PKG_DIR
466 if [ x$SAE != x ] ; then
470 echo "Creating SAE packaging directory"
471 mv $APPDIR $PRODUCT_PKG_DIR/Ardour3-SAE.app
472 cp HowToInstallArdourSAE.pdf "$PRODUCT_PKG_DIR/How To Install Ardour SAE.pdf"
473 cp SAE-de-keypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts (keypad).pdf"
474 cp SAE-de-nokeypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts.pdf"
476 elif [ x$MIXBUS != x ] ; then
480 echo "Creating Mixbus packaging directory"
481 mv $APPDIR $PRODUCT_PKG_DIR/
482 cp MixBus_Install_QuickStart.pdf "$PRODUCT_PKG_DIR/Mixbus Install & Quick Start Guide.pdf"
486 echo "Creating $APPNAME packaging directory"
487 mv $APPDIR $PRODUCT_PKG_DIR/
491 echo "Building DMG ..."
493 # UC_DMG=$APPNAME-${release_version}-${svn_version}-UC.dmg
494 # FINAL_DMG=$APPNAME-${release_version}-${svn_version}.dmg
495 UC_DMG=$APPNAME-${release_version}-${svn_version}.dmg
496 VOLNAME=$APPNAME-$release_version
499 MNTPATH=`mktemp -d -t ardourimg`
500 TMPDMG=`mktemp -t ardour`
501 ICNSTMP=`mktemp -t ardouricon`
502 DMGSIZE=$[ `du -sm "$PRODUCT_PKG_DIR" | cut -f 1` * 1049 / 1000 + 3 ]
504 rm -f $UC_DMG "$TMPDMG" "${TMPDMG}.dmg" "$ICNSTMP"
508 TMPDMG="${TMPDMG}.dmg"
510 hdiutil create -megabytes $DMGSIZE "$TMPDMG"
511 DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
512 newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
513 mount -t hfs "${DiskDevice}" "${MNTPATH}"
515 cp -r ${PRODUCT_PKG_DIR}/${APPDIR} "${MNTPATH}" || exit
516 mkdir "${MNTPATH}/.background"
517 cp -vi dmgbg.png "${MNTPATH}/.background/dmgbg.png"
519 echo "setting DMG background ..."
522 tell application "Finder"
523 tell disk "'${VOLNAME}'"
525 set current view of container window to icon view
526 set toolbar visible of container window to false
527 set statusbar visible of container window to false
528 set the bounds of container window to {400, 200, 800, 440}
529 set theViewOptions to the icon view options of container window
530 set arrangement of theViewOptions to not arranged
531 set icon size of theViewOptions to 64
532 set background picture of theViewOptions to file ".background:dmgbg.png"
533 make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
534 set position of item "'${APPDIR}'" of container window to {90, 100}
535 set position of item "Applications" of container window to {310, 100}
538 update without registering applications
545 chmod -Rf go-w "${MNTPATH}"
548 echo "compressing Image ..."
551 umount "${DiskDevice}"
552 hdiutil eject "${DiskDevice}"
553 # Create a read-only version, use zlib compression
554 hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
555 # Delete the temporary files
559 echo "setting file icon ..."
561 cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
562 /usr/bin/sips -i ${ICNSTMP}.icns
563 /Developer/Tools/DeRez -only icns ${ICNSTMP}.icns > ${ICNSTMP}.rsrc
564 /Developer/Tools/Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
565 /Developer/Tools/SetFile -a C "$UC_DMG"
567 rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
570 echo "packaging suceeded."