Add uninstaller for the .pkg part of the disk writer on macOS (#1740).
[dcpomatic.git] / platform / osx / make_dmg.sh
1 #!/bin/bash
2 #
3 SYNTAX="make_dmg.sh <environment> <builddir> <type> <apple-id> <apple-password>"
4 # where <type> is universal or thin
5 #
6 # e.g. make_dmg.sh /Users/carl/osx-environment /Users/carl/cdist universal foo@bar.net opensesame
7
8 # Don't set -e here as egrep (used a few times) returns 1 if no matches
9 # were found.
10
11 version=`git describe --tags --abbrev=0 | sed -e "s/v//"`
12
13 # DMG size in megabytes
14 DMG_SIZE=256
15 ENV=$1
16 ROOT=$2
17 TYPE=$3
18 APPLE_ID=$4
19 APPLE_PASSWORD=$5
20
21 if [ "$TYPE" != "universal" -a "$TYPE" != "thin" ]; then
22     echo $SYNTAX
23     echo "where <type> is universal or thin"
24     exit 1
25 fi
26
27 # This is our work area for making up the .dmgs
28 mkdir -p build/platform/osx
29 cd build/platform/osx
30
31 cat <<EOF > entitlements.plist
32 <?xml version="1.0" encoding="UTF-8"?>
33 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
34 <plist version="1.0">
35 <dict>
36   <key>com.apple.security.cs.disable-library-validation</key>
37   <true/>
38 </dict>
39 </plist>
40 EOF
41
42 function copy {
43     case $TYPE in
44         universal)
45             for f in $1/32/$2; do
46                 if [ -h $f ]; then
47                     ln -s $(readlink $f) "$3/`basename $f`"
48                 else
49                     g=`echo $f | sed -e "s/\/32\//\/64\//g"`
50                     mkdir -p "$3"
51                     lipo -create $f $g -output "$3/`basename $f`"
52                 fi
53             done
54             ;;
55         thin)
56             if [ -h $1/$2 ]; then
57                 ln -s $(readlink $1/$2) "$3/`basename $f`"
58             else
59                 cp $1/$2 "$3"
60             fi
61             ;;
62     esac
63 }
64
65 function copy_lib_root {
66     case $TYPE in
67         universal)
68             for f in $ROOT/32/lib/$1*.dylib; do
69                 if [ -h $f ]; then
70                     ln -s $(readlink $f) "$2/`basename $f`"
71                 else
72                     g=`echo $f | sed -e "s/\/32\//\/64\//g"`
73                     mkdir -p "$2"
74                     lipo -create $f $g -output "$2/`basename $f`"
75                 fi
76             done
77             ;;
78         thin)
79             for f in $ROOT/lib/$1*.dylib; do
80                 if [ -h $f ]; then
81                     ln -s $(readlink $f) "$2/`basename $f`"
82                 else
83                     mkdir -p "$2"
84                     cp $f "$2"
85                 fi
86             done
87             ;;
88     esac
89     to_relink="$to_relink|$1"
90 }
91
92 function copy_lib_env {
93     case $TYPE in
94         universal)
95             for f in $ENV/32/lib/$1*.dylib; do
96                 if [ -h $f ]; then
97                     ln -s $(readlink $f) "$2/`basename $f`"
98                 else
99                     g=`echo $f | sed -e "s/\/32\//\/64\//g"`
100                     mkdir -p "$2"
101                     lipo -create $f $g -output "$2/`basename $f`"
102                 fi
103             done
104             ;;
105         thin)
106             for f in $ENV/64/lib/$1*.dylib; do
107                 if [ -h $f ]; then
108                     ln -s $(readlink $f) "$2/`basename $f`"
109                 else
110                     mkdir -p "$2"
111                     cp $f "$2"
112                 fi
113             done
114             ;;
115     esac
116     to_relink="$to_relink|$1"
117 }
118
119 # @param #1 directory to copy to
120 function copy_libs {
121     local dest="$1"
122     copy_lib_root libcxml "$dest"
123     copy_lib_root libdcp-1.0 "$dest"
124     copy_lib_root libasdcp-carl "$dest"
125     copy_lib_root libkumu-carl "$dest"
126     copy_lib_root libsub "$dest"
127     copy_lib_root libopenjp2 "$dest"
128     copy_lib_root libavdevice "$dest"
129     copy_lib_root libavformat "$dest"
130     copy_lib_root libavfilter "$dest"
131     copy_lib_root libavutil "$dest"
132     copy_lib_root libavcodec "$dest"
133     copy_lib_root libswscale "$dest"
134     copy_lib_root libpostproc "$dest"
135     copy_lib_root libswresample "$dest"
136     copy_lib_root liblwext4 "$dest"
137     copy_lib_root libblockdev "$dest"
138     copy_lib_root libleqm_nrt "$dest"
139     copy $ROOT src/dcpomatic/build/src/lib/libdcpomatic2.dylib "$dest"
140     copy $ROOT src/dcpomatic/build/src/wx/libdcpomatic2-wx.dylib "$dest"
141     copy_lib_env libboost_system "$dest"
142     copy_lib_env libboost_filesystem "$dest"
143     copy_lib_env libboost_thread "$dest"
144     copy_lib_env libboost_date_time "$dest"
145     copy_lib_env libboost_locale "$dest"
146     copy_lib_env libboost_regex "$dest"
147     copy_lib_env libxml++ "$dest"
148     copy_lib_env libxslt "$dest"
149     copy_lib_env libxml2 "$dest"
150     copy_lib_env libglibmm-2.4 "$dest"
151     copy_lib_env libgobject "$dest"
152     copy_lib_env libgthread "$dest"
153     copy_lib_env libgmodule "$dest"
154     copy_lib_env libsigc "$dest"
155     copy_lib_env libglib-2 "$dest"
156     copy_lib_env libintl "$dest"
157     copy_lib_env libsndfile "$dest"
158     copy_lib_env libssh "$dest"
159     copy_lib_env libwx "$dest"
160     copy_lib_env libfontconfig "$dest"
161     copy_lib_env libfreetype "$dest"
162     copy_lib_env libexpat "$dest"
163     copy_lib_env libltdl "$dest"
164     copy_lib_env libxmlsec1 "$dest"
165     copy_lib_env libcurl "$dest"
166     copy_lib_env libffi "$dest"
167     copy_lib_env libpango "$dest"
168     copy_lib_env libcairo "$dest"
169     copy_lib_env libpixman "$dest"
170     copy_lib_env libharfbuzz "$dest"
171     copy_lib_env libsamplerate "$dest"
172     copy_lib_env libicui18n "$dest"
173     copy_lib_env libicudata "$dest"
174     copy_lib_env libicuio "$dest"
175     copy_lib_env libicule "$dest"
176     copy_lib_env libiculx "$dest"
177     copy_lib_env libicutest "$dest"
178     copy_lib_env libicutu "$dest"
179     copy_lib_env libicuuc "$dest"
180     copy_lib_env libFLAC "$dest"
181     copy_lib_env libvorbis "$dest"
182     copy_lib_env libogg "$dest"
183     copy_lib_env libxerces-c "$dest"
184 }
185
186 # @param #1 directory to copy to
187 function copy_resources {
188     local dest="$1"
189     case $TYPE in
190         universal)
191             local prefix=$ROOT/32
192             ;;
193         thin)
194             local prefix=$ROOT
195             ;;
196     esac
197     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small.png "$dest"
198     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
199     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
200     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
201     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
202     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
203     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_playlist.icns "$dest"
204     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_disk.icns "$dest"
205     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_combiner.icns "$dest"
206     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults.png "$dest"
207     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults@2x.png "$dest"
208     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email.png "$dest"
209     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email@2x.png "$dest"
210     cp $prefix/src/dcpomatic/graphics/osx/preferences/email.png "$dest"
211     cp $prefix/src/dcpomatic/graphics/osx/preferences/email@2x.png "$dest"
212     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers.png "$dest"
213     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers@2x.png "$dest"
214     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms.png "$dest"
215     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms@2x.png "$dest"
216     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys.png "$dest"
217     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys@2x.png "$dest"
218     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet.png "$dest"
219     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet@2x.png "$dest"
220     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications.png "$dest"
221     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications@2x.png "$dest"
222     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound.png "$dest"
223     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound@2x.png "$dest"
224     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers.png "$dest"
225     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers@2x.png "$dest"
226     cp $prefix/src/dcpomatic/graphics/osx/preferences/general.png "$dest"
227     cp $prefix/src/dcpomatic/graphics/osx/preferences/general@2x.png "$dest"
228     cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced.png "$dest"
229     cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced@2x.png "$dest"
230     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations.png "$dest"
231     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations@2x.png "$dest"
232     cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
233     cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
234     cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
235     cp $prefix/src/dcpomatic/fonts/fonts.conf.osx "$dest"/fonts.conf
236     cp $prefix/src/dcpomatic/graphics/splash.png "$dest"
237     cp $prefix/src/dcpomatic/graphics/zoom.png "$dest"
238     cp $prefix/src/dcpomatic/graphics/zoom_all.png "$dest"
239     cp $prefix/src/dcpomatic/graphics/select.png "$dest"
240     cp $prefix/src/dcpomatic/graphics/snap.png "$dest"
241     cp $prefix/src/dcpomatic/graphics/sequence.png "$dest"
242     cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
243     cp $prefix/src/dcpomatic/graphics/link.png "$dest"
244     cp $prefix/src/dcpomatic/graphics/tick.png "$dest"
245     cp $prefix/src/dcpomatic/graphics/no_tick.png "$dest"
246     cp -r $prefix/share/libdcp/xsd "$dest"
247     cp -r $prefix/share/libdcp/tags "$dest"
248
249     # i18n: DCP-o-matic .mo files
250     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; do
251         mkdir -p "$dest/$lang/LC_MESSAGES"
252         cp $prefix/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
253         cp $prefix/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
254         cp $prefix/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
255     done
256
257     # i18n: wxWidgets .mo files
258     for lang in de es fr it sv nl ru pl da cs; do
259         mkdir "$dest/$lang"
260         cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
261     done
262 }
263
264 # param $1 list of things that link to other things
265 function relink_relative {
266     to_relink=`echo $to_relink | sed -e "s/\+//g"`
267     local linkers=("$@")
268
269     for obj in "${linkers[@]}"; do
270         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
271         changes=""
272         for dep in $deps; do
273             base=`basename $dep`
274             if [ "$TYPE" == "universal" ]; then
275                 # $dep will be a path within 64/; make a 32/ path too
276                 dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
277                 changes="$changes -change $dep @executable_path/../Frameworks/$base -change $dep32 @executable_path/../Frameworks/$base"
278             else
279                 changes="$changes -change $dep @executable_path/../Frameworks/$base"
280             fi
281         done
282         if test "x$changes" != "x"; then
283             install_name_tool $changes -id `basename "$obj"` "$obj"
284         fi
285     done
286 }
287
288 # param $1 directory things should be relinked into
289 #       $2 list of things that link to other things
290 function relink_absolute {
291     to_relink=`echo $to_relink | sed -e "s/\+//g"`
292     target=$1
293     shift
294     local linkers=("$@")
295
296     for obj in "${linkers[@]}"; do
297         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
298         for dep in $deps; do
299             base=`basename $dep`
300             install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
301         done
302     done
303 }
304
305 function sign {
306     codesign --deep --force --verify --verbose --options runtime --entitlements entitlements.plist --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$1"
307     if [ "$?" != "0" ]; then
308         echo "Failed to sign $1"
309         exit 1
310     fi
311 }
312
313
314 # @param #1 .app directory
315 # @param #2 .pkg or ""
316 # @param #3 full name e.g. DCP-o-matic Batch Converter
317 function make_dmg {
318     local appdir="$1"
319     local pkg="$2"
320     local full_name="$3"
321     tmp_dmg=dcpomatic_tmp.dmg
322     dmg="$full_name $version.dmg"
323     vol_name=DCP-o-matic-$version
324
325     sign "$appdir"
326
327     if [ "$pkg" != "" ]; then
328         productsign --sign "Developer ID Installer: Carl Hetherington (R82DXSR997)" "$pkg" "signed_temp.pkg"
329         if [ "$?" != "0" ]; then
330             echo "Failed to sign .pkg"
331             exit 1
332         fi
333         mv signed_temp.pkg "$pkg"
334     fi
335
336     mkdir -p $vol_name
337     cp -a "$appdir" $vol_name
338     if [ "$pkg" != "" ]; then
339         cp -a "$pkg" $vol_name
340     fi
341     ln -s /Applications "$vol_name/Applications"
342     cat<<EOF > "$vol_name/READ ME.txt"
343 Welcome to DCP-o-matic!  The first time you run the program there may be
344 a long (several-minute) delay while OS X checks the code for viruses and
345 other malware.  Please be patient!
346 EOF
347     cat<<EOF > "$vol_name/READ ME.de_DE.txt"
348 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
349 Verifikationsvorgang auftreten.  Dies ist von der OS X Sicherheitsumgebung
350 'Gatekeeper' verursacht.  Dieser je nach Rechner teils minutenlange
351 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
352 es ist kein Programmfehler.  Warten sie die Verifikation für jede der
353 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
354 mehr auftreten.
355 EOF
356
357     if [ "$pkg" != "" ]; then
358         cat<<EOF > "$vol_name/READ ME.txt"
359
360 To run this software successfully you must install $pkg before running
361 the .app
362 EOF
363     fi
364
365     if [ "$pkg" != "" ]; then
366         cat<<EOF > "$vol_name/READ ME.de_DE.txt"
367
368 To run this software successfully you must install $pkg before running
369 the .app
370 EOF
371
372     fi
373     rm -f $tmp_dmg "$dmg"
374     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
375     attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
376     device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
377     sleep 5
378
379     echo '
380   tell application "Finder"
381     tell disk "'$vol_name'"
382            open
383            set current view of container window to icon view
384            set toolbar visible of container window to false
385            set statusbar visible of container window to false
386            set the bounds of container window to {400, 200, 1160, 600}
387            set the bounds of container window to {400, 200, 1160, 600}
388            set the bounds of container window to {400, 200, 1160, 600}
389            set theViewOptions to the icon view options of container window
390            set arrangement of theViewOptions to not arranged
391            set icon size of theViewOptions to 64
392            set position of item "'$appdir'" of container window to {90, 80}
393            set position of item "Applications" of container window to {265, 80}
394            set position of item "READ ME.txt" of container window to {430, 80}
395            set position of item "READ ME.de_DE.txt" of container window to {595, 80}
396            set position of item "DCP-o-matic Disk Writer.pkg" of container window to {90, 255}
397            close
398            open
399            update without registering applications
400            delay 5
401      end tell
402    end tell
403 ' | osascript
404
405     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
406     sync
407
408     hdiutil eject $device
409     hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
410     sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
411     DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
412     Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
413     SetFile -a C "$dmg"
414     xattr -c "$dmg"
415
416     set -e
417     codesign --verify --verbose --options runtime --entitlements entitlements.plist --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
418     set +e
419
420     rm $tmp_dmg
421     rm -rf $vol_name
422 }
423
424 # @param #1 appdir
425 function setup {
426     appdir="$1"
427     approot="$appdir/Contents"
428     rm -rf "$appdir"
429     mkdir -p "$approot/MacOS"
430     mkdir -p "$approot/Frameworks"
431     mkdir -p "$approot/Resources"
432
433     to_relink="dcpomatic"
434     copy_libs "$approot/Frameworks"
435     copy_resources "$approot/Resources"
436 }
437
438 case $TYPE in
439     universal)
440         prefix=$ROOT/32
441         ;;
442     thin)
443         prefix=$ROOT
444         ;;
445 esac
446
447 # DCP-o-matic main
448 setup "DCP-o-matic 2.app"
449 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
450 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
451 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
452 copy $ROOT bin/ffprobe "$approot/MacOS"
453 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
454 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
455 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
456 relink_relative "${rl[@]}"
457 make_dmg "$appdir" "" "DCP-o-matic"
458
459 # DCP-o-matic KDM Creator
460 setup "DCP-o-matic 2 KDM Creator.app"
461 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
462 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
463 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
464 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
465 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
466 relink_relative "${rl[@]}"
467 make_dmg "$appdir" "" "DCP-o-matic KDM Creator"
468
469 # DCP-o-matic Encode Server
470 setup "DCP-o-matic 2 Encode Server.app"
471 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
472 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
473 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
474 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
475 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
476 relink_relative "${rl[@]}"
477 make_dmg "$appdir" "" "DCP-o-matic Encode Server"
478
479 # DCP-o-matic Batch Converter
480 setup "DCP-o-matic 2 Batch converter.app"
481 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
482 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
483 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
484 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
485 relink_relative "${rl[@]}"
486 make_dmg "$appdir" "" "DCP-o-matic Batch Converter"
487
488 # DCP-o-matic Player
489 setup "DCP-o-matic 2 Player.app"
490 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
491 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
492 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
493 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
494 relink_relative "${rl[@]}"
495 make_dmg "$appdir" "" "DCP-o-matic Player"
496
497 # DCP-o-matic Playlist Editor
498 setup "DCP-o-matic 2 Playlist Editor.app"
499 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
500 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
501 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
502 rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
503 relink_relative "${rl[@]}"
504 make_dmg "$appdir" "" "DCP-o-matic Playlist Editor"
505
506 # DCP-o-matic Combiner
507 setup "DCP-o-matic 2 Combiner.app"
508 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_combiner "$approot/MacOS"
509 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
510 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_combiner.Info.plist "$approot/Info.plist"
511 rl=("$approot/MacOS/dcpomatic2_combiner" "$approot/Frameworks/"*.dylib)
512 relink_relative "${rl[@]}"
513 make_dmg "$appdir" "" "DCP-o-matic Combiner"
514
515 # DCP-o-matic Disk Writer .app
516 setup "DCP-o-matic 2 Disk Writer.app"
517 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
518 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
519 cp $prefix/src/dcpomatic/platform/osx/uninstall_disk.applescript "$approot/Resources"
520 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
521 rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
522 relink_relative "${rl[@]}"
523
524 # DCP-o-matic Disk Writer daemon .pkg
525
526 pkgbase=tmp-disk-writer
527 rm -rf $pkgbase
528 mkdir $pkgbase
529 pkgbin=$pkgbase/bin
530 pkgroot=$pkgbase/root
531
532 mkdir -p $pkgroot/Library/LaunchDaemons
533 cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
534 <?xml version="1.0" encoding="UTF-8"?>
535 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
536 <plist version="1.0">
537 <dict>
538     <key>Label</key>
539     <string>com.dcpomatic.disk.writer</string>
540     <key>ProgramArguments</key>
541     <array>
542         <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
543     </array>
544     <key>EnvironmentVariables</key>
545     <dict>
546         <key>DYLD_LIBRARY_PATH</key>
547         <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
548     </dict>
549     <key>StandardOutPath</key>
550     <string>/var/log/dcpomatic_disk_writer_out.log</string>
551     <key>StandardErrorPath</key>
552     <string>/var/log/dcpomatic_disk_writer_err.log</string>
553     <key>LaunchEvents</key>
554     <dict>
555         <key>com.apple.notifyd.matching</key>
556         <dict>
557             <key>com.dcpomatic.disk.writer.start</key>
558             <dict>
559                 <key>Notification</key>
560                 <string>com.dcpomatic.disk.writer.start</string>
561             </dict>
562         </dict>
563     </dict>
564 </dict>
565 </plist>
566 EOF
567
568 # Get the binaries together in $pkgbin then move them to the
569 # place with spaces in the filename to avoid some of the pain of escaping
570
571 mkdir $pkgbin
572 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
573 copy_libs "$pkgbin"
574
575 rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
576 relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
577
578 mkdir $pkgbase/scripts
579 cat > $pkgbase/scripts/postinstall <<EOF
580 #!/bin/sh
581 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
582 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
583 exit 0
584 EOF
585 chmod gou+x $pkgbase/scripts/postinstall
586
587 find "$pkgbin" -iname "*.dylib" -print0 | while IFS= read -r -d '' f; do
588     sign "$f"
589 done
590 sign "$pkgbin/dcpomatic2_disk_writer"
591
592 mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
593 mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
594 pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
595
596 make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer"
597