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