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