f997af8175713f2ce2e2cf08b8ae9cb95783acf3
[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
248     # i18n: DCP-o-matic .mo files
249     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
250         mkdir -p "$dest/$lang/LC_MESSAGES"
251         cp $prefix/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
252         cp $prefix/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
253         cp $prefix/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
254     done
255
256     # i18n: wxWidgets .mo files
257     for lang in de es fr it sv nl ru pl da cs; do
258         mkdir "$dest/$lang"
259         cp $ENV/$ARCH1/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
260     done
261 }
262
263 # param $1 list of things that link to other things
264 function relink_relative {
265     to_relink=`echo $to_relink | sed -e "s/\+//g"`
266     local linkers=("$@")
267
268         arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
269         arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
270
271         for arch in $arch1_name $arch2_name; do
272                 for obj in "${linkers[@]}"; do
273                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|@rpath|boost|libicu|libssh)"`
274                         changes=""
275                         for dep in $deps; do
276                                 base=`basename $dep`
277                                 changes="$changes -change $dep @executable_path/../Frameworks/$base"
278                         done
279                         if test "x$changes" != "x"; then
280                                 install_name_tool $changes -id `basename "$obj"` "$obj"
281                         fi
282                 done
283         done
284 }
285
286 # param $1 directory things should be relinked into
287 #       $2 list of things that link to other things
288 function relink_absolute {
289     to_relink=`echo $to_relink | sed -e "s/\+//g"`
290     target=$1
291     shift
292     local linkers=("$@")
293
294         arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
295         arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
296
297         for arch in $arch1_name $arch2_name; do
298                 for obj in "${linkers[@]}"; do
299                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
300                         for dep in $deps; do
301                                 base=`basename $dep`
302                                 install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
303                         done
304                 done
305         done
306 }
307
308 function sign {
309         codesign --verify --verbose=4 --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$1"
310         if [ "$?" != "0" ]; then
311                 echo "Failed to sign $1"
312                 exit 1
313         fi
314 }
315
316 # @param #1 .app directory
317 # @param #2 .pkg or ""
318 # @param #3 full name e.g. DCP-o-matic Batch Converter
319 # @param #4 list of executables
320 function make_dmg {
321     local appdir="$1"
322     local pkg="$2"
323     local full_name="$3"
324     local exes="$4"
325         tmp_dmg=dcpomatic_tmp.dmg
326         if [ "$ARCH2" == "" ]; then
327                 dmg="$full_name $version macOS10.8+.dmg"
328         else
329                 dmg="$full_name $version macOS10.10+.dmg"
330         fi
331     vol_name=DCP-o-matic-$version
332
333         find "$appdir/Contents/Frameworks" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
334                 sign "$f"
335         done
336         for f in $exes; do
337                 sign "$appdir/Contents/MacOS/$f"
338         done
339
340     if [ "$pkg" != "" ]; then
341         productsign --sign "$INSTALLER_IDENTITY" "$pkg" "signed_temp.pkg"
342         if [ "$?" != "0" ]; then
343             echo "Failed to sign .pkg"
344             exit 1
345         fi
346         mv signed_temp.pkg "$pkg"
347     fi
348
349     mkdir -p $vol_name
350     cp -a "$appdir" $vol_name
351     if [ "$pkg" != "" ]; then
352         cp -a "$pkg" $vol_name
353     fi
354     ln -s /Applications "$vol_name/Applications"
355     cat<<EOF > "$vol_name/READ ME.txt"
356 Welcome to DCP-o-matic!  The first time you run the program there may be
357 a long (several-minute) delay while macOS checks the code for viruses and
358 other malware.  Please be patient!
359 EOF
360     cat<<EOF > "$vol_name/READ ME.de_DE.txt"
361 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
362 Verifikationsvorgang auftreten.  Dies ist von der macOS Sicherheitsumgebung
363 'Gatekeeper' verursacht.  Dieser je nach Rechner teils minutenlange
364 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
365 es ist kein Programmfehler.  Warten sie die Verifikation für jede der
366 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
367 mehr auftreten.
368 EOF
369
370     if [ "$pkg" != "" ]; then
371         cat<<EOF > "$vol_name/READ ME.txt"
372
373 To run this software successfully you must install $pkg before running
374 the .app
375 EOF
376     fi
377
378     if [ "$pkg" != "" ]; then
379         cat<<EOF > "$vol_name/READ ME.de_DE.txt"
380
381 To run this software successfully you must install $pkg before running
382 the .app
383 EOF
384
385     fi
386     rm -f $tmp_dmg "$dmg"
387     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
388     attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
389     device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
390     sleep 5
391
392     echo '
393   tell application "Finder"
394     tell disk "'$vol_name'"
395            open
396            set current view of container window to icon view
397            set toolbar visible of container window to false
398            set statusbar visible of container window to false
399            set the bounds of container window to {400, 200, 1160, 600}
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 theViewOptions to the icon view options of container window
403            set arrangement of theViewOptions to not arranged
404            set icon size of theViewOptions to 64
405            set position of item "'$appdir'" of container window to {90, 80}
406            set position of item "Applications" of container window to {265, 80}
407            set position of item "READ ME.txt" of container window to {430, 80}
408            set position of item "READ ME.de_DE.txt" of container window to {595, 80}
409            set position of item "DCP-o-matic Disk Writer.pkg" of container window to {90, 255}
410            close
411            open
412            update without registering applications
413            delay 5
414      end tell
415    end tell
416 ' | osascript
417
418     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
419     sync
420
421     hdiutil eject $device
422     hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
423     sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
424     DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
425     Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
426     SetFile -a C "$dmg"
427     xattr -c "$dmg"
428
429     set -e
430     codesign --timestamp --verify --verbose --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$dmg"
431     set +e
432
433     rm $tmp_dmg
434     rm -rf $vol_name
435 }
436
437 # @param #1 appdir
438 function setup {
439     appdir="$1"
440     approot="$appdir/Contents"
441     rm -rf "$appdir"
442     mkdir -p "$approot/MacOS"
443     mkdir -p "$approot/Frameworks"
444     mkdir -p "$approot/Resources"
445
446     to_relink="dcpomatic"
447     copy_libs "$approot/Frameworks"
448     copy_resources "$approot/Resources"
449 }
450
451 function copy_verify {
452         copy $ROOT src/libdcp/build/tools/dcpverify "$approot/MacOS"
453         mv "$approot/MacOS/dcpverify" "$approot/MacOS/dcpomatic2_verify"
454         rl=("$approot/MacOS/dcpomatic2_verify" "$approot/Frameworks/"*.dylib)
455         relink_relative "${rl[@]}"
456 }
457
458 if [ "$ARCH2" == "" ]; then
459         prefix=$ROOT
460 else
461         prefix=$ROOT/$ARCH2
462 fi
463
464 # DCP-o-matic main
465 setup "DCP-o-matic 2.app"
466 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
467 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
468 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
469 copy $ROOT bin/ffprobe "$approot/MacOS"
470 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
471 copy_verify
472 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
473 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
474 relink_relative "${rl[@]}"
475 make_dmg "$appdir" "" "DCP-o-matic" "dcpomatic2_verify openssl ffprobe dcpomatic2_cli dcpomatic2_create dcpomatic2"
476
477 # DCP-o-matic KDM Creator
478 setup "DCP-o-matic 2 KDM Creator.app"
479 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
480 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
481 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
482 copy_verify
483 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
484 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
485 relink_relative "${rl[@]}"
486 make_dmg "$appdir" "" "DCP-o-matic KDM Creator" "dcpomatic2_verify openssl dcpomatic2_kdm_cli dcpomatic2_kdm"
487
488 # DCP-o-matic Encode Server
489 setup "DCP-o-matic 2 Encode Server.app"
490 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
491 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
492 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
493 copy_verify
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" "dcpomatic2_verify openssl dcpomatic2_server_cli dcpomatic2_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 copy_verify
504 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
505 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
506 relink_relative "${rl[@]}"
507 make_dmg "$appdir" "" "DCP-o-matic Batch Converter" "dcpomatic2_verify openssl dcpomatic2_batch"
508
509 # DCP-o-matic Player
510 setup "DCP-o-matic 2 Player.app"
511 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
512 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
513 copy_verify
514 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
515 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
516 relink_relative "${rl[@]}"
517 make_dmg "$appdir" "" "DCP-o-matic Player" "dcpomatic2_verify openssl dcpomatic2_player"
518
519 # DCP-o-matic Playlist Editor
520 setup "DCP-o-matic 2 Playlist Editor.app"
521 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
522 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
523 copy_verify
524 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
525 rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
526 relink_relative "${rl[@]}"
527 make_dmg "$appdir" "" "DCP-o-matic Playlist Editor" "dcpomatic2_verify openssl dcpomatic2_playlist"
528
529 # DCP-o-matic Combiner
530 setup "DCP-o-matic 2 Combiner.app"
531 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_combiner "$approot/MacOS"
532 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
533 copy_verify
534 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_combiner.Info.plist "$approot/Info.plist"
535 rl=("$approot/MacOS/dcpomatic2_combiner" "$approot/Frameworks/"*.dylib)
536 relink_relative "${rl[@]}"
537 make_dmg "$appdir" "" "DCP-o-matic Combiner" "dcpomatic2_verify openssl dcpomatic2_combiner"
538
539 # DCP-o-matic Disk Writer .app
540 setup "DCP-o-matic 2 Disk Writer.app"
541 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
542 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
543 copy_verify
544 cp $prefix/src/dcpomatic/platform/osx/uninstall_disk.applescript "$approot/Resources"
545 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
546 rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
547 relink_relative "${rl[@]}"
548
549 # DCP-o-matic Disk Writer daemon .pkg
550
551 pkgbase=tmp-disk-writer
552 rm -rf $pkgbase
553 mkdir $pkgbase
554 pkgbin=$pkgbase/bin
555 pkgroot=$pkgbase/root
556
557 mkdir -p $pkgroot/Library/LaunchDaemons
558 cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
559 <?xml version="1.0" encoding="UTF-8"?>
560 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
561 <plist version="1.0">
562 <dict>
563     <key>Label</key>
564     <string>com.dcpomatic.disk.writer</string>
565     <key>ProgramArguments</key>
566     <array>
567         <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
568     </array>
569     <key>EnvironmentVariables</key>
570     <dict>
571         <key>DYLD_LIBRARY_PATH</key>
572         <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
573     </dict>
574     <key>StandardOutPath</key>
575     <string>/var/log/dcpomatic_disk_writer_out.log</string>
576     <key>StandardErrorPath</key>
577     <string>/var/log/dcpomatic_disk_writer_err.log</string>
578     <key>LaunchEvents</key>
579     <dict>
580         <key>com.apple.notifyd.matching</key>
581         <dict>
582             <key>com.dcpomatic.disk.writer.start</key>
583             <dict>
584                 <key>Notification</key>
585                 <string>com.dcpomatic.disk.writer.start</string>
586             </dict>
587         </dict>
588     </dict>
589 </dict>
590 </plist>
591 EOF
592
593 # Get the binaries together in $pkgbin then move them to the
594 # place with spaces in the filename to avoid some of the pain of escaping
595
596 mkdir $pkgbin
597 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
598 copy_libs "$pkgbin"
599
600 rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
601 relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
602
603 mkdir $pkgbase/scripts
604 cat > $pkgbase/scripts/postinstall <<EOF
605 #!/bin/sh
606 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
607 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
608 exit 0
609 EOF
610 chmod gou+x $pkgbase/scripts/postinstall
611
612 find "$pkgbin" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
613     sign "$f"
614 done
615 sign "$pkgbin/dcpomatic2_disk_writer"
616
617 mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
618 mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
619 pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
620
621 make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer" "dcpomatic2_verify openssl dcpomatic2_disk"
622