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