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