Supporters update.
[dcpomatic.git] / platform / osx / make_dmg.sh
1 #!/bin/bash
2 #
3 SYNTAX="make_dmg.sh -e <environment> -r <builddir> -i <apple-id> -p <apple-password> -a <arch1> [-a <arch2>] [-b <id>]"
4 #
5 # e.g. make_dmg.sh -e /Users/carl/osx-environment -r /Users/carl/cdist -i foo@bar.net -p opensesame -a x86_64/10.10 -a arm64/11.0 [-b dcpomatic2_player]
6
7 # Don't set -e here as egrep (used a few times) returns 1 if no matches
8 # were found.
9
10 BUILD="main kdm server batch player playlist combiner editor disk"
11 while getopts "e:r:i:p:a:b:" o; do
12         case "${o}" in
13                 e)
14                         ENV=${OPTARG}
15                         ;;
16                 r)
17                         ROOT=${OPTARG}
18                         ;;
19                 i)
20                         APPLE_ID=${OPTARG}
21                         ;;
22                 p)
23                         APPLE_PASSWORD=${OPTARG}
24                         ;;
25                 a)
26                         ARCHS+=("$OPTARG")
27                         ;;
28                 b)
29                         BUILD=${OPTARG}
30                         ;;
31         esac
32 done
33
34 # Use a tag if what we've built is exactly on one
35 version=$(git describe --tags --abbrev=0 --match=v2.*.* --exact-match 2> /dev/null)
36 if [ "$?" == "0" ]; then
37         version=$(echo $version | sed -e "s/^v//")
38 else
39         # Otherwise use <branch>-<commit>
40         version="$(basename $(git name-rev --name-only HEAD))-$(git rev-parse --short HEAD)"
41 fi
42
43 # DMG size in megabytes
44 DMG_SIZE=256
45
46 ARCH1=${ARCHS[0]}
47 ARCH2=${ARCHS[1]}
48
49 APPLICATION_IDENTITY="Developer ID Application: Carl Hetherington (R82DXSR997)"
50 INSTALLER_IDENTITY="Developer ID Installer: Carl Hetherington (R82DXSR997)"
51
52 # This is our work area for making up the .dmgs
53 mkdir -p build/platform/osx
54 cd build/platform/osx
55
56 cat <<EOF > entitlements.plist
57 <?xml version="1.0" encoding="UTF-8"?>
58 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
59 <plist version="1.0">
60 <dict>
61   <key>com.apple.security.cs.disable-library-validation</key>
62   <true/>
63   <key>com.apple.security.cs.allow-dyld-environment-variables</key>
64   <true/>
65   <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
66   <true/>
67 </dict>
68 </plist>
69 EOF
70
71 function copy {
72         if [ "$ARCH2" == "" ]; then
73                 for f in $1/$2; do
74                         if [ -h $f ]; then
75                                 ln -s $(readlink $f) "$3/`basename $f`"
76                         else
77                                 cp $f "$3/`basename $f`"
78                         fi
79                 done
80         else
81                 for f in $1/$ARCH2/$2; do
82                         if [ -h $f ]; then
83                                 ln -s $(readlink $f) "$3/`basename $f`"
84                         else
85                                 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
86                                 mkdir -p "$3"
87                                 lipo -create $f $g -output "$3/$(basename $f)"
88                         fi
89                 done
90         fi
91 }
92
93 function copy_lib_root {
94         if [ "$ARCH2" == "" ]; then
95                 for f in $ROOT/lib/$1*.dylib; do
96                         if [ -h $f ]; then
97                                 ln -s $(readlink $f) "$2/`basename $f`"
98                         else
99                                 cp $f "$2/`basename $f`"
100                         fi
101                 done
102         else
103                 for f in $ROOT/$ARCH2/lib/$1*.dylib; do
104                         if [ -h $f ]; then
105                                 ln -s $(readlink $f) "$2/`basename $f`"
106                         else
107                                 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
108                                 mkdir -p "$2"
109                                 lipo -create $f $g -output "$2/$(basename $f)"
110                         fi
111                 done
112         fi
113     to_relink="$to_relink|$1"
114 }
115
116 function copy_lib_env {
117         if [ "$ARCH2" == "" ]; then
118                 for f in $ENV/$ARCH1/lib/$1*.dylib; do
119                         if [ -h $f ]; then
120                                 ln -s $(readlink $f) "$2/`basename $f`"
121                         else
122                                 cp $f "$2/`basename $f`"
123                         fi
124                 done
125         else
126                 for f in $ENV/$ARCH2/lib/$1*.dylib; do
127                         if [ -h $f ]; then
128                                 ln -s $(readlink $f) "$2/`basename $f`"
129                         else
130                                 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
131                                 mkdir -p "$2"
132                                 lipo -create $f $g -output "$2/$(basename $f)"
133                         fi
134                 done
135         fi
136     to_relink="$to_relink|$1"
137 }
138
139 # @param #1 directory to copy to
140 function copy_libs {
141     local dest="$1"
142     copy_lib_root libcxml "$dest"
143     copy_lib_root libdcp-1.0 "$dest"
144     copy_lib_root libasdcp-carl "$dest"
145     copy_lib_root libkumu-carl "$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_system "$dest"
162     copy_lib_env libboost_filesystem "$dest"
163     copy_lib_env libboost_thread "$dest"
164     copy_lib_env libboost_date_time "$dest"
165     copy_lib_env libboost_locale "$dest"
166     copy_lib_env libboost_regex "$dest"
167     copy_lib_env libxml++ "$dest"
168     copy_lib_env libxslt "$dest"
169     copy_lib_env libxml2 "$dest"
170     copy_lib_env libglibmm-2.4 "$dest"
171     copy_lib_env libgobject "$dest"
172     copy_lib_env libgthread "$dest"
173     copy_lib_env libgmodule "$dest"
174     copy_lib_env libsigc "$dest"
175     copy_lib_env libglib-2 "$dest"
176     copy_lib_env libintl "$dest"
177     copy_lib_env libsndfile "$dest"
178     copy_lib_env libssh "$dest"
179     copy_lib_env libwx "$dest"
180     copy_lib_env libfontconfig "$dest"
181     copy_lib_env libfreetype "$dest"
182     copy_lib_env libexpat "$dest"
183     copy_lib_env libltdl "$dest"
184     copy_lib_env libxmlsec1 "$dest"
185     copy_lib_env libcurl "$dest"
186     copy_lib_env libffi "$dest"
187     copy_lib_env libpango "$dest"
188     copy_lib_env libcairo "$dest"
189     copy_lib_env libpixman "$dest"
190     copy_lib_env libharfbuzz "$dest"
191     copy_lib_env libsamplerate "$dest"
192     copy_lib_env libicui18n "$dest"
193     copy_lib_env libicudata "$dest"
194     copy_lib_env libicuio "$dest"
195     copy_lib_env libicutest "$dest"
196     copy_lib_env libicutu "$dest"
197     copy_lib_env libicuuc "$dest"
198     copy_lib_env libFLAC "$dest"
199     copy_lib_env libvorbis "$dest"
200     copy_lib_env libogg "$dest"
201     copy_lib_env libxerces-c "$dest"
202     copy_lib_env libcrypto "$dest"
203     copy_lib_env libssl "$dest"
204     copy_lib_env libfribidi "$dest"
205     copy_lib_env libgio "$dest"
206     copy_lib_env libz "$dest"
207         copy_lib_env libdav1d "$dest"
208 }
209
210 # @param #1 directory to copy to
211 function copy_resources {
212     local dest="$1"
213         if [ "$ARCH2" == "" ]; then
214                 local prefix=$ROOT
215         else
216                 local prefix=$ROOT/$ARCH1
217         fi
218     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_white.png "$dest"
219     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_black.png "$dest"
220     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
221     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
222     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
223     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
224     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
225     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_playlist.icns "$dest"
226     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_disk.icns "$dest"
227     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_combiner.icns "$dest"
228     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_editor.icns "$dest"
229     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults*.png "$dest"
230     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email*.png "$dest"
231     cp $prefix/src/dcpomatic/graphics/osx/preferences/email*.png "$dest"
232     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers*.png "$dest"
233     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms*.png "$dest"
234     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys*.png "$dest"
235     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet*.png "$dest"
236     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications*.png "$dest"
237     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound*.png "$dest"
238     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers*.png "$dest"
239     cp $prefix/src/dcpomatic/graphics/osx/preferences/general*.png "$dest"
240     cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced*.png "$dest"
241     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations*.png "$dest"
242     cp $prefix/src/dcpomatic/graphics/osx/preferences/non_standard*.png "$dest"
243     cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
244     cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
245     cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
246     cp $prefix/src/dcpomatic/fonts/fonts.conf.osx "$dest"/fonts.conf
247     cp $prefix/src/dcpomatic/graphics/splash.png "$dest"
248     cp $prefix/src/dcpomatic/graphics/zoom*.png "$dest"
249     cp $prefix/src/dcpomatic/graphics/zoom_all*.png "$dest"
250     cp $prefix/src/dcpomatic/graphics/select*.png "$dest"
251     cp $prefix/src/dcpomatic/graphics/snap*.png "$dest"
252     cp $prefix/src/dcpomatic/graphics/sequence*.png "$dest"
253     cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
254     cp $prefix/src/dcpomatic/graphics/link*.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 ka_KA fa_IR; 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_map dcpomatic2"
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