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