ef744ebb362d9703077783f2e7681c855a7188d2
[ardour.git] / tools / osx_packaging / osx_build
1 #!/bin/bash
2
3 set -e
4
5 # script for pulling together a MacOSX app bundle.
6
7 GTKSTACK_ROOT=$HOME/gtk/inst
8 ARDOURSTACK_ROOT=$HOME/a3/inst
9 BUILD_ROOT=../../build
10
11 # where harvid and xjadeo binaries are cached
12 if test -z "$CACHEDIR" -o ! -d "$CACHEDIR"; then
13         CACHEDIR=/var/tmp
14 fi
15 mkdir -p "$CACHEDIR"
16
17 SAE=
18 MIXBUS=
19 MIXBUS32C=
20 WITH_HARVID=1
21 WITH_HARRISON_LV2=
22 WITH_X42_LV2=
23 WITH_LADSPA=1
24 STRIP=1
25 PRINT_SYSDEPS=
26 WITH_NLS=
27
28 : ${HARRISONCHANNELSTRIP=harrison_channelstrip}
29
30 . ../define_versions.sh
31
32 while [ $# -gt 0 ] ; do
33     echo "arg = $1"
34     case $1 in
35
36         #
37         # top level build targets
38         #
39
40         --sae)
41                 SAE=1 ;
42                 WITH_LADSPA=1;
43                 STRIP= ;
44                 PRODUCT_PKG_DIR=ArdourSAE ;
45                 APPNAME=Ardour ;
46                 shift ;;
47         --mixbus) MIXBUS=1;
48                 WITH_HARRISON_LV2=1 ;
49                 WITH_X42_LV2=1 ;
50                 WITH_NLS=1 ;
51                 SAE= ;
52                 WITH_LADSPA=;
53                 STRIP= ;
54                 PRODUCT_PKG_DIR=Mixbus;
55                 APPNAME=Mixbus ;
56                 shift ;;
57         --mixbus32c) MIXBUS=1;
58                 MIXBUS32C=1;
59                 WITH_HARRISON_LV2=1 ;
60                 WITH_X42_LV2=1 ;
61                 WITH_NLS=1 ;
62                 SAE= ;
63                 WITH_LADSPA=;
64                 STRIP= ;
65                 PRODUCT_PKG_DIR=Mixbus32C;
66                 APPNAME=Mixbus32C-${major_version} ;
67                 major_version=""
68                 shift ;;
69         --public)
70                 SAE= ;
71                 WITH_LADSPA=1;
72                 PRODUCT_PKG_DIR=Ardour;
73                 APPNAME=Ardour ;
74                 shift ;;
75         --allinone) SAE= ;
76                 WITH_LADSPA=1;
77                 STRIP= ;
78                 PRODUCT_PKG_DIR=Ardour ;
79                 shift ;;
80         --test) SAE= ; WITH_LADSPA=; STRIP= ; shift ;;
81
82         #
83         # specific build flags
84         #
85
86         --noharvid) WITH_HARVID= ; shift ;;
87         --noladspa) WITH_LADSPA= ; shift ;;
88         --nostrip) STRIP= ; shift ;;
89         --sysdeps) PRINT_SYSDEPS=1; shift ;;
90         --nls) WITH_NLS=1 ; shift ;;
91         --chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
92     esac
93 done
94
95 if test -z "$PRODUCT_PKG_DIR" -o -z "$APPNAME"; then
96         echo "application or product-name was not specified"
97         exit 1
98 fi
99
100 echo "Version is $release_version"
101 if [ "x$commit" != "x" ] ; then
102     info_string="$release_version ($commit) built on `hostname` by `whoami` on `date`"
103 else
104     info_string="$release_version built on `hostname` by `whoami` on `date`"
105 fi
106 echo "Info string is $info_string"
107
108 if [ x$DEBUG = xT ]; then
109         STRIP=
110         echo "Debug build, strip disabled"
111 else
112         if test x$STRIP != x ; then
113                 echo "No debug build, strip enabled"
114         else
115                 echo "No debug build, but strip disabled."
116         fi
117 fi
118
119 # setup directory structure
120
121 APPDIR=${APPNAME}${major_version}.app
122 APPROOT=$APPDIR/Contents
123 Frameworks=$APPROOT/lib
124 Resources=$APPROOT/Resources
125 #
126 # Since this is OS X, don't try to distinguish between etc and shared
127 # (machine dependent and independent data) - just put everything
128 # into Resources.
129
130 Shared=$Resources
131 Etc=$Resources
132 Locale=$Resources/locale
133 #
134 # Bundled Plugins live in a top level folder
135
136 Plugins=$APPROOT/Plugins
137 Surfaces=$Frameworks/surfaces
138 Panners=$Frameworks/panners
139 Backends=$Frameworks/backends
140 MidiMaps=$Shared/midi_maps
141 ExportFormats=$Shared/export
142 Templates=$Shared/templates
143 PatchFiles=$Shared/patchfiles
144 LuaScripts=$Shared/scripts
145 MackieControl=$Shared/mcp
146 Themes=$Shared/themes
147
148 if [ x$PRINT_SYSDEPS != x ] ; then
149 #
150 # print system dependencies
151 #
152
153 for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Plugins/*.so ; do
154         if ! file $file | grep -qs Mach-O ; then
155             continue
156         fi
157         otool -L $file | awk '{print $1}' | egrep -v "(^@executable_path|^Ardour[0-9][.0-9]*.app)" 
158     done | sort | uniq
159     exit 0
160 fi
161
162 echo "Removing old $APPDIR tree ..."
163
164 rm -rf $APPDIR
165
166 echo "Building new app directory structure ..."
167
168 # only bother to make the longest paths
169
170 mkdir -p $APPROOT/MacOS
171 mkdir -p $APPROOT/Resources
172 mkdir -p $Plugins
173 mkdir -p $Surfaces
174 mkdir -p $Panners
175 mkdir -p $Backends
176 mkdir -p $MidiMaps
177 mkdir -p $ExportFormats
178 mkdir -p $Templates
179 mkdir -p $Frameworks/modules
180 mkdir -p $Etc
181 mkdir -p $MackieControl
182 mkdir -p $PatchFiles
183 mkdir -p $LuaScripts
184 mkdir -p $Themes
185
186 # maybe set variables
187 env=""
188 if test x$SAE != x ; then
189     appname="Ardour${major_version}-SAE"
190     EXECUTABLE=${appname}
191     env="$env<key>ARDOUR_SAE</key><string>true</string>"
192     #
193     # current default for SAE version is German keyboard layout without a keypad
194     #
195     env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>de-nokeypad</string>"
196     env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui_sae.conf</string>"
197 elif test x$MIXBUS != x ; then
198     appname=$APPNAME
199     EXECUTABLE=${appname}${major_version}
200     env="$env<key>ARDOUR_MIXBUS</key><string>true</string>"
201     #
202     # current default for MIXBUS version is US keyboard layout without a keypad
203     #
204     env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>us-nokeypad</string>"
205     env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui.conf</string>"
206 else
207     appname="Ardour${major_version}"
208     EXECUTABLE=${appname}
209 fi
210
211 #
212 # if we're not going to bundle JACK, make sure we can find
213 # jack in the places where it might be
214 #
215
216 env="$env<key>PATH</key><string>/usr/local/bin:/opt/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>"
217 env="$env<key>DYLIB_FALLBACK_LIBRARY_PATH</key><string>/usr/local/lib:/opt/lib</string>"
218
219 env="<key>LSEnvironment</key><dict>$env<key>ARDOUR_BUNDLED</key><string>true</string></dict>"
220
221
222 # edit plist
223 sed -e "s?@ENV@?$env?g" \
224     -e "s?@VERSION@?$release_version?g" \
225     -e "s?@INFOSTRING@?$info_string?g" \
226     -e "s?@IDSUFFIX@?$EXECUTABLE?g" \
227     -e "s?@BUNDLENAME@?${APPNAME}${major_version}?g" \
228     -e "s?@EXECUTABLE@?$EXECUTABLE?g" < Info.plist.in > Info.plist
229 # and plist strings
230 sed -e "s?@APPNAME@?$appname?" \
231     -e "s?@ENV@?$env?g" \
232     -e "s?@VERSION@?$release_version?g" \
233     -e "s?@INFOSTRING@?$info_string?g" < InfoPlist.strings.in > Resources/InfoPlist.strings || exit 1
234
235 # copy static files
236
237 cp Info.plist $APPROOT
238 cp -R Resources $APPROOT
239
240 # ..and clean up
241 rm -f Info.plist
242 rm -f Resources/InfoPlist.strings
243
244 #
245 # if we build a bundle without jack, then
246 # make the Ardour executable a helper
247 # script that checks to see if JACK is
248 # installed.
249 #
250
251 cp startup_script $APPROOT/MacOS/$EXECUTABLE
252 chmod 775 $APPROOT/MacOS/$EXECUTABLE
253 MAIN_EXECUTABLE=Ardour.bin  ## used in startup_script
254
255 echo "Copying ardour executable ...."
256 cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTABLE
257 if test x$SAE != x ; then
258     # cp $BUILD_ROOT/gtk2_ardour/evtest $APPROOT/MacOS/gtkevents
259     cp  Ardour3-SAE.icns $Resources/appIcon.icns
260 elif test x$MIXBUS32C != x ; then
261     cp  Mixbus32C.icns $Resources/appIcon.icns
262 elif test x$MIXBUS != x ; then
263     cp  Mixbus.icns $Resources/appIcon.icns
264 else
265     cp  Ardour.icns $Resources/appIcon.icns
266 fi
267 cp  typeArdour.icns $Resources/
268
269 set +e # things below are not error-free (optional files etc) :(
270
271 # copy locale files
272 if test x$WITH_NLS != x ; then
273     echo "NLS support ..."
274     echo "I hope you remembered to run waf i18n"
275     LINGUAS=
276
277     for pkg in gtk2_ardour libs/ardour libs/gtkmm2ext ; do 
278         files=`find ../../$pkg -name "*.mo"`
279         
280             #
281             # the package name is appended with a number so that
282             # it can be parallel installed during a regular install
283             # with older (and newer) versions. it is just the major
284             # number of the release (i.e. leading digits)
285             #
286         
287         vsuffix=`echo $release_version | sed 's/^\([0-9][0-9]*\).*/\1/'`
288         
289         if [ -z "$files" ]; then
290             echo ""
291             echo "!!!! WARNING !!!! - Did not find any .mo files in ../../$pkg"
292             echo ""
293         fi
294         
295         for file in $files 
296         do
297             echo $file
298             lang=`basename $file | sed 's/\.mo//'`
299             mkdir -p $Locale/$lang/LC_MESSAGES
300             cp $file $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
301             echo copy $file to $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
302             if echo $LINGUAS | grep $lang >/dev/null 2>&1 ; then
303                 :
304             else 
305                 LINGUAS="$LINGUAS $lang"
306             fi
307         done
308     done
309
310     for l in $LINGUAS
311     do
312       if [ -d $GTKSTACK_ROOT/share/locale/$l ] ; then
313           echo "Copying GTK i18n files for $l..."
314           cp -r $GTKSTACK_ROOT/share/locale/$l $Locale
315       else
316           # try with just the language spec
317           just_lang=`echo $l | sed 's/_[A-Z][A-Z]$//'`
318           if [ -d $GTKSTACK_ROOT/share/locale/$just_lang ] ; then
319               echo "Copying GTK i18n files for $l..."
320               cp -r $GTKSTACK_ROOT/share/locale/$just_lang $Locale
321           fi
322       fi
323     done
324 else
325     echo "Skipping NLS support"
326 fi
327
328 #
329 # Copy stuff that may be dynamically loaded
330
331
332 cp -R $GTKSTACK_ROOT/etc/* $Etc
333 cp -R $GTKSTACK_ROOT/lib/charset.alias $Resources
334
335 # We rely on clearlooks, so include a version from our own build tree
336 # this one is special - we will set GTK_PATH to $Frameworks/gtkengines
337
338 GTK_ENGINE_DIR=$Frameworks/gtkengines/engines
339 mkdir -p $GTK_ENGINE_DIR
340
341 echo "Copying GTK engines ..."
342 cp $BUILD_ROOT/libs/clearlooks-newer/libclearlooks.dylib $Frameworks
343 (cd $GTK_ENGINE_DIR && ln -s ../../libclearlooks.dylib . && ln -s ../../libclearlooks.dylib libclearlooks.so)
344
345 cp $GTKSTACK_ROOT/lib/gtk-2.0/2.10.0/engines/libpixmap.so $Frameworks
346 (cd $GTK_ENGINE_DIR && ln -s ../../libpixmap.so)
347
348
349 if test x$WITH_LADSPA != x ; then
350     if test x$SAE != x ; then
351         plugdir=sae_ladspa
352     elif test x$MIXBUS != x ; then
353         plugdir=mixbus_ladspa
354     else
355         plugdir=ladspa
356     fi
357     if [ -d $plugdir -a "x$(ls $plugdir)" != x ] ; then 
358         echo "Copying `ls $plugdir | wc -l` plugins ..."
359         cp -r $plugdir/* $Plugins
360     fi
361 fi
362
363 # Control Surface shared libraries
364 cp $BUILD_ROOT/libs/surfaces/*/libardour_*.dylib $Surfaces
365 cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks
366
367 # Panners
368 cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
369
370 # Backends
371 for backend in jack wavesaudio dummy coreaudio; do
372     cp $BUILD_ROOT/libs/backends/$backend/lib*.dylib $Backends
373 done
374
375 # Export Formats/Presets
376 for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do 
377     cp "$f" $ExportFormats ; 
378 done
379
380 # Session and Route templates
381 #for f in $BUILD_ROOT/../templates/* ; do 
382 #    if [ -d "$f" ] ; then
383 #        cp -r "$f" $Templates ; 
384 #    fi
385 #done
386
387 # MidiMaps
388 # got to be careful with names here
389 for x in $BUILD_ROOT/../midi_maps/*.map ; do
390     cp "$x" $MidiMaps
391 done
392
393 # MIDNAM Patch Files
394 # got to be careful with names here
395 for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
396     cp "$x" $PatchFiles
397 done
398
399 # Lua Script Files
400 # got to be careful with names here
401 for x in $BUILD_ROOT/../scripts/*.lua ; do
402     cp "$x" $LuaScripts
403 done
404
405 # MackieControl data
406 # got to be careful with names here
407 for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
408     cp "$x" $MackieControl
409 done
410
411 # VAMP plugins that we use
412 cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.dylib $Frameworks
413
414 # Suil modules (new dir 'build-stack')
415 if test -d $GTKSTACK_ROOT/lib/suil-0/ ; then
416     cp $GTKSTACK_ROOT/lib/suil-0/lib* $Frameworks
417 fi
418
419 # Suil modules (old dir 'build-ardour-stack')
420 if test -d $ARDOURSTACK_ROOT/lib/suil-0/ ; then
421     cp $ARDOURSTACK_ROOT/lib/suil-0/lib* $Frameworks
422 fi
423
424 # VST scanner app and wrapper script, if they exist
425 if test -d $BUILD_ROOT/libs/fst ; then
426     cp $BUILD_ROOT/libs/fst/ardour-vst-scanner* $Frameworks/
427 fi
428
429 # vfork wrapper
430 if test -f $BUILD_ROOT/libs/vfork/ardour-exec-wrapper ; then
431     mkdir -p $Frameworks/vfork
432     cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $Frameworks/
433 fi
434
435 # TODO check if this is still needed, even when building on 10.5
436 if file $BUILD_ROOT/gtk2_ardour/ardour-$release_version | grep -q ppc; then
437 STDCPP='|libstdc\+\+'
438 else
439 STDCPP=
440 fi
441
442 while [ true ] ; do 
443     missing=false
444     for file in $APPROOT/MacOS/* $Frameworks/* $Frameworks/modules/* $Panners/*.dylib $Backends/*.dylib $Surfaces/*.dylib $Plugins/*.so ; do 
445         if ! file $file | grep -qs Mach-O ; then
446             continue
447         fi
448         # libffi contains "S" (other section symbols) that should not be stripped.
449         if [[ $file == *"libffi"* ]] ; then
450             continue
451         fi
452
453         if test x$STRIP != x ; then
454                 strip -u -r -arch all $file &>/dev/null
455         fi
456
457         deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | grep -v 'libjack\.' | grep -v "$(basename $file)"`
458         # echo -n "."
459         for dep in $deps ; do
460             base=`basename $dep`
461             if ! test -f $Frameworks/$base; then
462                 if echo $dep | grep -sq '^libs' ; then
463                     cp $BUILD_ROOT/$dep $Frameworks
464                 else
465                     cp $dep $Frameworks
466                 fi
467                 missing=true
468             fi
469         done
470     done
471     if test x$missing = xfalse ; then
472         # everything has been found
473         break
474     fi
475 done
476 echo
477
478 echo "Copying other stuff to $APPDIR  ..."
479
480 cp $BUILD_ROOT/gtk2_ardour/ardour.keys  $Resources
481 cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
482 cp $BUILD_ROOT/gtk2_ardour/default_ui_config $Resources
483 cp $BUILD_ROOT/gtk2_ardour/clearlooks.rc $Resources
484
485 # Copied directly from source tree
486
487 mkdir ${Resources}/icons
488 mkdir ${Resources}/resources
489 cp ../../system_config $Resources/system_config
490 cp ../../instant.xml $Resources/instant.xml
491 cp ../../gtk2_ardour/icons/*.png ${Resources}/icons/
492 cp -r ../../gtk2_ardour/icons/cursor_* ${Resources}/icons/
493 cp ../../gtk2_ardour/ArdourMono.ttf $Shared
494 cp ../../gtk2_ardour/resources/${PRODUCT_PKG_DIR}-* ${Resources}/resources/
495
496
497 # Themes: only install those named for this app
498 lower_case_appname=`echo $APPNAME | tr '[:upper:]' '[:lower:]'`
499 for colorfile in `echo ../../gtk2_ardour/themes/*-${lower_case_appname}.colors`
500 do
501     cf=`basename $colorfile`
502     cf=`echo $cf | sed -e "s/-${lower_case_appname}//"`
503     cp $colorfile $Themes/$cf
504 done
505
506 # go through and recursively remove any .svn dirs in the bundle
507 for svndir in `find $APPDIR -name .svn -type dir`; do
508     rm -rf $svndir
509 done
510
511 # install bundled LV2s to <app>/Contents/lib/LV2/
512 cp -R $BUILD_ROOT/libs/LV2 $Frameworks/
513
514 # lv2 core, classifications etc - TODO check if we need the complete LV2 ontology
515 if test -d $ARDOURSTACK_ROOT/lib/lv2/lv2core.lv2 ; then
516         cp -R $ARDOURSTACK_ROOT/lib/lv2/lv2core.lv2 $Frameworks/LV2/
517 elif test -d $GTKSTACK_ROOT/lib/lv2/lv2core.lv2 ; then
518         cp -R $GTKSTACK_ROOT/lib/lv2/lv2core.lv2 $Frameworks/LV2/
519 fi
520
521
522 # now fix up the executables
523 echo "Fixing up executable dependency names ..."
524 executables=$MAIN_EXECUTABLE
525 if test x$SAE != x ; then
526     executables="$executables"
527 fi
528
529 for exe in $executables; do
530     EXE=$APPROOT/MacOS/$exe
531     changes=""
532     for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
533       base=`basename $lib`
534       changes="$changes -change $lib @executable_path/../lib/$base"
535     done
536     if test "x$changes" != "x" ; then
537         install_name_tool $changes $EXE
538     fi
539 done
540
541 echo "Fixing up library names ..."
542 # now do the same for all the libraries we include
543 for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends $Frameworks/LV2/* ; do
544
545     libbase=`basename $libdir`
546     
547     for dylib in $libdir/*.dylib $libdir/*.so ; do
548         
549        # skip symlinks
550         
551         if test -L $dylib ; then
552             continue
553         fi
554         
555         # change all the dependencies
556         
557         changes=""
558         for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
559             base=`basename $lib`
560             if echo $lib | grep -s libbase; then
561                 changes="$changes -change $lib @executable_path/../$libbase/$base"
562             else
563                 changes="$changes -change $lib @executable_path/../lib/$base"
564             fi
565         done
566         
567         if test "x$changes" != x ; then
568             if  install_name_tool $changes $dylib ; then
569                 :
570             else
571                 exit 1
572             fi
573         fi
574         
575         # now the change what the library thinks its own name is
576         
577         base=`basename $dylib`
578         install_name_tool -id @executable_path/../$libbase/$base $dylib
579     done
580 done
581
582 #
583 # and now ... the DMG
584
585
586 rm -rf $PRODUCT_PKG_DIR
587 mkdir $PRODUCT_PKG_DIR
588
589 DMGWINBOTTOM=440
590 DMGBACKGROUND=dmgbg
591
592 if [ x$SAE != x ] ; then
593         
594     # SAE packaging
595     
596     echo "Creating SAE packaging directory"
597     mv $APPDIR $PRODUCT_PKG_DIR/Ardour3-SAE.app
598     cp HowToInstallArdourSAE.pdf "$PRODUCT_PKG_DIR/How To Install Ardour SAE.pdf"
599     cp SAE-de-keypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts (keypad).pdf"
600     cp SAE-de-nokeypad.pdf "$PRODUCT_PKG_DIR/Ardour SAE Shortcuts.pdf"
601     
602 elif [ x$MIXBUS != x ] ; then
603
604      # Mixbus packaging
605
606     echo "Creating Mixbus packaging directory"
607     mv $APPDIR $PRODUCT_PKG_DIR/
608     DMGBACKGROUND=dmgbgMB
609 else 
610
611     echo "Creating $APPNAME packaging directory"
612     mv $APPDIR $PRODUCT_PKG_DIR/
613
614 fi
615
616 if file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q x86_64; then
617         OSX_ARCH=x86_64
618         OSX_BENSID=osx64
619 elif file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q ppc; then
620         OSX_ARCH=ppc
621         OSX_BENSID=osxppc
622 else
623         OSX_ARCH=i386
624         OSX_BENSID=osx32
625 fi
626
627 if test x$WITH_HARRISON_LV2 != x ; then
628         curl -s -S --fail -#  \
629                 -z "${CACHEDIR}/harrison_lv2s.${OSX_BENSID}.zip" \
630                 -o "${CACHEDIR}/harrison_lv2s.${OSX_BENSID}.zip" \
631                 "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_lv2s.${OSX_BENSID}.zip"
632
633         mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
634         bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
635                 "${CACHEDIR}/harrison_lv2s.${OSX_BENSID}.zip"
636 fi
637
638 if test x$WITH_HARVID != x ; then
639         echo "installing video tools.."
640         HARVID_VERSION=$(curl -s -S http://ardour.org/files/video-tools/harvid_version.txt)
641         XJADEO_VERSION=$(curl -s -S http://ardour.org/files/video-tools/xjadeo_version.txt)
642         MULTIARCH=osx
643         echo "copying harvid and xjadeo ..."
644
645         rsync -Pa \
646                 rsync://ardour.org/video-tools/harvid-osx-${HARVID_VERSION}.tgz \
647                 "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz"
648
649         rsync -Pa \
650                 rsync://ardour.org/video-tools/jadeo-${XJADEO_VERSION:1}.dmg \
651                 "$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg"
652
653         tar -x -z \
654                 -C $PRODUCT_PKG_DIR/$APPROOT \
655                 -f "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz" || exit 1
656
657         JADEO=$(hdiutil attach "$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg" | grep Apple_HFS | grep dev/ | cut -f 3)
658         cp -r "${JADEO}/Jadeo.app" "$PRODUCT_PKG_DIR/"
659         hdiutil detach "${JADEO}"
660
661         XJCONTENT=${PRODUCT_PKG_DIR}/Jadeo.app/Contents
662         HVLIBS=${PRODUCT_PKG_DIR}/$APPROOT/lib/harvid
663
664         for file in ${XJCONTENT}/MacOS/Jadeo-bin ${XJCONTENT}/Frameworks/*.dylib ${HVLIBS}/*.dylib ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/*harvid* ; do
665                 lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin && \
666                 mv ${file}.thin ${file}
667         done
668
669         DMGWINBOTTOM=580
670         YPOS=$[ $DMGWINBOTTOM - 300 ]
671         XJADEOPOS="set position of item \"Jadeo.app\" of container window to {310, ${YPOS}}"
672
673         DMGBACKGROUND=${DMGBACKGROUND}xj
674 fi
675
676 ################################################################################
677 ### Mixbus plugins, etc
678 if test x$WITH_X42_LV2 != x ; then
679         echo "bundling x42 plugins"
680         mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
681
682         for proj in x42-meters x42-midifilter x42-midimap x42-stereoroute x42-eq setBfree; do
683                 X42_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/${proj}.latest.txt)
684                 rsync -a -q --partial \
685                         rsync://x42-plugins.com/x42/osx/${proj}-lv2-osx-${X42_VERSION}.zip \
686                         "$CACHEDIR/${proj}-lv2-osx-${X42_VERSION}.zip"
687                 bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
688                         "$CACHEDIR/${proj}-lv2-osx-${X42_VERSION}.zip"
689         done
690
691         for file in ${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/*/*.dylib ; do
692                 lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin
693                 mv ${file}.thin ${file}
694         done
695 fi
696
697 if test -n "$MIXBUS"; then
698         echo "deploying harrison channelstrip for $OSX_BENSID"
699
700         mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip"
701
702         curl -s -S --fail -#  \
703                 -z "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
704                 -o "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
705                 "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so"
706
707         cp "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
708                 "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip/${HARRISONCHANNELSTRIP}.so"
709
710         echo "deploying harrison vamp plugins for $OSX_BENSID"
711
712         curl -s -S --fail -#  \
713                 -z "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
714                 -o "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
715                 "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_vamp.${OSX_BENSID}.dylib"
716
717         cp "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
718                 "${PRODUCT_PKG_DIR}/${APPROOT}/lib/harrison_vamp.dylib"
719 fi
720 ################################################################################
721
722 ( cd $PRODUCT_PKG_DIR ; find . ) > file_list.txt
723
724 echo "Building DMG ..."
725
726 # UC_DMG=$APPNAME-${release_version}-UC.dmg
727 # FINAL_DMG=$APPNAME-${release_version}.dmg
728
729 if [ x$DEBUG = xT ]; then
730         UC_DMG=$APPNAME-$release_version-dbg.dmg
731 else
732         UC_DMG=$APPNAME-$release_version.dmg
733 fi
734 VOLNAME=$APPNAME-$release_version
735
736 MNTPATH=`mktemp -d -t ardourimg`
737 TMPDMG=`mktemp -t ardour`
738 ICNSTMP=`mktemp -t ardouricon`
739 EXTRA_SPACE_MB=30
740 DMGMEGABYTES=$[ `du -sk "$PRODUCT_PKG_DIR" | cut -f 1` * 1024 / 1048576 + $EXTRA_SPACE_MB ]
741
742 echo "DMG MB = " $DMGMEGABYTES
743
744 rm -f $UC_DMG "$TMPDMG" "${TMPDMG}.dmg" "$ICNSTMP"
745 rm -rf "$MNTPATH"
746 mkdir -p "$MNTPATH"
747
748 TMPDMG="${TMPDMG}.dmg"
749
750 trap "rm -rf $MNTPATH $TMPDMG ${TMPDMG}.dmg $ICNSTMP" EXIT
751
752 hdiutil create -megabytes $DMGMEGABYTES -fs HFS+ -volname "${VOLNAME}" "$TMPDMG"
753 DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
754 mount -t hfs -o nobrowse "${DiskDevice}" "${MNTPATH}"
755
756 cp -r ${PRODUCT_PKG_DIR}/* "${MNTPATH}" || exit
757 mkdir "${MNTPATH}/.background"
758 cp -vi ${DMGBACKGROUND}.png "${MNTPATH}/.background/dmgbg.png"
759
760 echo "setting DMG background ..."
761
762 if test $(sw_vers -productVersion | cut -d '.' -f 2) -lt 9; then
763         # OSX ..10.8.X
764         DISKNAME=${VOLNAME}
765 else
766         # OSX 10.9.X and later
767         DISKNAME=`basename "${MNTPATH}"`
768 fi
769
770 osascript << EOF
771   tell application "Finder"
772     activate
773     tell disk "${DISKNAME}"
774       open
775       delay 2
776       set current view of container window to icon view
777       set toolbar visible of container window to false
778       set statusbar visible of container window to false
779       set the bounds of container window to {400, 200, 800, ${DMGWINBOTTOM}}
780       set theViewOptions to the icon view options of container window
781       set arrangement of theViewOptions to not arranged
782       set icon size of theViewOptions to 64
783       set background picture of theViewOptions to file ".background:dmgbg.png"
784       make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
785       set position of item "${APPDIR}" of container window to {90, 100}
786       set position of item "Applications" of container window to {310, 100}
787       ${MIXBUSPOS}
788       ${HARVIDPOS}
789       ${XJADEOPOS}
790       close
791       open
792       update without registering applications
793       delay 5
794       eject
795     end tell
796   end tell
797 EOF
798
799 chmod -Rf go-w "${MNTPATH}"
800 sync
801
802 set -e
803 echo "compressing Image ..."
804
805 # Umount the image ('eject' above may already have done that)
806 umount "${DiskDevice}" || true
807 hdiutil eject "${DiskDevice}" || true
808 # Create a read-only version, use zlib compression
809 hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
810
811 if test $(sw_vers -productVersion | cut -d '.' -f 2) -gt 5; then
812 echo "setting file icon ..."
813
814 cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
815 sips -i ${ICNSTMP}.icns
816 DeRez -only icns ${ICNSTMP}.icns > ${ICNSTMP}.rsrc
817 Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
818 SetFile -a C "$UC_DMG"
819
820 rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
821 fi
822
823 rm -rf ${PRODUCT_PKG_DIR}
824
825 echo
826 echo "packaging suceeded."
827 ls -l "$UC_DMG"
828
829 echo "Done."
830 exit