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