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