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