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