Seems over-complicated to use SDK-specific subdirectories.
[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         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
224         changes=""
225         for dep in $deps; do
226             base=`basename $dep`
227                 # $dep will be a path within x86_64; make arm64 path too
228                 dep_arm64=`echo $dep | sed -e "s/\/x86_64\//\/arm64\//g"`
229                 changes="$changes -change $dep @executable_path/../Frameworks/$base -change $dep_arm64 @executable_path/../Frameworks/$base"
230         done
231         if test "x$changes" != "x"; then
232             install_name_tool $changes -id `basename "$obj"` "$obj"
233         fi
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                 deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
247                 for dep in $deps; do
248                         base=`basename $dep`
249                         install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
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 OS X 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 OS X 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 prefix=$ROOT/arm64
388
389 # DCP-o-matic main
390 setup "DCP-o-matic 2.app"
391 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
392 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
393 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
394 copy $ROOT bin/ffprobe "$approot/MacOS"
395 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
396 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
397 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
398 relink_relative "${rl[@]}"
399 make_dmg "$appdir" "" "DCP-o-matic"
400
401 # DCP-o-matic KDM Creator
402 setup "DCP-o-matic 2 KDM Creator.app"
403 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
404 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
405 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
406 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
407 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
408 relink_relative "${rl[@]}"
409 make_dmg "$appdir" "" "DCP-o-matic KDM Creator"
410
411 # DCP-o-matic Encode Server
412 setup "DCP-o-matic 2 Encode Server.app"
413 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
414 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
415 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
416 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
417 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
418 relink_relative "${rl[@]}"
419 make_dmg "$appdir" "" "DCP-o-matic Encode Server"
420
421 # DCP-o-matic Batch Converter
422 setup "DCP-o-matic 2 Batch converter.app"
423 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
424 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
425 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
426 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
427 relink_relative "${rl[@]}"
428 make_dmg "$appdir" "" "DCP-o-matic Batch Converter"
429
430 # DCP-o-matic Player
431 setup "DCP-o-matic 2 Player.app"
432 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
433 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
434 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
435 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
436 relink_relative "${rl[@]}"
437 make_dmg "$appdir" "" "DCP-o-matic Player"
438
439 # DCP-o-matic Playlist Editor
440 setup "DCP-o-matic 2 Playlist Editor.app"
441 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
442 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
443 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
444 rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
445 relink_relative "${rl[@]}"
446 make_dmg "$appdir" "" "DCP-o-matic Playlist Editor"
447
448 # DCP-o-matic Combiner
449 setup "DCP-o-matic 2 Combiner.app"
450 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_combiner "$approot/MacOS"
451 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
452 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_combiner.Info.plist "$approot/Info.plist"
453 rl=("$approot/MacOS/dcpomatic2_combiner" "$approot/Frameworks/"*.dylib)
454 relink_relative "${rl[@]}"
455 make_dmg "$appdir" "" "DCP-o-matic Combiner"
456
457 # DCP-o-matic Disk Writer .app
458 setup "DCP-o-matic 2 Disk Writer.app"
459 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
460 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
461 cp $prefix/src/dcpomatic/platform/osx/uninstall_disk.applescript "$approot/Resources"
462 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
463 rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
464 relink_relative "${rl[@]}"
465
466 # DCP-o-matic Disk Writer daemon .pkg
467
468 pkgbase=tmp-disk-writer
469 rm -rf $pkgbase
470 mkdir $pkgbase
471 pkgbin=$pkgbase/bin
472 pkgroot=$pkgbase/root
473
474 mkdir -p $pkgroot/Library/LaunchDaemons
475 cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
476 <?xml version="1.0" encoding="UTF-8"?>
477 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
478 <plist version="1.0">
479 <dict>
480     <key>Label</key>
481     <string>com.dcpomatic.disk.writer</string>
482     <key>ProgramArguments</key>
483     <array>
484         <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
485     </array>
486     <key>EnvironmentVariables</key>
487     <dict>
488         <key>DYLD_LIBRARY_PATH</key>
489         <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
490     </dict>
491     <key>StandardOutPath</key>
492     <string>/var/log/dcpomatic_disk_writer_out.log</string>
493     <key>StandardErrorPath</key>
494     <string>/var/log/dcpomatic_disk_writer_err.log</string>
495     <key>LaunchEvents</key>
496     <dict>
497         <key>com.apple.notifyd.matching</key>
498         <dict>
499             <key>com.dcpomatic.disk.writer.start</key>
500             <dict>
501                 <key>Notification</key>
502                 <string>com.dcpomatic.disk.writer.start</string>
503             </dict>
504         </dict>
505     </dict>
506 </dict>
507 </plist>
508 EOF
509
510 # Get the binaries together in $pkgbin then move them to the
511 # place with spaces in the filename to avoid some of the pain of escaping
512
513 mkdir $pkgbin
514 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
515 copy_libs "$pkgbin"
516
517 rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
518 relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
519
520 mkdir $pkgbase/scripts
521 cat > $pkgbase/scripts/postinstall <<EOF
522 #!/bin/sh
523 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
524 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
525 exit 0
526 EOF
527 chmod gou+x $pkgbase/scripts/postinstall
528
529 find "$pkgbin" -iname "*.dylib" -print0 | while IFS= read -r -d '' f; do
530     sign "$f"
531 done
532 sign "$pkgbin/dcpomatic2_disk_writer"
533
534 mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
535 mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
536 pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
537
538 make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer"
539