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