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