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