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