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