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 revision=`grep -m 1 'revision =' ../../libs/ardour/revision.cc | cut -d' ' -f 8 | sed 's/[^0-9]//g'`
68 echo "Version is $release_version / $revision"
69 info_string="$release_version/$revision 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
130 mkdir -p $MackieControl
132 # maybe set variables
134 if test x$SAE != x ; then
135 appname="Ardour3/SAE"
136 env="$env<key>ARDOUR_SAE</key><string>true</string>"
138 # current default for SAE version is German keyboard layout without a keypad
140 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>de-nokeypad</string>"
141 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui_sae.conf</string>"
142 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark_sae.rc</string>"
143 elif test x$MIXBUS != x ; then
144 appname="Ardour3/Mixbus"
145 env="$env<key>ARDOUR_MIXBUS</key><string>true</string>"
147 # current default for MIXBUS version is US keyboard layout without a keypad
149 env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>us-nokeypad</string>"
150 env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui.conf</string>"
151 env="$env<key>ARDOUR3_UI_RC</key><string>ardour3_ui_dark.rc</string>"
157 # if we're not going to bundle JACK, make sure we can find
158 # jack in the places where it might be
161 env="$env<key>PATH</key><string>/usr/local/bin:/opt/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>"
162 env="$env<key>DYLIB_FALLBACK_LIBRARY_PATH</key><string>/usr/local/lib:/opt/lib</string>"
164 env="<key>LSEnvironment</key><dict>$env<key>ARDOUR_BUNDLED</key><string>true</string></dict>"
167 sed -e "s?@ENV@?$env?g" \
168 -e "s?@VERSION@?$release_version/$revision?g" \
169 -e "s?@INFOSTRING@?$info_string?g" < Info.plist.in > Info.plist
171 sed -e "s?@APPNAME@?$appname?" \
172 -e "s?@ENV@?$env?g" \
173 -e "s?@VERSION@?$release_version/$revision?g" \
174 -e "s?@INFOSTRING@?$info_string?g" < InfoPlist.strings.in > Resources/InfoPlist.strings || exit 1
178 cp Info.plist $APPROOT
179 cp -R Resources $APPROOT
182 # if we build a bundle without jack, then
183 # make the Ardour3 executable a helper
184 # script that checks to see if JACK is
188 cp startup_script $APPROOT/MacOS/Ardour3
189 chmod 775 $APPROOT/MacOS/Ardour3
190 MAIN_EXECUTABLE=Ardour3.bin
192 echo "Copying ardour executable ...."
193 cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTABLE
194 if test x$SAE != x ; then
195 # cp $BUILD_ROOT/gtk2_ardour/evtest $APPROOT/MacOS/gtkevents
196 cp Ardour3-SAE.icns $Resources/appIcon.icns
197 elif test x$MIXBUS != x ; then
198 cp Mixbus.icns $Resources/appIcon.icns
200 cp Ardour3.icns $Resources/appIcon.icns
202 cp typeArdour.icns $Resources/
203 if test x$STRIP != x ; then
204 strip $APPROOT/MacOS/Ardour3
208 if test x$WITH_NLS != x ; then
209 echo "NLS support ..."
210 echo "I hope you remembered to run scons msgupdate!"
212 for file in $BUILD_ROOT/gtk2_ardour/*.mo
214 lang=`basename $file | sed 's/\.mo//'`
215 mkdir -p $Locale/$lang/LC_MESSAGES
216 cp $file $Locale/$lang/LC_MESSAGES/gtk2_ardour.mo
217 LINGUAS="$LINGUAS $lang"
219 for file in $BUILD_ROOT/libs/ardour/*.mo
221 lang=`basename $file | sed 's/\.mo//'`
222 mkdir -p $Locale/$lang/LC_MESSAGES
223 cp $file $Locale/$lang/LC_MESSAGES/libardour.mo
227 if [ -d $GTKSTACK_ROOT/share/locale/$l ] ; then
228 echo "Copying GTK i18n files for $l..."
229 cp -r $GTKSTACK_ROOT/share/locale/$l $Locale
231 # try with just the language spec
232 just_lang=`echo $l | sed 's/_[A-Z][A-Z]$//'`
233 if [ -d $GTKSTACK_ROOT/share/locale/$just_lang ] ; then
234 echo "Copying GTK i18n files for $l..."
235 cp -r $GTKSTACK_ROOT/share/locale/$just_lang $Locale
240 echo "Skipping NLS support"
244 # Copy stuff that may be dynamically loaded
247 cp -R $GTKSTACK_ROOT/etc/* $Etc
248 echo "Copying all Pango modules ..."
249 cp -R $GTKSTACK_ROOT/lib/pango/1.6.0/modules/*.so $Frameworks/modules
250 echo "Copying all GDK Pixbuf loaders ..."
251 cp -R $GTKSTACK_ROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so $Frameworks/modules
253 cp -R $GTKSTACK_ROOT/lib/charset.alias $Resources
255 # generate new Pango module file
258 ModulesPath=$GTKSTACK_ROOT/lib/pango/1.6.0/modules
260 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
263 # generate a new GDK pixbufs loaders file
264 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
266 # We rely on clearlooks, so include a version from our own build tree
267 # this one is special - we will set GTK_PATH to $Frameworks/gtkengines
269 GTK_ENGINE_DIR=$Frameworks/gtkengines/engines
270 mkdir -p $GTK_ENGINE_DIR
272 echo "Copying GTK engines ..."
273 cp $BUILD_ROOT/libs/clearlooks-newer/libclearlooks.dylib $Frameworks
274 (cd $GTK_ENGINE_DIR && ln -s ../../libclearlooks.dylib . && ln -s ../../libclearlooks.dylib libclearlooks.so)
276 cp $GTKSTACK_ROOT/lib/gtk-2.0/2.10.0/engines/libpixmap.so $Frameworks
277 (cd $GTK_ENGINE_DIR && ln -s ../../libpixmap.so)
280 if test x$WITH_LADSPA != x ; then
281 if test x$SAE != x ; then
283 elif test x$MIXBUS != x ; then
284 plugdir=mixbus_ladspa
288 if [ -d $plugdir -a "x$(ls $plugdir)" != x ] ; then
289 echo "Copying `ls $plugdir | wc -l` plugins ..."
290 cp -r $plugdir/* $Plugins
294 # Control Surface shared libraries
295 cp $BUILD_ROOT/libs/surfaces/*/libardour_*.dylib $Surfaces
296 cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks
299 cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
302 # Export Formats/Presets
303 for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do
304 cp "$f" $ExportFormats ;
307 # Session and Route templates
308 #for f in $BUILD_ROOT/../templates/* ; do
309 # if [ -d "$f" ] ; then
310 # cp -r "$f" $Templates ;
315 # got to be careful with names here
316 for x in $BUILD_ROOT/../midi_maps/*.map ; do
321 # got to be careful with names here
322 for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
327 # got to be careful with names here
328 for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
329 cp "$x" $MackieControl
332 # VAMP plugins that we use
333 cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.dylib $Frameworks
336 cp $ARDOURSTACK_ROOT/lib/suil-0/lib* $Frameworks
340 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Panners/*.dylib $Surfaces/*.dylib $Plugins/*.so ; do
341 if ! file $file | grep -qs Mach-O ; then
344 deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | grep -v 'libjack\.'`
346 for dep in $deps ; do
348 if ! test -f $Frameworks/$base; then
349 if echo $dep | grep -sq '^libs' ; then
350 cp $BUILD_ROOT/$dep $Frameworks
358 if test x$missing = xfalse ; then
359 # everything has been found
365 echo "Copying other stuff to $APPDIR ..."
367 #cp $BUILD_ROOT/gtk2_ardour/ergonomic-us.bindings $Resources
369 cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings $Resources
370 cp ../../gtk2_ardour/mixer.bindings $Resources
371 cp ../../gtk2_ardour/step_editing.bindings $Resources
372 cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
374 if test x$SAE != x ; then
375 cp $BUILD_ROOT/gtk2_ardour/SAE-de-keypad.bindings $Resources
376 cp $BUILD_ROOT/gtk2_ardour/SAE-de-nokeypad.bindings $Resources
377 cp $BUILD_ROOT/gtk2_ardour/SAE-us-keypad.bindings $Resources
378 cp $BUILD_ROOT/gtk2_ardour/SAE-us-nokeypad.bindings $Resources
379 cp $BUILD_ROOT/ardour_system_sae.rc $Resources/ardour_system.rc
380 echo cp $BUILD_ROOT/ardour_system_sae.rc $Resources/ardour_system.rc
381 cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
382 echo cp $BUILD_ROOT/instant.xml.sae $Resources/instant.xml
384 cp ../../ardour_system.rc $Resources/ardour_system.rc
385 cp ../../instant.xml $Resources/instant.xml
386 echo cp ../../instant.xml $Resources/instant.xml
388 cp ../../gtk2_ardour/ardour3_ui_default.conf $Resources
389 cp ../../gtk2_ardour/ardour3_ui_default.conf $Resources/ardour3_ui.conf
390 cp $BUILD_ROOT/gtk2_ardour/ardour3_ui_light.rc $Resources
391 cp $BUILD_ROOT/gtk2_ardour/ardour3_ui_dark.rc $Resources
393 cp -r ../../gtk2_ardour/icons $Resources
394 cp -r ../../gtk2_ardour/pixmaps $Resources
397 cp -R ../../gtk2_ardour/splash.png $Shared
398 cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared
400 # go through and recursively remove any .svn dirs in the bundle
401 for svndir in `find $APPDIR -name .svn -type dir`; do
405 # now fix up the executables
406 echo "Fixing up executable dependency names ..."
407 executables=$MAIN_EXECUTABLE
408 if test x$SAE != x ; then
409 executables="$executables"
412 for exe in $executables; do
413 EXE=$APPROOT/MacOS/$exe
415 for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
417 changes="$changes -change $lib @executable_path/../lib/$base"
419 if test "x$changes" != "x" ; then
420 install_name_tool $changes $EXE
424 echo "Fixing up library names ..."
425 # now do the same for all the libraries we include
426 for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners ; do
428 libbase=`basename $libdir`
430 for dylib in $libdir/*.dylib $libdir/*.so ; do
434 if test -L $dylib ; then
438 # change all the dependencies
441 for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
443 if echo $lib | grep -s libbase; then
444 changes="$changes -change $lib @executable_path/../$libbase/$base"
446 changes="$changes -change $lib @executable_path/../lib/$base"
450 if test "x$changes" != x ; then
451 if install_name_tool $changes $dylib ; then
458 # now the change what the library thinks its own name is
460 base=`basename $dylib`
461 install_name_tool -id @executable_path/../$libbase/$base $dylib
466 # and now ... the DMG
469 rm -rf $PRODUCT_PKG_DIR
470 mkdir $PRODUCT_PKG_DIR
472 if [ x$SAE != x ] ; then
476 echo "Creating SAE packaging directory"
477 mv $APPDIR $PRODUCT_PKG_DIR/Ardour3-SAE.app
478 cp HowToInstallArdourSAE.pdf "$PRODUCT_PKG_DIR/How To Install Ardour SAE.pdf"
479 cp SAE-de-keypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts (keypad).pdf"
480 cp SAE-de-nokeypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts.pdf"
482 elif [ x$MIXBUS != x ] ; then
486 echo "Creating Mixbus packaging directory"
487 mv $APPDIR $PRODUCT_PKG_DIR/
488 cp MixBus_Install_QuickStart.pdf "$PRODUCT_PKG_DIR/Mixbus Install & Quick Start Guide.pdf"
492 echo "Creating $APPNAME packaging directory"
493 mv $APPDIR $PRODUCT_PKG_DIR/
497 echo "Building DMG ..."
499 # UC_DMG=$APPNAME-${release_version}-${revision}-UC.dmg
500 # FINAL_DMG=$APPNAME-${release_version}-${revision}.dmg
501 UC_DMG=$APPNAME-${release_version}-${revision}.dmg
502 VOLNAME=$APPNAME-$release_version
505 MNTPATH=`mktemp -d -t ardourimg`
506 TMPDMG=`mktemp -t ardour`
507 ICNSTMP=`mktemp -t ardouricon`
508 DMGSIZE=$[ `du -sm "$PRODUCT_PKG_DIR" | cut -f 1` * 1049 / 1000 + 3 ]
510 rm -f $UC_DMG "$TMPDMG" "${TMPDMG}.dmg" "$ICNSTMP"
514 TMPDMG="${TMPDMG}.dmg"
516 hdiutil create -megabytes $DMGSIZE "$TMPDMG"
517 DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
518 newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
519 mount -t hfs "${DiskDevice}" "${MNTPATH}"
521 cp -r ${PRODUCT_PKG_DIR}/${APPDIR} "${MNTPATH}" || exit
522 mkdir "${MNTPATH}/.background"
523 cp -vi dmgbg.png "${MNTPATH}/.background/dmgbg.png"
525 echo "setting DMG background ..."
528 tell application "Finder"
529 tell disk "'${VOLNAME}'"
531 set current view of container window to icon view
532 set toolbar visible of container window to false
533 set statusbar visible of container window to false
534 set the bounds of container window to {400, 200, 800, 440}
535 set theViewOptions to the icon view options of container window
536 set arrangement of theViewOptions to not arranged
537 set icon size of theViewOptions to 64
538 set background picture of theViewOptions to file ".background:dmgbg.png"
539 make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
540 set position of item "'${APPDIR}'" of container window to {90, 100}
541 set position of item "Applications" of container window to {310, 100}
544 update without registering applications
551 chmod -Rf go-w "${MNTPATH}"
554 echo "compressing Image ..."
557 umount "${DiskDevice}"
558 hdiutil eject "${DiskDevice}"
559 # Create a read-only version, use zlib compression
560 hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
561 # Delete the temporary files
565 echo "setting file icon ..."
567 cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
568 /usr/bin/sips -i ${ICNSTMP}.icns
569 /Developer/Tools/DeRez -only icns ${ICNSTMP}.icns > ${ICNSTMP}.rsrc
570 /Developer/Tools/Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
571 /Developer/Tools/SetFile -a C "$UC_DMG"
573 rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
576 echo "packaging suceeded."