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