Move identifiers stuff out to a new prefs tab.
[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/colour_conversions.png "$dest"
195     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults.png "$dest"
196     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email.png "$dest"
197     cp $prefix/src/dcpomatic/graphics/osx/preferences/email.png "$dest"
198     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers.png "$dest"
199     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms.png "$dest"
200     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys.png "$dest"
201     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet.png "$dest"
202     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications.png "$dest"
203     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations.png "$dest"
204     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound.png "$dest"
205     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers.png "$dest"
206     cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
207     cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
208     cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
209     cp $prefix/src/dcpomatic/fonts/fonts.conf.osx "$dest"/fonts.conf
210     cp $prefix/src/dcpomatic/graphics/splash.png "$dest"
211     cp $prefix/src/dcpomatic/graphics/zoom.png "$dest"
212     cp $prefix/src/dcpomatic/graphics/zoom_all.png "$dest"
213     cp $prefix/src/dcpomatic/graphics/select.png "$dest"
214     cp $prefix/src/dcpomatic/graphics/snap.png "$dest"
215     cp $prefix/src/dcpomatic/graphics/sequence.png "$dest"
216     cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
217     cp $prefix/src/dcpomatic/graphics/link.png "$dest"
218     cp -r $prefix/share/libdcp/xsd "$dest"
219
220     # i18n: DCP-o-matic .mo files
221     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
222         mkdir -p "$dest/$lang/LC_MESSAGES"
223         cp $prefix/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
224         cp $prefix/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
225         cp $prefix/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
226     done
227
228     # i18n: wxWidgets .mo files
229     for lang in de es fr it sv nl ru pl da cs; do
230         mkdir "$dest/$lang"
231         cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
232     done
233 }
234
235 # param $1 list of things that link to other things
236 function relink_relative {
237     to_relink=`echo $to_relink | sed -e "s/\+//g"`
238     local linkers=("$@")
239
240     for obj in "${linkers[@]}"; do
241         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
242         changes=""
243         for dep in $deps; do
244             base=`basename $dep`
245             if [ "$TYPE" == "universal" ]; then
246                 # $dep will be a path within 64/; make a 32/ path too
247                 dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
248                 changes="$changes -change $dep @executable_path/../Frameworks/$base -change $dep32 @executable_path/../Frameworks/$base"
249             else
250                 changes="$changes -change $dep @executable_path/../Frameworks/$base"
251             fi
252         done
253         if test "x$changes" != "x"; then
254             install_name_tool $changes -id `basename "$obj"` "$obj"
255         fi
256     done
257 }
258
259 # param $1 directory things should be relinked into
260 #       $2 list of things that link to other things
261 function relink_absolute {
262     to_relink=`echo $to_relink | sed -e "s/\+//g"`
263     target=$1
264     shift
265     local linkers=("$@")
266
267     for obj in "${linkers[@]}"; do
268         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
269         for dep in $deps; do
270             base=`basename $dep`
271             install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
272         done
273     done
274 }
275
276 function sign {
277     codesign --deep --force --verify --verbose --options runtime --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$1"
278     if [ "$?" != "0" ]; then
279         echo "Failed to sign $1"
280         exit 1
281     fi
282 }
283
284
285 # @param #1 .app directory
286 # @param #2 .pkg or ""
287 # @param #3 full name e.g. DCP-o-matic Batch Converter
288 # @param #4 bundle id e.g. com.dcpomatic.batch
289 function make_dmg {
290     local appdir="$1"
291     local pkg="$2"
292     local full_name="$3"
293     local bundle_id="$4"
294     tmp_dmg=dcpomatic_tmp.dmg
295     dmg="$full_name $version.dmg"
296     vol_name=DCP-o-matic-$version
297
298     sign "$appdir"
299
300     if [ "$pkg" != "" ]; then
301         productsign --sign "Developer ID Installer: Carl Hetherington (R82DXSR997)" "$pkg" "signed_temp.pkg"
302         if [ "$?" != "0" ]; then
303             echo "Failed to sign .pkg"
304             exit 1
305         fi
306         mv signed_temp.pkg "$pkg"
307     fi
308
309     mkdir -p $vol_name
310     cp -a "$appdir" $vol_name
311     if [ "$pkg" != "" ]; then
312         cp -a "$pkg" $vol_name
313     fi
314     ln -s /Applications "$vol_name/Applications"
315     cat<<EOF > "$vol_name/READ ME.txt"
316 Welcome to DCP-o-matic!  The first time you run the program there may be
317 a long (several-minute) delay while OS X checks the code for viruses and
318 other malware.  Please be patient!
319 EOF
320     cat<<EOF > "$vol_name/READ ME.de_DE.txt"
321 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
322 Verifikationsvorgang auftreten.  Dies ist von der OS X Sicherheitsumgebung
323 'Gatekeeper' verursacht.  Dieser je nach Rechner teils minutenlange
324 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
325 es ist kein Programmfehler.  Warten sie die Verifikation für jede der
326 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
327 mehr auftreten.
328 EOF
329
330     if [ "$pkg" != "" ]; then
331         cat<<EOF > "$vol_name/READ ME.txt"
332
333 To run this software successfully you must install $pkg before running
334 the .app
335 EOF
336     fi
337
338     if [ "$pkg" != "" ]; then
339         cat<<EOF > "$vol_name/READ ME.de_DE.txt"
340
341 To run this software successfully you must install $pkg before running
342 the .app
343 EOF
344
345     fi
346     rm -f $tmp_dmg "$dmg"
347     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
348     attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
349     device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
350     sleep 5
351
352     echo '
353   tell application "Finder"
354     tell disk "'$vol_name'"
355            open
356            set current view of container window to icon view
357            set toolbar visible of container window to false
358            set statusbar visible of container window to false
359            set the bounds of container window to {400, 200, 1160, 600}
360            set the bounds of container window to {400, 200, 1160, 600}
361            set the bounds of container window to {400, 200, 1160, 600}
362            set theViewOptions to the icon view options of container window
363            set arrangement of theViewOptions to not arranged
364            set icon size of theViewOptions to 64
365            set position of item "'$appdir'" of container window to {90, 80}
366            set position of item "Applications" of container window to {265, 80}
367            set position of item "READ ME.txt" of container window to {430, 80}
368            set position of item "READ ME.de_DE.txt" of container window to {595, 80}
369            set position of item "DCP-o-matic Disk Writer.pkg" of container window to {90, 255}
370            close
371            open
372            update without registering applications
373            delay 5
374      end tell
375    end tell
376 ' | osascript
377
378     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
379     sync
380
381     hdiutil eject $device
382     hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
383     sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
384     DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
385     Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
386     SetFile -a C "$dmg"
387     xattr -c "$dmg"
388
389     set -e
390     codesign --verify --verbose --options runtime --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
391
392     # We only notarize thin builds, as if we're building universal binaries we must be on an OS
393     # sufficiently old that it can't notarize anyway
394     if [ "$TYPE" == "thin" ]; then
395
396         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")
397         N=0
398         while [ 1 ]; do
399             echo "Checking up on $id"
400             set +e
401             status=$(xcrun altool --notarization-info $id -u $APPLE_ID -p $APPLE_PASSWORD --output-format xml)
402             set -e
403             summary=$(echo "$status" | grep -C1 "<key>Status</key>" | tail -n 1 | sed -e "s/    .//g")
404             echo "Got $summary"
405             if [ "$summary" == "<string>invalid</string>" ]; then
406                 echo "Notarization failed."
407                 echo $status
408                 exit 1
409             fi
410             if [ "$summary" == "<string>success</string>" ]; then
411                 break
412             fi
413             sleep 30
414             N=$((N+1))
415             if [ "$N" == "30" ]; then
416                 echo "Timed out waiting for notarization"
417                 exit 1
418             fi
419         done
420
421         xcrun stapler staple "$dmg"
422     fi
423     set +e
424
425     rm $tmp_dmg
426     rm -rf $vol_name
427 }
428
429 # @param #1 appdir
430 function setup {
431     appdir="$1"
432     approot="$appdir/Contents"
433     rm -rf "$appdir"
434     mkdir -p "$approot/MacOS"
435     mkdir -p "$approot/Frameworks"
436     mkdir -p "$approot/Resources"
437
438     to_relink="dcpomatic"
439     copy_libs "$approot/Frameworks"
440     copy_resources "$approot/Resources"
441 }
442
443 case $TYPE in
444     universal)
445         prefix=$ROOT/32
446         ;;
447     thin)
448         prefix=$ROOT
449         ;;
450 esac
451
452 # DCP-o-matic main
453 setup "DCP-o-matic 2.app"
454 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
455 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
456 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
457 copy $ROOT bin/ffprobe "$approot/MacOS"
458 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
459 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
460 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
461 relink_relative "${rl[@]}"
462 make_dmg "$appdir" "" "DCP-o-matic" com.dcpomatic
463
464 # DCP-o-matic KDM Creator
465 setup "DCP-o-matic 2 KDM Creator.app"
466 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
467 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
468 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
469 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
470 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
471 relink_relative "${rl[@]}"
472 make_dmg "$appdir" "" "DCP-o-matic KDM Creator" com.dcpomatic.kdm
473
474 # DCP-o-matic Encode Server
475 setup "DCP-o-matic 2 Encode Server.app"
476 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
477 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
478 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
479 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
480 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
481 relink_relative "${rl[@]}"
482 make_dmg "$appdir" "" "DCP-o-matic Encode Server" com.dcpomatic.server
483
484 # DCP-o-matic Batch Converter
485 setup "DCP-o-matic 2 Batch converter.app"
486 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
487 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
488 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
489 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
490 relink_relative "${rl[@]}"
491 make_dmg "$appdir" "" "DCP-o-matic Batch Converter" com.dcpomatic.batch
492
493 # DCP-o-matic Player
494 setup "DCP-o-matic 2 Player.app"
495 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
496 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
497 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
498 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
499 relink_relative "${rl[@]}"
500 make_dmg "$appdir" "" "DCP-o-matic Player" com.dcpomatic.player
501
502 # DCP-o-matic Playlist Editor
503 setup "DCP-o-matic 2 Playlist Editor.app"
504 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
505 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
506 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
507 rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
508 relink_relative "${rl[@]}"
509 make_dmg "$appdir" "" "DCP-o-matic Playlist Editor" com.dcpomatic.playlist
510
511 # DCP-o-matic Disk Writer .app
512 setup "DCP-o-matic 2 Disk Writer.app"
513 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
514 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
515 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
516 rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
517 relink_relative "${rl[@]}"
518
519 # DCP-o-matic Disk Writer daemon .pkg
520
521 pkgbase=tmp-disk-writer
522 rm -rf $pkgbase
523 mkdir $pkgbase
524 pkgbin=$pkgbase/bin
525 pkgroot=$pkgbase/root
526
527 mkdir -p $pkgroot/Library/LaunchDaemons
528 cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
529 <?xml version="1.0" encoding="UTF-8"?>
530 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
531 <plist version="1.0">
532 <dict>
533     <key>Label</key>
534     <string>com.dcpomatic.disk.writer</string>
535     <key>ProgramArguments</key>
536     <array>
537         <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
538     </array>
539     <key>EnvironmentVariables</key>
540     <dict>
541         <key>DYLD_LIBRARY_PATH</key>
542         <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
543     </dict>
544     <key>StandardOutPath</key>
545     <string>/var/log/dcpomatic_disk_writer_out.log</string>
546     <key>StandardErrorPath</key>
547     <string>/var/log/dcpomatic_disk_writer_err.log</string>
548     <key>LaunchEvents</key>
549     <dict>
550         <key>com.apple.notifyd.matching</key>
551         <dict>
552             <key>com.dcpomatic.disk.writer.start</key>
553             <dict>
554                 <key>Notification</key>
555                 <string>com.dcpomatic.disk.writer.start</string>
556             </dict>
557         </dict>
558     </dict>
559 </dict>
560 </plist>
561 EOF
562
563 # Get the binaries together in $pkgbin then move them to the
564 # place with spaces in the filename to avoid some of the pain of escaping
565
566 mkdir $pkgbin
567 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
568 copy_libs "$pkgbin"
569
570 rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
571 relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
572
573 mkdir $pkgbase/scripts
574 cat > $pkgbase/scripts/postinstall <<EOF
575 #!/bin/sh
576 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
577 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
578 exit 0
579 EOF
580 chmod gou+x $pkgbase/scripts/postinstall
581
582 find "$pkgbin" -iname "*.dylib" -print0 | while IFS= read -r -d '' f; do
583     sign "$f"
584 done
585 sign "$pkgbin/dcpomatic2_disk_writer"
586
587 mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
588 mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
589 pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
590
591 make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer" com.dcpomatic.disk
592