40eabef1fd8a48386904a127c59de2d263d27133
[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_system "$dest"
160     copy_lib_env libboost_filesystem "$dest"
161     copy_lib_env libboost_thread "$dest"
162     copy_lib_env libboost_date_time "$dest"
163     copy_lib_env libboost_locale "$dest"
164     copy_lib_env libboost_regex "$dest"
165     copy_lib_env libxml++ "$dest"
166     copy_lib_env libxslt "$dest"
167     copy_lib_env libxml2 "$dest"
168     copy_lib_env libglibmm-2.4 "$dest"
169     copy_lib_env libgobject "$dest"
170     copy_lib_env libgthread "$dest"
171     copy_lib_env libgmodule "$dest"
172     copy_lib_env libsigc "$dest"
173     copy_lib_env libglib-2 "$dest"
174     copy_lib_env libintl "$dest"
175     copy_lib_env libsndfile "$dest"
176     copy_lib_env libssh "$dest"
177     copy_lib_env libwx "$dest"
178     copy_lib_env libfontconfig "$dest"
179     copy_lib_env libfreetype "$dest"
180     copy_lib_env libexpat "$dest"
181     copy_lib_env libltdl "$dest"
182     copy_lib_env libxmlsec1 "$dest"
183     copy_lib_env libcurl "$dest"
184     copy_lib_env libffi "$dest"
185     copy_lib_env libpango "$dest"
186     copy_lib_env libcairo "$dest"
187     copy_lib_env libpixman "$dest"
188     copy_lib_env libharfbuzz "$dest"
189     copy_lib_env libsamplerate "$dest"
190     copy_lib_env libicui18n "$dest"
191     copy_lib_env libicudata "$dest"
192     copy_lib_env libicuio "$dest"
193     copy_lib_env libicutest "$dest"
194     copy_lib_env libicutu "$dest"
195     copy_lib_env libicuuc "$dest"
196     copy_lib_env libFLAC "$dest"
197     copy_lib_env libvorbis "$dest"
198     copy_lib_env libogg "$dest"
199     copy_lib_env libxerces-c "$dest"
200     copy_lib_env libcrypto "$dest"
201     copy_lib_env libssl "$dest"
202     copy_lib_env libfribidi "$dest"
203     copy_lib_env libgio "$dest"
204     copy_lib_env libz "$dest"
205         copy_lib_env libdav1d "$dest"
206 }
207
208 # @param #1 directory to copy to
209 function copy_resources {
210     local dest="$1"
211         if [ "$ARCH2" == "" ]; then
212                 local prefix=$ROOT
213         else
214                 local prefix=$ROOT/$ARCH1
215         fi
216     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_white.png "$dest"
217     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_black.png "$dest"
218     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
219     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
220     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
221     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
222     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
223     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_playlist.icns "$dest"
224     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_disk.icns "$dest"
225     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_combiner.icns "$dest"
226     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_editor.icns "$dest"
227     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults*.png "$dest"
228     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email*.png "$dest"
229     cp $prefix/src/dcpomatic/graphics/osx/preferences/email*.png "$dest"
230     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers*.png "$dest"
231     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms*.png "$dest"
232     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys*.png "$dest"
233     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet*.png "$dest"
234     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications*.png "$dest"
235     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound*.png "$dest"
236     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers*.png "$dest"
237     cp $prefix/src/dcpomatic/graphics/osx/preferences/general*.png "$dest"
238     cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced*.png "$dest"
239     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations*.png "$dest"
240     cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
241     cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
242     cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
243     cp $prefix/src/dcpomatic/fonts/fonts.conf.osx "$dest"/fonts.conf
244     cp $prefix/src/dcpomatic/graphics/splash.png "$dest"
245     cp $prefix/src/dcpomatic/graphics/zoom*.png "$dest"
246     cp $prefix/src/dcpomatic/graphics/zoom_all*.png "$dest"
247     cp $prefix/src/dcpomatic/graphics/select*.png "$dest"
248     cp $prefix/src/dcpomatic/graphics/snap*.png "$dest"
249     cp $prefix/src/dcpomatic/graphics/sequence*.png "$dest"
250     cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
251     cp $prefix/src/dcpomatic/graphics/link.png "$dest"
252     cp $prefix/src/dcpomatic/graphics/tick.png "$dest"
253     cp $prefix/src/dcpomatic/graphics/no_tick.png "$dest"
254     cp -r $prefix/share/libdcp/xsd "$dest"
255     cp -r $prefix/share/libdcp/tags "$dest"
256     cp -r $prefix/share/libdcp/ratings "$dest"
257
258     # i18n: DCP-o-matic .mo files
259     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; do
260         mkdir -p "$dest/$lang/LC_MESSAGES"
261         cp $prefix/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
262         cp $prefix/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
263         cp $prefix/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
264     done
265
266     # i18n: wxWidgets .mo files
267     for lang in de es fr it sv nl ru pl da cs sl; do
268         mkdir "$dest/$lang"
269         cp $ENV/$ARCH1/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
270     done
271 }
272
273 # param $1 list of things that link to other things
274 function relink_relative {
275     to_relink=`echo $to_relink | sed -e "s/\+//g"`
276     local linkers=("$@")
277
278         arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
279         arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
280
281         for arch in $arch1_name $arch2_name; do
282                 for obj in "${linkers[@]}"; do
283                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|@rpath|boost|libicu|libssh)"`
284                         changes=""
285                         for dep in $deps; do
286                                 base=`basename $dep`
287                                 changes="$changes -change $dep @executable_path/../Frameworks/$base"
288                         done
289                         if test "x$changes" != "x"; then
290                                 install_name_tool $changes -id `basename "$obj"` "$obj"
291                         fi
292                 done
293         done
294 }
295
296 # param $1 directory things should be relinked into
297 #       $2 list of things that link to other things
298 function relink_absolute {
299     to_relink=`echo $to_relink | sed -e "s/\+//g"`
300     target=$1
301     shift
302     local linkers=("$@")
303
304         arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
305         arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
306
307         for arch in $arch1_name $arch2_name; do
308                 for obj in "${linkers[@]}"; do
309                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
310                         for dep in $deps; do
311                                 base=`basename $dep`
312                                 install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
313                         done
314                 done
315         done
316 }
317
318 function sign {
319         codesign --verify --verbose=4 --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$1"
320         if [ "$?" != "0" ]; then
321                 echo "Failed to sign $1"
322                 exit 1
323         fi
324 }
325
326 # @param #1 .app directory
327 # @param #2 .pkg or ""
328 # @param #3 full name e.g. DCP-o-matic Batch Converter
329 # @param #4 list of executables
330 function make_dmg {
331     local appdir="$1"
332     local pkg="$2"
333     local full_name="$3"
334     local exes="$4"
335         tmp_dmg=dcpomatic_tmp.dmg
336         if [ "$ARCH2" == "" ]; then
337                 dmg="$full_name $version macOS10.8+.dmg"
338         else
339                 dmg="$full_name $version macOS10.10+.dmg"
340         fi
341     vol_name=DCP-o-matic-$version
342
343         find "$appdir/Contents/Frameworks" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
344                 sign "$f"
345         done
346         for f in $exes; do
347                 sign "$appdir/Contents/MacOS/$f"
348         done
349
350     if [ "$pkg" != "" ]; then
351         productsign --sign "$INSTALLER_IDENTITY" "$pkg" "signed_temp.pkg"
352         if [ "$?" != "0" ]; then
353             echo "Failed to sign .pkg"
354             exit 1
355         fi
356         mv signed_temp.pkg "$pkg"
357     fi
358
359     mkdir -p $vol_name
360     cp -a "$appdir" $vol_name
361     if [ "$pkg" != "" ]; then
362         cp -a "$pkg" $vol_name
363     fi
364     ln -s /Applications "$vol_name/Applications"
365     cat<<EOF > "$vol_name/READ ME.txt"
366 Welcome to DCP-o-matic!  The first time you run the program there may be
367 a long (several-minute) delay while macOS checks the code for viruses and
368 other malware.  Please be patient!
369 EOF
370     cat<<EOF > "$vol_name/READ ME.de_DE.txt"
371 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
372 Verifikationsvorgang auftreten.  Dies ist von der macOS Sicherheitsumgebung
373 'Gatekeeper' verursacht.  Dieser je nach Rechner teils minutenlange
374 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
375 es ist kein Programmfehler.  Warten sie die Verifikation für jede der
376 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
377 mehr auftreten.
378 EOF
379
380     if [ "$pkg" != "" ]; then
381         cat<<EOF > "$vol_name/READ ME.txt"
382
383 To run this software successfully you must install $pkg before running
384 the .app
385 EOF
386     fi
387
388     if [ "$pkg" != "" ]; then
389         cat<<EOF > "$vol_name/READ ME.de_DE.txt"
390
391 To run this software successfully you must install $pkg before running
392 the .app
393 EOF
394
395     fi
396     rm -f $tmp_dmg "$dmg"
397     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
398     attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
399     device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
400     sleep 5
401
402     echo '
403   tell application "Finder"
404     tell disk "'$vol_name'"
405            open
406            set current view of container window to icon view
407            set toolbar visible of container window to false
408            set statusbar visible of container window to false
409            set the bounds of container window to {400, 200, 1160, 600}
410            set the bounds of container window to {400, 200, 1160, 600}
411            set the bounds of container window to {400, 200, 1160, 600}
412            set theViewOptions to the icon view options of container window
413            set arrangement of theViewOptions to not arranged
414            set icon size of theViewOptions to 64
415            set position of item "'$appdir'" of container window to {90, 80}
416            set position of item "Applications" of container window to {265, 80}
417            set position of item "READ ME.txt" of container window to {430, 80}
418            set position of item "READ ME.de_DE.txt" of container window to {595, 80}
419            set position of item "DCP-o-matic Disk Writer.pkg" of container window to {90, 255}
420            close
421            open
422            update without registering applications
423            delay 5
424      end tell
425    end tell
426 ' | osascript
427
428     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
429     sync
430
431     hdiutil eject $device
432     hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
433     sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
434     DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
435     Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
436     SetFile -a C "$dmg"
437     xattr -c "$dmg"
438
439     set -e
440     codesign --timestamp --verify --verbose --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$dmg"
441     set +e
442
443     rm $tmp_dmg
444     rm -rf $vol_name
445 }
446
447 # @param #1 appdir
448 function setup {
449     appdir="$1"
450     approot="$appdir/Contents"
451     rm -rf "$appdir"
452     mkdir -p "$approot/MacOS"
453     mkdir -p "$approot/Frameworks"
454     mkdir -p "$approot/Resources"
455
456     to_relink="dcpomatic"
457     copy_libs "$approot/Frameworks"
458     copy_resources "$approot/Resources"
459 }
460
461 function copy_verify {
462         copy $ROOT src/libdcp/build/tools/dcpverify "$approot/MacOS"
463         mv "$approot/MacOS/dcpverify" "$approot/MacOS/dcpomatic2_verify"
464         rl=("$approot/MacOS/dcpomatic2_verify" "$approot/Frameworks/"*.dylib)
465         relink_relative "${rl[@]}"
466 }
467
468 if [ "$ARCH2" == "" ]; then
469         prefix=$ROOT
470 else
471         prefix=$ROOT/$ARCH2
472 fi
473
474 if [[ "$BUILD" == *main* ]]; then
475         # DCP-o-matic main
476         setup "DCP-o-matic 2.app"
477         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
478         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
479         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
480         copy $ROOT bin/ffprobe "$approot/MacOS"
481         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
482         copy_verify
483         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
484         rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
485         relink_relative "${rl[@]}"
486         make_dmg "$appdir" "" "DCP-o-matic" "dcpomatic2_verify openssl ffprobe dcpomatic2_cli dcpomatic2_create dcpomatic2"
487 fi
488
489 if [[ "$BUILD" == *kdm* ]]; then
490         # DCP-o-matic KDM Creator
491         setup "DCP-o-matic 2 KDM Creator.app"
492         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
493         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
494         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
495         copy_verify
496         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
497         rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
498         relink_relative "${rl[@]}"
499         make_dmg "$appdir" "" "DCP-o-matic KDM Creator" "dcpomatic2_verify openssl dcpomatic2_kdm_cli dcpomatic2_kdm"
500 fi
501
502 if [[ "$BUILD" == *server* ]]; then
503         # DCP-o-matic Encode Server
504         setup "DCP-o-matic 2 Encode Server.app"
505         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
506         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
507         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
508         copy_verify
509         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
510         rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
511         relink_relative "${rl[@]}"
512         make_dmg "$appdir" "" "DCP-o-matic Encode Server" "dcpomatic2_verify openssl dcpomatic2_server_cli dcpomatic2_server"
513 fi
514
515 if [[ "$BUILD" == *batch* ]]; then
516         # DCP-o-matic Batch Converter
517         setup "DCP-o-matic 2 Batch converter.app"
518         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
519         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
520         copy_verify
521         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
522         rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
523         relink_relative "${rl[@]}"
524         make_dmg "$appdir" "" "DCP-o-matic Batch Converter" "dcpomatic2_verify openssl dcpomatic2_batch"
525 fi
526
527 if [[ "$BUILD" == *player* ]]; then
528         # DCP-o-matic Player
529         setup "DCP-o-matic 2 Player.app"
530         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
531         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
532         copy_verify
533         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
534         rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
535         relink_relative "${rl[@]}"
536         make_dmg "$appdir" "" "DCP-o-matic Player" "dcpomatic2_verify openssl dcpomatic2_player"
537 fi
538
539 if [[ "$BUILD" == *playlist* ]]; then
540         # DCP-o-matic Playlist Editor
541         setup "DCP-o-matic 2 Playlist Editor.app"
542         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
543         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
544         copy_verify
545         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
546         rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
547         relink_relative "${rl[@]}"
548         make_dmg "$appdir" "" "DCP-o-matic Playlist Editor" "dcpomatic2_verify openssl dcpomatic2_playlist"
549 fi
550
551 if [[ "$BUILD" == *combiner* ]]; then
552         # DCP-o-matic Combiner
553         setup "DCP-o-matic 2 Combiner.app"
554         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_combiner "$approot/MacOS"
555         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
556         copy_verify
557         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_combiner.Info.plist "$approot/Info.plist"
558         rl=("$approot/MacOS/dcpomatic2_combiner" "$approot/Frameworks/"*.dylib)
559         relink_relative "${rl[@]}"
560         make_dmg "$appdir" "" "DCP-o-matic Combiner" "dcpomatic2_verify openssl dcpomatic2_combiner"
561 fi
562
563 if [[ "$BUILD" == *editor* ]]; then
564         # DCP-o-matic Editor
565         setup "DCP-o-matic 2 Editor.app"
566         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_editor "$approot/MacOS"
567         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
568         copy_verify
569         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_editor.Info.plist "$approot/Info.plist"
570         rl=("$approot/MacOS/dcpomatic2_editor" "$approot/Frameworks/"*.dylib)
571         relink_relative "${rl[@]}"
572         make_dmg "$appdir" "" "DCP-o-matic Editor" "dcpomatic2_verify openssl dcpomatic2_editor"
573 fi
574
575 if [[ "$BUILD" == *disk* ]]; then 
576         # DCP-o-matic Disk Writer .app
577         setup "DCP-o-matic 2 Disk Writer.app"
578         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
579         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
580         copy_verify
581         cp $prefix/src/dcpomatic/platform/osx/uninstall_disk.applescript "$approot/Resources"
582         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
583         rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
584         relink_relative "${rl[@]}"
585
586         # DCP-o-matic Disk Writer daemon .pkg
587
588         pkgbase=tmp-disk-writer
589         rm -rf $pkgbase
590         mkdir $pkgbase
591         pkgbin=$pkgbase/bin
592         pkgroot=$pkgbase/root
593
594         mkdir -p $pkgroot/Library/LaunchDaemons
595         cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
596 <?xml version="1.0" encoding="UTF-8"?>
597 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
598 <plist version="1.0">
599 <dict>
600     <key>Label</key>
601     <string>com.dcpomatic.disk.writer</string>
602     <key>ProgramArguments</key>
603     <array>
604         <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
605     </array>
606     <key>EnvironmentVariables</key>
607     <dict>
608         <key>DYLD_LIBRARY_PATH</key>
609         <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
610     </dict>
611     <key>StandardOutPath</key>
612     <string>/var/log/dcpomatic_disk_writer_out.log</string>
613     <key>StandardErrorPath</key>
614     <string>/var/log/dcpomatic_disk_writer_err.log</string>
615     <key>LaunchEvents</key>
616     <dict>
617         <key>com.apple.notifyd.matching</key>
618         <dict>
619             <key>com.dcpomatic.disk.writer.start</key>
620             <dict>
621                 <key>Notification</key>
622                 <string>com.dcpomatic.disk.writer.start</string>
623             </dict>
624         </dict>
625     </dict>
626 </dict>
627 </plist>
628 EOF
629
630         # Get the binaries together in $pkgbin then move them to the
631         # place with spaces in the filename to avoid some of the pain of escaping
632
633         mkdir $pkgbin
634         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
635         copy_libs "$pkgbin"
636
637         rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
638         relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
639
640         mkdir $pkgbase/scripts
641         cat > $pkgbase/scripts/postinstall <<EOF
642 #!/bin/sh
643 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
644 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
645 exit 0
646 EOF
647         chmod gou+x $pkgbase/scripts/postinstall
648
649         find "$pkgbin" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
650                 sign "$f"
651         done
652         sign "$pkgbin/dcpomatic2_disk_writer"
653
654         mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
655         mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
656         pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
657
658         make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer" "dcpomatic2_verify openssl dcpomatic2_disk"
659 fi
660