7b2f330a235b3a31b74fad48aad40bbe73a26827
[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 bin/ffprobe "$approot/MacOS"
491         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
492         copy_verify
493         copy_kdm
494         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
495         rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
496         relink_relative "${rl[@]}"
497         make_dmg "$appdir" "" "DCP-o-matic" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl ffprobe dcpomatic2_cli dcpomatic2_create dcpomatic2"
498 fi
499
500 if [[ "$BUILD" == *kdm* ]]; then
501         # DCP-o-matic KDM Creator
502         setup "DCP-o-matic 2 KDM Creator.app"
503         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
504         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
505         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
506         copy_verify
507         copy_kdm
508         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
509         rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
510         relink_relative "${rl[@]}"
511         make_dmg "$appdir" "" "DCP-o-matic KDM Creator" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_kdm_cli dcpomatic2_kdm"
512 fi
513
514 if [[ "$BUILD" == *server* ]]; then
515         # DCP-o-matic Encode Server
516         setup "DCP-o-matic 2 Encode Server.app"
517         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
518         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
519         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
520         copy_verify
521         copy_kdm
522         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
523         rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
524         relink_relative "${rl[@]}"
525         make_dmg "$appdir" "" "DCP-o-matic Encode Server" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_server_cli dcpomatic2_server"
526 fi
527
528 if [[ "$BUILD" == *batch* ]]; then
529         # DCP-o-matic Batch Converter
530         setup "DCP-o-matic 2 Batch converter.app"
531         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
532         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
533         copy_verify
534         copy_kdm
535         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
536         rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
537         relink_relative "${rl[@]}"
538         make_dmg "$appdir" "" "DCP-o-matic Batch Converter" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_batch"
539 fi
540
541 if [[ "$BUILD" == *player* ]]; then
542         # DCP-o-matic Player
543         setup "DCP-o-matic 2 Player.app"
544         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
545         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
546         copy_verify
547         copy_kdm
548         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
549         rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
550         relink_relative "${rl[@]}"
551         make_dmg "$appdir" "" "DCP-o-matic Player" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_player"
552 fi
553
554 if [[ "$BUILD" == *playlist* ]]; then
555         # DCP-o-matic Playlist Editor
556         setup "DCP-o-matic 2 Playlist Editor.app"
557         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
558         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
559         copy_verify
560         copy_kdm
561         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
562         rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
563         relink_relative "${rl[@]}"
564         make_dmg "$appdir" "" "DCP-o-matic Playlist Editor" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_playlist"
565 fi
566
567 if [[ "$BUILD" == *combiner* ]]; then
568         # DCP-o-matic Combiner
569         setup "DCP-o-matic 2 Combiner.app"
570         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_combiner "$approot/MacOS"
571         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
572         copy_verify
573         copy_kdm
574         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_combiner.Info.plist "$approot/Info.plist"
575         rl=("$approot/MacOS/dcpomatic2_combiner" "$approot/Frameworks/"*.dylib)
576         relink_relative "${rl[@]}"
577         make_dmg "$appdir" "" "DCP-o-matic Combiner" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_combiner"
578 fi
579
580 if [[ "$BUILD" == *editor* ]]; then
581         # DCP-o-matic Editor
582         setup "DCP-o-matic 2 Editor.app"
583         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_editor "$approot/MacOS"
584         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
585         copy_verify
586         copy_kdm
587         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_editor.Info.plist "$approot/Info.plist"
588         rl=("$approot/MacOS/dcpomatic2_editor" "$approot/Frameworks/"*.dylib)
589         relink_relative "${rl[@]}"
590         make_dmg "$appdir" "" "DCP-o-matic Editor" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_editor"
591 fi
592
593 if [[ "$BUILD" == *disk* ]]; then 
594         # DCP-o-matic Disk Writer .app
595         setup "DCP-o-matic 2 Disk Writer.app"
596         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
597         copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
598         copy_verify
599         copy_kdm
600         cp $prefix/src/dcpomatic/platform/osx/uninstall_disk.applescript "$approot/Resources"
601         cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
602         rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
603         relink_relative "${rl[@]}"
604
605         # DCP-o-matic Disk Writer daemon .pkg
606
607         pkgbase=tmp-disk-writer
608         rm -rf $pkgbase
609         mkdir $pkgbase
610         pkgbin=$pkgbase/bin
611         pkgroot=$pkgbase/root
612
613         mkdir -p $pkgroot/Library/LaunchDaemons
614         cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
615 <?xml version="1.0" encoding="UTF-8"?>
616 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
617 <plist version="1.0">
618 <dict>
619     <key>Label</key>
620     <string>com.dcpomatic.disk.writer</string>
621     <key>ProgramArguments</key>
622     <array>
623         <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
624     </array>
625     <key>EnvironmentVariables</key>
626     <dict>
627         <key>DYLD_LIBRARY_PATH</key>
628         <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
629     </dict>
630     <key>StandardOutPath</key>
631     <string>/var/log/dcpomatic_disk_writer_out.log</string>
632     <key>StandardErrorPath</key>
633     <string>/var/log/dcpomatic_disk_writer_err.log</string>
634     <key>LaunchEvents</key>
635     <dict>
636         <key>com.apple.notifyd.matching</key>
637         <dict>
638             <key>com.dcpomatic.disk.writer.start</key>
639             <dict>
640                 <key>Notification</key>
641                 <string>com.dcpomatic.disk.writer.start</string>
642             </dict>
643         </dict>
644     </dict>
645 </dict>
646 </plist>
647 EOF
648
649         # Get the binaries together in $pkgbin then move them to the
650         # place with spaces in the filename to avoid some of the pain of escaping
651
652         mkdir $pkgbin
653         copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
654         copy_libs "$pkgbin"
655
656         rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
657         relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
658
659         mkdir $pkgbase/scripts
660         cat > $pkgbase/scripts/postinstall <<EOF
661 #!/bin/sh
662 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
663 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
664 exit 0
665 EOF
666         chmod gou+x $pkgbase/scripts/postinstall
667
668         find "$pkgbin" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
669                 sign "$f"
670         done
671         sign "$pkgbin/dcpomatic2_disk_writer"
672
673         mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
674         mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
675         pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
676
677         make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_disk"
678 fi
679