Relink different architectures in a nicer and safer way.
[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 libicule "$dest"
131     copy_lib_env libiculx "$dest"
132     copy_lib_env libicutest "$dest"
133     copy_lib_env libicutu "$dest"
134     copy_lib_env libicuuc "$dest"
135     copy_lib_env libFLAC "$dest"
136     copy_lib_env libvorbis "$dest"
137     copy_lib_env libogg "$dest"
138     copy_lib_env libxerces-c "$dest"
139     copy_lib_env libcrypto "$dest"
140     copy_lib_env libssl "$dest"
141     copy_lib_env libfribidi "$dest"
142     copy_lib_env libgio "$dest"
143     copy_lib_env libz "$dest"
144 }
145
146 # @param #1 directory to copy to
147 function copy_resources {
148     local dest="$1"
149         local prefix=$ROOT/x86_64
150     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small.png "$dest"
151     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
152     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
153     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
154     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
155     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
156     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_playlist.icns "$dest"
157     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_disk.icns "$dest"
158     cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_combiner.icns "$dest"
159     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults.png "$dest"
160     cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults@2x.png "$dest"
161     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email.png "$dest"
162     cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email@2x.png "$dest"
163     cp $prefix/src/dcpomatic/graphics/osx/preferences/email.png "$dest"
164     cp $prefix/src/dcpomatic/graphics/osx/preferences/email@2x.png "$dest"
165     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers.png "$dest"
166     cp $prefix/src/dcpomatic/graphics/osx/preferences/servers@2x.png "$dest"
167     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms.png "$dest"
168     cp $prefix/src/dcpomatic/graphics/osx/preferences/tms@2x.png "$dest"
169     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys.png "$dest"
170     cp $prefix/src/dcpomatic/graphics/osx/preferences/keys@2x.png "$dest"
171     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet.png "$dest"
172     cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet@2x.png "$dest"
173     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications.png "$dest"
174     cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications@2x.png "$dest"
175     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound.png "$dest"
176     cp $prefix/src/dcpomatic/graphics/osx/preferences/sound@2x.png "$dest"
177     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers.png "$dest"
178     cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers@2x.png "$dest"
179     cp $prefix/src/dcpomatic/graphics/osx/preferences/general.png "$dest"
180     cp $prefix/src/dcpomatic/graphics/osx/preferences/general@2x.png "$dest"
181     cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced.png "$dest"
182     cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced@2x.png "$dest"
183     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations.png "$dest"
184     cp $prefix/src/dcpomatic/graphics/osx/preferences/locations@2x.png "$dest"
185     cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
186     cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
187     cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
188     cp $prefix/src/dcpomatic/fonts/fonts.conf.osx "$dest"/fonts.conf
189     cp $prefix/src/dcpomatic/graphics/splash.png "$dest"
190     cp $prefix/src/dcpomatic/graphics/zoom.png "$dest"
191     cp $prefix/src/dcpomatic/graphics/zoom_all.png "$dest"
192     cp $prefix/src/dcpomatic/graphics/select.png "$dest"
193     cp $prefix/src/dcpomatic/graphics/snap.png "$dest"
194     cp $prefix/src/dcpomatic/graphics/sequence.png "$dest"
195     cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
196     cp $prefix/src/dcpomatic/graphics/link.png "$dest"
197     cp $prefix/src/dcpomatic/graphics/tick.png "$dest"
198     cp $prefix/src/dcpomatic/graphics/no_tick.png "$dest"
199     cp -r $prefix/share/libdcp/xsd "$dest"
200     cp -r $prefix/share/libdcp/tags "$dest"
201
202     # i18n: DCP-o-matic .mo files
203     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
204         mkdir -p "$dest/$lang/LC_MESSAGES"
205         cp $prefix/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
206         cp $prefix/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
207         cp $prefix/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
208     done
209
210     # i18n: wxWidgets .mo files
211     for lang in de es fr it sv nl ru pl da cs; do
212         mkdir "$dest/$lang"
213         cp $ENV/x86_64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
214     done
215 }
216
217 # param $1 list of things that link to other things
218 function relink_relative {
219     to_relink=`echo $to_relink | sed -e "s/\+//g"`
220     local linkers=("$@")
221
222         for obj in "${linkers[@]}"; do
223                 for arch in x86_64 arm64; do
224                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
225                         changes=""
226                         for dep in $deps; do
227                                 base=`basename $dep`
228                                 changes="$changes -change $dep @executable_path/../Frameworks/$base"
229                         done
230                         if test "x$changes" != "x"; then
231                                 install_name_tool $changes -id `basename "$obj"` "$obj"
232                         fi
233                 done
234         done
235 }
236
237 # param $1 directory things should be relinked into
238 #       $2 list of things that link to other things
239 function relink_absolute {
240     to_relink=`echo $to_relink | sed -e "s/\+//g"`
241     target=$1
242     shift
243     local linkers=("$@")
244
245     for obj in "${linkers[@]}"; do
246                 for arch in x86_64 arm64; do
247                         deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
248                         for dep in $deps; do
249                                 base=`basename $dep`
250                                 install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
251                         done
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