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