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