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