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