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