Merge branch 'main' into v2.17.x
[dcpomatic.git] / platform / osx / make_dmg.sh
1 #!/bin/bash
2 #
3 SYNTAX="make_dmg.sh -e <environment> -r <builddir> -i <apple-id> -p <apple-password> -a <arch1> [-a <arch2>] [-b <id>]"
4 #
5 # e.g. make_dmg.sh -e /Users/carl/osx-environment -r /Users/carl/cdist -i foo@bar.net -p opensesame -a x86_64/10.10 -a arm64/11.0 [-b dcpomatic2_player]
6
7 # Don't set -e here as egrep (used a few times) returns 1 if no matches
8 # were found.
9
10 BUILD="main kdm server batch player playlist combiner editor disk"
11 while getopts "e:r:i:p:a:b:" o; do
12         case "${o}" in
13                 e)
14                         ENV=${OPTARG}
15                         ;;
16                 r)
17                         ROOT=${OPTARG}
18                         ;;
19                 i)
20                         APPLE_ID=${OPTARG}
21                         ;;
22                 p)
23                         APPLE_PASSWORD=${OPTARG}
24                         ;;
25                 a)
26                         ARCHS+=("$OPTARG")
27                         ;;
28                 b)
29                         BUILD=${OPTARG}
30                         ;;
31         esac
32 done
33
34 # Use a tag if what we've built is exactly on one
35 version=$(git describe --tags --abbrev=0 --match=v2.*.* --exact-match 2> /dev/null)
36 if [ "$?" == "0" ]; then
37         version=$(echo $version | sed -e "s/^v//")
38 else
39         # Otherwise use <branch>-<commit>
40         version="$(basename $(git name-rev --name-only HEAD))-$(git rev-parse --short HEAD)"
41 fi
42
43 # DMG size in megabytes
44 DMG_SIZE=256
45
46 ARCH1=${ARCHS[0]}
47 ARCH2=${ARCHS[1]}
48
49 APPLICATION_IDENTITY="Developer ID Application: Carl Hetherington (R82DXSR997)"
50 INSTALLER_IDENTITY="Developer ID Installer: Carl Hetherington (R82DXSR997)"
51
52 # This is our work area for making up the .dmgs
53 mkdir -p build/platform/osx
54 cd build/platform/osx
55
56 cat <<EOF > entitlements.plist
57 <?xml version="1.0" encoding="UTF-8"?>
58 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
59 <plist version="1.0">
60 <dict>
61   <key>com.apple.security.cs.disable-library-validation</key>
62   <true/>
63   <key>com.apple.security.cs.allow-dyld-environment-variables</key>
64   <true/>
65 </dict>
66 </plist>
67 EOF
68
69 function copy {
70         if [ "$ARCH2" == "" ]; then
71                 for f in $1/$2; do
72                         if [ -h $f ]; then
73                                 ln -s $(readlink $f) "$3/`basename $f`"
74                         else
75                                 cp $f "$3/`basename $f`"
76                         fi
77                 done
78         else
79                 for f in $1/$ARCH2/$2; do
80                         if [ -h $f ]; then
81                                 ln -s $(readlink $f) "$3/`basename $f`"
82                         else
83                                 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
84                                 mkdir -p "$3"
85                                 lipo -create $f $g -output "$3/$(basename $f)"
86                         fi
87                 done
88         fi
89 }
90
91 function copy_lib_root {
92         if [ "$ARCH2" == "" ]; then
93                 for f in $ROOT/lib/$1*.dylib; do
94                         if [ -h $f ]; then
95                                 ln -s $(readlink $f) "$2/`basename $f`"
96                         else
97                                 cp $f "$2/`basename $f`"
98                         fi
99                 done
100         else
101                 for f in $ROOT/$ARCH2/lib/$1*.dylib; do
102                         if [ -h $f ]; then
103                                 ln -s $(readlink $f) "$2/`basename $f`"
104                         else
105                                 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
106                                 mkdir -p "$2"
107                                 lipo -create $f $g -output "$2/$(basename $f)"
108                         fi
109                 done
110         fi
111     to_relink="$to_relink|$1"
112 }
113
114 function copy_lib_env {
115         if [ "$ARCH2" == "" ]; then
116                 for f in $ENV/$ARCH1/lib/$1*.dylib; do
117                         if [ -h $f ]; then
118                                 ln -s $(readlink $f) "$2/`basename $f`"
119                         else
120                                 cp $f "$2/`basename $f`"
121                         fi
122                 done
123         else
124                 for f in $ENV/$ARCH2/lib/$1*.dylib; do
125                         if [ -h $f ]; then
126                                 ln -s $(readlink $f) "$2/`basename $f`"
127                         else
128                                 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
129                                 mkdir -p "$2"
130                                 lipo -create $f $g -output "$2/$(basename $f)"
131                         fi
132                 done
133         fi
134     to_relink="$to_relink|$1"
135 }
136
137 # @param #1 directory to copy to
138 function copy_libs {
139     local dest="$1"
140     copy_lib_root libcxml "$dest"
141     copy_lib_root libdcp-1.0 "$dest"
142     copy_lib_root libasdcp-carl "$dest"
143     copy_lib_root libkumu-carl "$dest"
144     copy_lib_root libsub "$dest"
145     copy_lib_root libopenjp2 "$dest"
146     copy_lib_root libavdevice "$dest"
147     copy_lib_root libavformat "$dest"
148     copy_lib_root libavfilter "$dest"
149     copy_lib_root libavutil "$dest"
150     copy_lib_root libavcodec "$dest"
151     copy_lib_root libswscale "$dest"
152     copy_lib_root libpostproc "$dest"
153     copy_lib_root libswresample "$dest"
154     copy_lib_root liblwext4 "$dest"
155     copy_lib_root libblockdev "$dest"
156     copy_lib_root libleqm_nrt "$dest"
157     copy $ROOT src/dcpomatic/build/src/lib/libdcpomatic2.dylib "$dest"
158     copy $ROOT src/dcpomatic/build/src/wx/libdcpomatic2-wx.dylib "$dest"
159     copy_lib_env libboost_atomic "$dest"
160     copy_lib_env libboost_system "$dest"
161     copy_lib_env libboost_filesystem "$dest"
162     copy_lib_env libboost_thread "$dest"
163     copy_lib_env libboost_date_time "$dest"
164     copy_lib_env libboost_locale "$dest"
165     copy_lib_env libboost_regex "$dest"
166     copy_lib_env libxml++ "$dest"
167     copy_lib_env libxslt "$dest"
168     copy_lib_env libxml2 "$dest"
169     copy_lib_env libglibmm-2.4 "$dest"
170     copy_lib_env libgobject "$dest"
171     copy_lib_env libgthread "$dest"
172     copy_lib_env libgmodule "$dest"
173     copy_lib_env libsigc "$dest"
174     copy_lib_env libglib-2 "$dest"
175     copy_lib_env libintl "$dest"
176     copy_lib_env libsndfile "$dest"
177     copy_lib_env libssh "$dest"
178     copy_lib_env libwx "$dest"
179     copy_lib_env libfontconfig "$dest"
180     copy_lib_env libfreetype "$dest"
181     copy_lib_env libexpat "$dest"
182     copy_lib_env libltdl "$dest"
183     copy_lib_env libxmlsec1 "$dest"
184     copy_lib_env libcurl "$dest"
185     copy_lib_env libffi "$dest"
186     copy_lib_env libpango "$dest"
187     copy_lib_env libcairo "$dest"
188     copy_lib_env libpixman "$dest"
189     copy_lib_env libharfbuzz "$dest"
190     copy_lib_env libsamplerate "$dest"
191     copy_lib_env libicui18n "$dest"
192     copy_lib_env libicudata "$dest"
193     copy_lib_env libicuio "$dest"
194     copy_lib_env libicutest "$dest"
195     copy_lib_env libicutu "$dest"
196     copy_lib_env libicuuc "$dest"
197     copy_lib_env libFLAC "$dest"
198     copy_lib_env libvorbis "$dest"
199     copy_lib_env libogg "$dest"
200     copy_lib_env libxerces-c "$dest"
201     copy_lib_env libcrypto "$dest"
202     copy_lib_env libssl "$dest"
203     copy_lib_env libfribidi "$dest"
204     copy_lib_env libgio "$dest"
205     copy_lib_env libz "$dest"
206         copy_lib_env libdav1d "$dest"
207 }
208
209 # @param #1 directory to copy to
210 function copy_resources {
211     local dest="$1"
212         if [ "$ARCH2" == "" ]; then
213                 local prefix=$ROOT
214         else
215                 local prefix=$ROOT/$ARCH1
216         fi
217     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_white.png "$dest"
218     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_black.png "$dest"
219     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
220     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
221     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
222     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
223     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
224     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_playlist.icns "$dest"
225     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_disk.icns "$dest"
226     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_combiner.icns "$dest"
227     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_editor.icns "$dest"
228     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults*.png "$dest"
229     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email*.png "$dest"
230     cp $prefix/src/dcpomatic/graphics/osx/preferences/email*.png "$dest"
231     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers*.png "$dest"
232     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms*.png "$dest"
233     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys*.png "$dest"
234     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet*.png "$dest"
235     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications*.png "$dest"
236     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound*.png "$dest"
237     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers*.png "$dest"
238     cp $prefix/src/dcpomatic/graphics/osx/preferences/general*.png "$dest"
239     cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced*.png "$dest"
240     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations*.png "$dest"
241     cp $prefix/src/dcpomatic/graphics/osx/preferences/non_standard*.png "$dest"
242     cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
243     cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
244     cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
245     cp $prefix/src/dcpomatic/fonts/fonts.conf.osx "$dest"/fonts.conf
246     cp $prefix/src/dcpomatic/graphics/splash.png "$dest"
247     cp $prefix/src/dcpomatic/graphics/zoom*.png "$dest"
248     cp $prefix/src/dcpomatic/graphics/zoom_all*.png "$dest"
249     cp $prefix/src/dcpomatic/graphics/select*.png "$dest"
250     cp $prefix/src/dcpomatic/graphics/snap*.png "$dest"
251     cp $prefix/src/dcpomatic/graphics/sequence*.png "$dest"
252     cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
253     cp $prefix/src/dcpomatic/graphics/link.png "$dest"
254     cp $prefix/src/dcpomatic/graphics/add*.png "$dest"
255     cp $prefix/src/dcpomatic/graphics/pause*.png "$dest"
256     cp -r $prefix/share/libdcp/xsd "$dest"
257     cp -r $prefix/share/libdcp/tags "$dest"
258     cp -r $prefix/share/libdcp/ratings "$dest"
259
260     # i18n: DCP-o-matic .mo files
261     for lang in de_DE es_ES fr_FR it_IT sv_SE nl_NL ru_RU pl_PL da_DK pt_PT pt_BR sk_SK cs_CZ uk_UA zh_CN tr_TR sl_SI hu_HU ka_KA fa_IR; do
262         mkdir -p "$dest/$lang/LC_MESSAGES"
263         cp $prefix/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
264         cp $prefix/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
265         cp $prefix/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
266     done
267
268     # i18n: wxWidgets .mo files
269     for lang in de es fr it sv nl ru pl da cs sl; do
270         mkdir "$dest/$lang"
271         cp $ENV/$ARCH1/share/locale/$lang/LC_MESSAGES/wxstd*.mo "$dest/$lang"
272     done
273 }
274
275 # param $1 list of things that link to other things
276 function relink_relative {
277     to_relink=`echo $to_relink | sed -e "s/\+//g"`
278     local linkers=("$@")
279
280         arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
281         arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
282
283         for arch in $arch1_name $arch2_name; do
284                 for obj in "${linkers[@]}"; do
285                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|@rpath|boost|libicu|libssh)"`
286                         changes=""
287                         for dep in $deps; do
288                                 base=`basename $dep`
289                                 changes="$changes -change $dep @executable_path/../Frameworks/$base"
290                         done
291                         if test "x$changes" != "x"; then
292                                 install_name_tool $changes -id `basename "$obj"` "$obj"
293                         fi
294                 done
295         done
296 }
297
298 # param $1 directory things should be relinked into
299 #       $2 list of things that link to other things
300 function relink_absolute {
301     to_relink=`echo $to_relink | sed -e "s/\+//g"`
302     target=$1
303     shift
304     local linkers=("$@")
305
306         arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
307         arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
308
309         for arch in $arch1_name $arch2_name; do
310                 for obj in "${linkers[@]}"; do
311                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
312                         for dep in $deps; do
313                                 base=`basename $dep`
314                                 install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
315                         done
316                 done
317         done
318 }
319
320 function sign {
321         codesign --verify --verbose=4 --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$1"
322         if [ "$?" != "0" ]; then
323                 echo "Failed to sign $1"
324                 exit 1
325         fi
326 }
327
328 # @param #1 .app directory
329 # @param #2 .pkg or ""
330 # @param #3 full name e.g. DCP-o-matic Batch Converter
331 # @param #4 list of executables
332 function make_dmg {
333     local appdir="$1"
334     local pkg="$2"
335     local full_name="$3"
336     local exes="$4"
337         tmp_dmg=dcpomatic_tmp.dmg
338         if [ "$ARCH2" == "" ]; then
339                 dmg="$full_name $version macOS10.8+.dmg"
340         else
341                 dmg="$full_name $version macOS10.10+.dmg"
342         fi
343     vol_name=DCP-o-matic-$version
344
345         find "$appdir/Contents/Frameworks" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
346                 sign "$f"
347         done
348         for f in $exes; do
349                 sign "$appdir/Contents/MacOS/$f"
350         done
351
352     if [ "$pkg" != "" ]; then
353         productsign --sign "$INSTALLER_IDENTITY" "$pkg" "signed_temp.pkg"
354         if [ "$?" != "0" ]; then
355             echo "Failed to sign .pkg"
356             exit 1
357         fi
358         mv signed_temp.pkg "$pkg"
359     fi
360
361     mkdir -p $vol_name
362     cp -a "$appdir" $vol_name
363     if [ "$pkg" != "" ]; then
364         cp -a "$pkg" $vol_name
365     fi
366     ln -s /Applications "$vol_name/Applications"
367     cat<<EOF > "$vol_name/READ ME.txt"
368 Welcome to DCP-o-matic!  The first time you run the program there may be
369 a long (several-minute) delay while macOS checks the code for viruses and
370 other malware.  Please be patient!
371 EOF
372     cat<<EOF > "$vol_name/READ ME.de_DE.txt"
373 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
374 Verifikationsvorgang auftreten.  Dies ist von der macOS Sicherheitsumgebung
375 'Gatekeeper' verursacht.  Dieser je nach Rechner teils minutenlange
376 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
377 es ist kein Programmfehler.  Warten sie die Verifikation für jede der
378 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
379 mehr auftreten.
380 EOF
381
382     if [ "$pkg" != "" ]; then
383         cat<<EOF > "$vol_name/READ ME.txt"
384
385 To run this software successfully you must install $pkg before running
386 the .app
387 EOF
388     fi
389
390     if [ "$pkg" != "" ]; then
391         cat<<EOF > "$vol_name/READ ME.de_DE.txt"
392
393 To run this software successfully you must install $pkg before running
394 the .app
395 EOF
396
397     fi
398     rm -f $tmp_dmg "$dmg"
399     hdiutil create -srcfolder $vol_name -volname $vol_name -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size $DMG_SIZE $tmp_dmg
400     attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
401     device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
402     sleep 5
403
404     echo '
405   tell application "Finder"
406     tell disk "'$vol_name'"
407            open
408            set current view of container window to icon view
409            set toolbar visible of container window to false
410            set statusbar visible of container window to false
411            set the bounds of container window to {400, 200, 1160, 600}
412            set the bounds of container window to {400, 200, 1160, 600}
413            set the bounds of container window to {400, 200, 1160, 600}
414            set theViewOptions to the icon view options of container window
415            set arrangement of theViewOptions to not arranged
416            set icon size of theViewOptions to 64
417            set position of item "'$appdir'" of container window to {90, 80}
418            set position of item "Applications" of container window to {265, 80}
419            set position of item "READ ME.txt" of container window to {430, 80}
420            set position of item "READ ME.de_DE.txt" of container window to {595, 80}
421            set position of item "DCP-o-matic Disk Writer.pkg" of container window to {90, 255}
422            close
423            open
424            update without registering applications
425            delay 5
426      end tell
427    end tell
428 ' | osascript
429
430     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
431     sync
432
433     hdiutil eject $device
434     hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
435     sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
436     DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
437     Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
438     SetFile -a C "$dmg"
439     xattr -c "$dmg"
440
441     set -e
442     codesign --timestamp --verify --verbose --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$dmg"
443     set +e
444
445     rm $tmp_dmg
446     rm -rf $vol_name
447 }
448
449 # @param #1 appdir
450 function setup {
451     appdir="$1"
452     approot="$appdir/Contents"
453     rm -rf "$appdir"
454     mkdir -p "$approot/MacOS"
455     mkdir -p "$approot/Frameworks"
456     mkdir -p "$approot/Resources"
457
458     to_relink="dcpomatic"
459     copy_libs "$approot/Frameworks"
460     copy_resources "$approot/Resources"
461 }
462
463 function copy_verify {
464         copy $ROOT src/libdcp/build/tools/dcpverify "$approot/MacOS"
465         mv "$approot/MacOS/dcpverify" "$approot/MacOS/dcpomatic2_verify"
466         rl=("$approot/MacOS/dcpomatic2_verify" "$approot/Frameworks/"*.dylib)
467         relink_relative "${rl[@]}"
468 }
469
470 function copy_kdm {
471         copy $ROOT src/libdcp/build/tools/dcpkdm "$approot/MacOS"
472         mv "$approot/MacOS/dcpkdm" "$approot/MacOS/dcpomatic2_kdm_inspect"
473         rl=("$approot/MacOS/dcpomatic2_kdm_inspect" "$approot/Frameworks/"*.dylib)
474         relink_relative "${rl[@]}"
475 }
476
477 if [ "$ARCH2" == "" ]; then
478         prefix=$ROOT
479 else
480         prefix=$ROOT/$ARCH2
481 fi
482
483 if [[ "$BUILD" == *main* ]]; then
484         # DCP-o-matic main
485         setup "DCP-o-matic 2.app"
486         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
487         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
488         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
489         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_map "$approot/MacOS"
490         copy $ROOT bin/ffprobe "$approot/MacOS"
491         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
492         copy_verify
493         copy_kdm
494         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
495         rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/dcpomatic2_map" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
496         relink_relative "${rl[@]}"
497         make_dmg "$appdir" "" "DCP-o-matic" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl ffprobe dcpomatic2_cli dcpomatic2_create dcpomatic2_map dcpomatic2"
498 fi
499
500 if [[ "$BUILD" == *kdm* ]]; then
501         # DCP-o-matic KDM Creator
502         setup "DCP-o-matic 2 KDM Creator.app"
503         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
504         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
505         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
506         copy_verify
507         copy_kdm
508         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
509         rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
510         relink_relative "${rl[@]}"
511         make_dmg "$appdir" "" "DCP-o-matic KDM Creator" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_kdm_cli dcpomatic2_kdm"
512 fi
513
514 if [[ "$BUILD" == *server* ]]; then
515         # DCP-o-matic Encode Server
516         setup "DCP-o-matic 2 Encode Server.app"
517         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
518         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
519         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
520         copy_verify
521         copy_kdm
522         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
523         rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
524         relink_relative "${rl[@]}"
525         make_dmg "$appdir" "" "DCP-o-matic Encode Server" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_server_cli dcpomatic2_server"
526 fi
527
528 if [[ "$BUILD" == *batch* ]]; then
529         # DCP-o-matic Batch Converter
530         setup "DCP-o-matic 2 Batch converter.app"
531         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
532         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
533         copy_verify
534         copy_kdm
535         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
536         rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
537         relink_relative "${rl[@]}"
538         make_dmg "$appdir" "" "DCP-o-matic Batch Converter" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_batch"
539 fi
540
541 if [[ "$BUILD" == *player* ]]; then
542         # DCP-o-matic Player
543         setup "DCP-o-matic 2 Player.app"
544         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
545         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
546         copy_verify
547         copy_kdm
548         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
549         rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
550         relink_relative "${rl[@]}"
551         make_dmg "$appdir" "" "DCP-o-matic Player" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_player"
552 fi
553
554 if [[ "$BUILD" == *playlist* ]]; then
555         # DCP-o-matic Playlist Editor
556         setup "DCP-o-matic 2 Playlist Editor.app"
557         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
558         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
559         copy_verify
560         copy_kdm
561         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
562         rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
563         relink_relative "${rl[@]}"
564         make_dmg "$appdir" "" "DCP-o-matic Playlist Editor" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_playlist"
565 fi
566
567 if [[ "$BUILD" == *combiner* ]]; then
568         # DCP-o-matic Combiner
569         setup "DCP-o-matic 2 Combiner.app"
570         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_combiner "$approot/MacOS"
571         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
572         copy_verify
573         copy_kdm
574         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_combiner.Info.plist "$approot/Info.plist"
575         rl=("$approot/MacOS/dcpomatic2_combiner" "$approot/Frameworks/"*.dylib)
576         relink_relative "${rl[@]}"
577         make_dmg "$appdir" "" "DCP-o-matic Combiner" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_combiner"
578 fi
579
580 if [[ "$BUILD" == *editor* ]]; then
581         # DCP-o-matic Editor
582         setup "DCP-o-matic 2 Editor.app"
583         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_editor "$approot/MacOS"
584         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
585         copy_verify
586         copy_kdm
587         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_editor.Info.plist "$approot/Info.plist"
588         rl=("$approot/MacOS/dcpomatic2_editor" "$approot/Frameworks/"*.dylib)
589         relink_relative "${rl[@]}"
590         make_dmg "$appdir" "" "DCP-o-matic Editor" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_editor"
591 fi
592
593 if [[ "$BUILD" == *disk* ]]; then 
594         # DCP-o-matic Disk Writer .app
595         setup "DCP-o-matic 2 Disk Writer.app"
596         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
597         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
598         copy_verify
599         copy_kdm
600         cp $prefix/src/dcpomatic/platform/osx/uninstall_disk.applescript "$approot/Resources"
601         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
602         rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
603         relink_relative "${rl[@]}"
604
605         # DCP-o-matic Disk Writer daemon .pkg
606
607         pkgbase=tmp-disk-writer
608         rm -rf $pkgbase
609         mkdir $pkgbase
610         pkgbin=$pkgbase/bin
611         pkgroot=$pkgbase/root
612
613         mkdir -p $pkgroot/Library/LaunchDaemons
614         cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
615 <?xml version="1.0" encoding="UTF-8"?>
616 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
617 <plist version="1.0">
618 <dict>
619     <key>Label</key>
620     <string>com.dcpomatic.disk.writer</string>
621     <key>ProgramArguments</key>
622     <array>
623         <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
624     </array>
625     <key>EnvironmentVariables</key>
626     <dict>
627         <key>DYLD_LIBRARY_PATH</key>
628         <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
629     </dict>
630     <key>StandardOutPath</key>
631     <string>/var/log/dcpomatic_disk_writer_out.log</string>
632     <key>StandardErrorPath</key>
633     <string>/var/log/dcpomatic_disk_writer_err.log</string>
634     <key>LaunchEvents</key>
635     <dict>
636         <key>com.apple.notifyd.matching</key>
637         <dict>
638             <key>com.dcpomatic.disk.writer.start</key>
639             <dict>
640                 <key>Notification</key>
641                 <string>com.dcpomatic.disk.writer.start</string>
642             </dict>
643         </dict>
644     </dict>
645 </dict>
646 </plist>
647 EOF
648
649         # Get the binaries together in $pkgbin then move them to the
650         # place with spaces in the filename to avoid some of the pain of escaping
651
652         mkdir $pkgbin
653         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
654         copy_libs "$pkgbin"
655
656         rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
657         relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
658
659         mkdir $pkgbase/scripts
660         cat > $pkgbase/scripts/postinstall <<EOF
661 #!/bin/sh
662 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
663 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
664 exit 0
665 EOF
666         chmod gou+x $pkgbase/scripts/postinstall
667
668         find "$pkgbin" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
669                 sign "$f"
670         done
671         sign "$pkgbin/dcpomatic2_disk_writer"
672
673         mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
674         mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
675         pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
676
677         make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_disk"
678 fi
679