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