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