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