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