3 SYNTAX="make_dmg.sh -e <environment> -r <builddir> -i <apple-id> -p <apple-password> -a <arch1> [-a <arch2>] [-b <id>]"
5 # e.g. make_dmg.sh -e /Users/carl/osx-environment -r /Users/carl/cdist -i foo@bar.net -p opensesame -a x86_64/10.10 -a arm64/11.0 [-b dcpomatic2_player]
7 # Don't set -e here as egrep (used a few times) returns 1 if no matches
10 BUILD="main kdm server batch player playlist combiner editor disk"
11 while getopts "e:r:i:p:a:b:" o; do
23 APPLE_PASSWORD=${OPTARG}
34 # Use a tag if what we've built is exactly on one
35 version=$(git describe --tags --abbrev=0 --match=v2.*.* --exact-match 2> /dev/null)
36 if [ "$?" == "0" ]; then
37 version=$(echo $version | sed -e "s/^v//")
39 # Otherwise use <branch>-<commit>
40 version="$(basename $(git name-rev --name-only HEAD))-$(git rev-parse --short HEAD)"
43 # DMG size in megabytes
49 APPLICATION_IDENTITY="Developer ID Application: Carl Hetherington (R82DXSR997)"
50 INSTALLER_IDENTITY="Developer ID Installer: Carl Hetherington (R82DXSR997)"
52 # This is our work area for making up the .dmgs
53 mkdir -p build/platform/osx
56 cat <<EOF > entitlements.plist
57 <?xml version="1.0" encoding="UTF-8"?>
58 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
61 <key>com.apple.security.cs.disable-library-validation</key>
63 <key>com.apple.security.cs.allow-dyld-environment-variables</key>
70 if [ "$ARCH2" == "" ]; then
73 ln -s $(readlink $f) "$3/`basename $f`"
75 cp $f "$3/`basename $f`"
79 for f in $1/$ARCH2/$2; do
81 ln -s $(readlink $f) "$3/`basename $f`"
83 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
85 lipo -create $f $g -output "$3/$(basename $f)"
91 function copy_lib_root {
92 if [ "$ARCH2" == "" ]; then
93 for f in $ROOT/lib/$1*.dylib; do
95 ln -s $(readlink $f) "$2/`basename $f`"
97 cp $f "$2/`basename $f`"
101 for f in $ROOT/$ARCH2/lib/$1*.dylib; do
103 ln -s $(readlink $f) "$2/`basename $f`"
105 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
107 lipo -create $f $g -output "$2/$(basename $f)"
111 to_relink="$to_relink|$1"
114 function copy_lib_env {
115 if [ "$ARCH2" == "" ]; then
116 for f in $ENV/$ARCH1/lib/$1*.dylib; do
118 ln -s $(readlink $f) "$2/`basename $f`"
120 cp $f "$2/`basename $f`"
124 for f in $ENV/$ARCH2/lib/$1*.dylib; do
126 ln -s $(readlink $f) "$2/`basename $f`"
128 g=`echo $f | sed -e "s@/$ARCH2/@/$ARCH1/@g"`
130 lipo -create $f $g -output "$2/$(basename $f)"
134 to_relink="$to_relink|$1"
137 # @param #1 directory to copy to
140 copy_lib_root libcxml "$dest"
141 copy_lib_root libdcp-1.0 "$dest"
142 copy_lib_root libasdcp-carl "$dest"
143 copy_lib_root libkumu-carl "$dest"
144 copy_lib_root libsub "$dest"
145 copy_lib_root libopenjp2 "$dest"
146 copy_lib_root libavdevice "$dest"
147 copy_lib_root libavformat "$dest"
148 copy_lib_root libavfilter "$dest"
149 copy_lib_root libavutil "$dest"
150 copy_lib_root libavcodec "$dest"
151 copy_lib_root libswscale "$dest"
152 copy_lib_root libpostproc "$dest"
153 copy_lib_root libswresample "$dest"
154 copy_lib_root liblwext4 "$dest"
155 copy_lib_root libblockdev "$dest"
156 copy_lib_root libleqm_nrt "$dest"
157 copy $ROOT src/dcpomatic/build/src/lib/libdcpomatic2.dylib "$dest"
158 copy $ROOT src/dcpomatic/build/src/wx/libdcpomatic2-wx.dylib "$dest"
159 copy_lib_env libboost_system "$dest"
160 copy_lib_env libboost_filesystem "$dest"
161 copy_lib_env libboost_thread "$dest"
162 copy_lib_env libboost_date_time "$dest"
163 copy_lib_env libboost_locale "$dest"
164 copy_lib_env libboost_regex "$dest"
165 copy_lib_env libxml++ "$dest"
166 copy_lib_env libxslt "$dest"
167 copy_lib_env libxml2 "$dest"
168 copy_lib_env libglibmm-2.4 "$dest"
169 copy_lib_env libgobject "$dest"
170 copy_lib_env libgthread "$dest"
171 copy_lib_env libgmodule "$dest"
172 copy_lib_env libsigc "$dest"
173 copy_lib_env libglib-2 "$dest"
174 copy_lib_env libintl "$dest"
175 copy_lib_env libsndfile "$dest"
176 copy_lib_env libssh "$dest"
177 copy_lib_env libwx "$dest"
178 copy_lib_env libfontconfig "$dest"
179 copy_lib_env libfreetype "$dest"
180 copy_lib_env libexpat "$dest"
181 copy_lib_env libltdl "$dest"
182 copy_lib_env libxmlsec1 "$dest"
183 copy_lib_env libcurl "$dest"
184 copy_lib_env libffi "$dest"
185 copy_lib_env libpango "$dest"
186 copy_lib_env libcairo "$dest"
187 copy_lib_env libpixman "$dest"
188 copy_lib_env libharfbuzz "$dest"
189 copy_lib_env libsamplerate "$dest"
190 copy_lib_env libicui18n "$dest"
191 copy_lib_env libicudata "$dest"
192 copy_lib_env libicuio "$dest"
193 copy_lib_env libicutest "$dest"
194 copy_lib_env libicutu "$dest"
195 copy_lib_env libicuuc "$dest"
196 copy_lib_env libFLAC "$dest"
197 copy_lib_env libvorbis "$dest"
198 copy_lib_env libogg "$dest"
199 copy_lib_env libxerces-c "$dest"
200 copy_lib_env libcrypto "$dest"
201 copy_lib_env libssl "$dest"
202 copy_lib_env libfribidi "$dest"
203 copy_lib_env libgio "$dest"
204 copy_lib_env libz "$dest"
205 copy_lib_env libdav1d "$dest"
208 # @param #1 directory to copy to
209 function copy_resources {
211 if [ "$ARCH2" == "" ]; then
214 local prefix=$ROOT/$ARCH1
216 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_white.png "$dest"
217 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic_small_black.png "$dest"
218 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
219 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
220 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
221 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
222 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
223 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_playlist.icns "$dest"
224 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_disk.icns "$dest"
225 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_combiner.icns "$dest"
226 cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_editor.icns "$dest"
227 cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults*.png "$dest"
228 cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email*.png "$dest"
229 cp $prefix/src/dcpomatic/graphics/osx/preferences/email*.png "$dest"
230 cp $prefix/src/dcpomatic/graphics/osx/preferences/servers*.png "$dest"
231 cp $prefix/src/dcpomatic/graphics/osx/preferences/tms*.png "$dest"
232 cp $prefix/src/dcpomatic/graphics/osx/preferences/keys*.png "$dest"
233 cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet*.png "$dest"
234 cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications*.png "$dest"
235 cp $prefix/src/dcpomatic/graphics/osx/preferences/sound*.png "$dest"
236 cp $prefix/src/dcpomatic/graphics/osx/preferences/identifiers*.png "$dest"
237 cp $prefix/src/dcpomatic/graphics/osx/preferences/general*.png "$dest"
238 cp $prefix/src/dcpomatic/graphics/osx/preferences/advanced*.png "$dest"
239 cp $prefix/src/dcpomatic/graphics/osx/preferences/locations*.png "$dest"
240 cp $prefix/src/dcpomatic/graphics/osx/preferences/non_standard*.png "$dest"
241 cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
242 cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
243 cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
244 cp $prefix/src/dcpomatic/fonts/fonts.conf.osx "$dest"/fonts.conf
245 cp $prefix/src/dcpomatic/graphics/splash.png "$dest"
246 cp $prefix/src/dcpomatic/graphics/zoom*.png "$dest"
247 cp $prefix/src/dcpomatic/graphics/zoom_all*.png "$dest"
248 cp $prefix/src/dcpomatic/graphics/select*.png "$dest"
249 cp $prefix/src/dcpomatic/graphics/snap*.png "$dest"
250 cp $prefix/src/dcpomatic/graphics/sequence*.png "$dest"
251 cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
252 cp $prefix/src/dcpomatic/graphics/link.png "$dest"
253 cp $prefix/src/dcpomatic/graphics/tick.png "$dest"
254 cp $prefix/src/dcpomatic/graphics/no_tick.png "$dest"
255 cp $prefix/src/dcpomatic/graphics/add*.png "$dest"
256 cp $prefix/src/dcpomatic/graphics/pause*.png "$dest"
257 cp -r $prefix/share/libdcp/xsd "$dest"
258 cp -r $prefix/share/libdcp/tags "$dest"
259 cp -r $prefix/share/libdcp/ratings "$dest"
261 # i18n: DCP-o-matic .mo files
262 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 hu_HU; do
263 mkdir -p "$dest/$lang/LC_MESSAGES"
264 cp $prefix/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
265 cp $prefix/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
266 cp $prefix/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
269 # i18n: wxWidgets .mo files
270 for lang in de es fr it sv nl ru pl da cs sl; do
272 cp $ENV/$ARCH1/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
276 # param $1 list of things that link to other things
277 function relink_relative {
278 to_relink=`echo $to_relink | sed -e "s/\+//g"`
281 arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
282 arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
284 for arch in $arch1_name $arch2_name; do
285 for obj in "${linkers[@]}"; do
286 deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|@rpath|boost|libicu|libssh)"`
290 changes="$changes -change $dep @executable_path/../Frameworks/$base"
292 if test "x$changes" != "x"; then
293 install_name_tool $changes -id `basename "$obj"` "$obj"
299 # param $1 directory things should be relinked into
300 # $2 list of things that link to other things
301 function relink_absolute {
302 to_relink=`echo $to_relink | sed -e "s/\+//g"`
307 arch1_name=$(echo $ARCH1 | sed -e s@/.*@@)
308 arch2_name=$(echo $ARCH2 | sed -e s@/.*@@)
310 for arch in $arch1_name $arch2_name; do
311 for obj in "${linkers[@]}"; do
312 deps=`otool -arch $arch -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu|libssh)"`
315 install_name_tool -change "$dep" "$target"/$base -id `basename "$obj"` "$obj"
322 codesign --verify --verbose=4 --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$1"
323 if [ "$?" != "0" ]; then
324 echo "Failed to sign $1"
329 # @param #1 .app directory
330 # @param #2 .pkg or ""
331 # @param #3 full name e.g. DCP-o-matic Batch Converter
332 # @param #4 list of executables
338 tmp_dmg=dcpomatic_tmp.dmg
339 if [ "$ARCH2" == "" ]; then
340 dmg="$full_name $version macOS10.8+.dmg"
342 dmg="$full_name $version macOS10.10+.dmg"
344 vol_name=DCP-o-matic-$version
346 find "$appdir/Contents/Frameworks" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
350 sign "$appdir/Contents/MacOS/$f"
353 if [ "$pkg" != "" ]; then
354 productsign --sign "$INSTALLER_IDENTITY" "$pkg" "signed_temp.pkg"
355 if [ "$?" != "0" ]; then
356 echo "Failed to sign .pkg"
359 mv signed_temp.pkg "$pkg"
363 cp -a "$appdir" $vol_name
364 if [ "$pkg" != "" ]; then
365 cp -a "$pkg" $vol_name
367 ln -s /Applications "$vol_name/Applications"
368 cat<<EOF > "$vol_name/READ ME.txt"
369 Welcome to DCP-o-matic! The first time you run the program there may be
370 a long (several-minute) delay while macOS checks the code for viruses and
371 other malware. Please be patient!
373 cat<<EOF > "$vol_name/READ ME.de_DE.txt"
374 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
375 Verifikationsvorgang auftreten. Dies ist von der macOS Sicherheitsumgebung
376 'Gatekeeper' verursacht. Dieser je nach Rechner teils minutenlange
377 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
378 es ist kein Programmfehler. Warten sie die Verifikation für jede der
379 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
383 if [ "$pkg" != "" ]; then
384 cat<<EOF > "$vol_name/READ ME.txt"
386 To run this software successfully you must install $pkg before running
391 if [ "$pkg" != "" ]; then
392 cat<<EOF > "$vol_name/READ ME.de_DE.txt"
394 To run this software successfully you must install $pkg before running
399 rm -f $tmp_dmg "$dmg"
400 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
401 attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
402 device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
406 tell application "Finder"
407 tell disk "'$vol_name'"
409 set current view of container window to icon view
410 set toolbar visible of container window to false
411 set statusbar visible of container window to false
412 set the bounds of container window to {400, 200, 1160, 600}
413 set the bounds of container window to {400, 200, 1160, 600}
414 set the bounds of container window to {400, 200, 1160, 600}
415 set theViewOptions to the icon view options of container window
416 set arrangement of theViewOptions to not arranged
417 set icon size of theViewOptions to 64
418 set position of item "'$appdir'" of container window to {90, 80}
419 set position of item "Applications" of container window to {265, 80}
420 set position of item "READ ME.txt" of container window to {430, 80}
421 set position of item "READ ME.de_DE.txt" of container window to {595, 80}
422 set position of item "DCP-o-matic Disk Writer.pkg" of container window to {90, 255}
425 update without registering applications
431 chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
434 hdiutil eject $device
435 hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
436 sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
437 DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
438 Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
443 codesign --timestamp --verify --verbose --options runtime --entitlements entitlements.plist --sign "$APPLICATION_IDENTITY" "$dmg"
453 approot="$appdir/Contents"
455 mkdir -p "$approot/MacOS"
456 mkdir -p "$approot/Frameworks"
457 mkdir -p "$approot/Resources"
459 to_relink="dcpomatic"
460 copy_libs "$approot/Frameworks"
461 copy_resources "$approot/Resources"
464 function copy_verify {
465 copy $ROOT src/libdcp/build/tools/dcpverify "$approot/MacOS"
466 mv "$approot/MacOS/dcpverify" "$approot/MacOS/dcpomatic2_verify"
467 rl=("$approot/MacOS/dcpomatic2_verify" "$approot/Frameworks/"*.dylib)
468 relink_relative "${rl[@]}"
472 copy $ROOT src/libdcp/build/tools/dcpkdm "$approot/MacOS"
473 mv "$approot/MacOS/dcpkdm" "$approot/MacOS/dcpomatic2_kdm_inspect"
474 rl=("$approot/MacOS/dcpomatic2_kdm_inspect" "$approot/Frameworks/"*.dylib)
475 relink_relative "${rl[@]}"
478 if [ "$ARCH2" == "" ]; then
484 if [[ "$BUILD" == *main* ]]; then
486 setup "DCP-o-matic 2.app"
487 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
488 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
489 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
490 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_map "$approot/MacOS"
491 copy $ROOT bin/ffprobe "$approot/MacOS"
492 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
495 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
496 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/dcpomatic2_map" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
497 relink_relative "${rl[@]}"
498 make_dmg "$appdir" "" "DCP-o-matic" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl ffprobe dcpomatic2_cli dcpomatic2_create dcpomatic2 dcpomatic2_map"
501 if [[ "$BUILD" == *kdm* ]]; then
502 # DCP-o-matic KDM Creator
503 setup "DCP-o-matic 2 KDM Creator.app"
504 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
505 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
506 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
509 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
510 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
511 relink_relative "${rl[@]}"
512 make_dmg "$appdir" "" "DCP-o-matic KDM Creator" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_kdm_cli dcpomatic2_kdm"
515 if [[ "$BUILD" == *server* ]]; then
516 # DCP-o-matic Encode Server
517 setup "DCP-o-matic 2 Encode Server.app"
518 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
519 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
520 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
523 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
524 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
525 relink_relative "${rl[@]}"
526 make_dmg "$appdir" "" "DCP-o-matic Encode Server" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_server_cli dcpomatic2_server"
529 if [[ "$BUILD" == *batch* ]]; then
530 # DCP-o-matic Batch Converter
531 setup "DCP-o-matic 2 Batch converter.app"
532 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
533 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
536 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
537 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
538 relink_relative "${rl[@]}"
539 make_dmg "$appdir" "" "DCP-o-matic Batch Converter" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_batch"
542 if [[ "$BUILD" == *player* ]]; then
544 setup "DCP-o-matic 2 Player.app"
545 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
546 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
549 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
550 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
551 relink_relative "${rl[@]}"
552 make_dmg "$appdir" "" "DCP-o-matic Player" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_player"
555 if [[ "$BUILD" == *playlist* ]]; then
556 # DCP-o-matic Playlist Editor
557 setup "DCP-o-matic 2 Playlist Editor.app"
558 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
559 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
562 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
563 rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
564 relink_relative "${rl[@]}"
565 make_dmg "$appdir" "" "DCP-o-matic Playlist Editor" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_playlist"
568 if [[ "$BUILD" == *combiner* ]]; then
569 # DCP-o-matic Combiner
570 setup "DCP-o-matic 2 Combiner.app"
571 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_combiner "$approot/MacOS"
572 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
575 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_combiner.Info.plist "$approot/Info.plist"
576 rl=("$approot/MacOS/dcpomatic2_combiner" "$approot/Frameworks/"*.dylib)
577 relink_relative "${rl[@]}"
578 make_dmg "$appdir" "" "DCP-o-matic Combiner" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_combiner"
581 if [[ "$BUILD" == *editor* ]]; then
583 setup "DCP-o-matic 2 Editor.app"
584 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_editor "$approot/MacOS"
585 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
588 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_editor.Info.plist "$approot/Info.plist"
589 rl=("$approot/MacOS/dcpomatic2_editor" "$approot/Frameworks/"*.dylib)
590 relink_relative "${rl[@]}"
591 make_dmg "$appdir" "" "DCP-o-matic Editor" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_editor"
594 if [[ "$BUILD" == *disk* ]]; then
595 # DCP-o-matic Disk Writer .app
596 setup "DCP-o-matic 2 Disk Writer.app"
597 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
598 copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
601 cp $prefix/src/dcpomatic/platform/osx/uninstall_disk.applescript "$approot/Resources"
602 cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
603 rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
604 relink_relative "${rl[@]}"
606 # DCP-o-matic Disk Writer daemon .pkg
608 pkgbase=tmp-disk-writer
612 pkgroot=$pkgbase/root
614 mkdir -p $pkgroot/Library/LaunchDaemons
615 cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
616 <?xml version="1.0" encoding="UTF-8"?>
617 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
618 <plist version="1.0">
621 <string>com.dcpomatic.disk.writer</string>
622 <key>ProgramArguments</key>
624 <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
626 <key>EnvironmentVariables</key>
628 <key>DYLD_LIBRARY_PATH</key>
629 <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
631 <key>StandardOutPath</key>
632 <string>/var/log/dcpomatic_disk_writer_out.log</string>
633 <key>StandardErrorPath</key>
634 <string>/var/log/dcpomatic_disk_writer_err.log</string>
635 <key>LaunchEvents</key>
637 <key>com.apple.notifyd.matching</key>
639 <key>com.dcpomatic.disk.writer.start</key>
641 <key>Notification</key>
642 <string>com.dcpomatic.disk.writer.start</string>
650 # Get the binaries together in $pkgbin then move them to the
651 # place with spaces in the filename to avoid some of the pain of escaping
654 copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$pkgbin"
657 rl=("$pkgbin/dcpomatic2_disk_writer" "$pkgbin/"*.dylib)
658 relink_absolute "/Library/Application Support/com.dcpomatic" "${rl[@]}"
660 mkdir $pkgbase/scripts
661 cat > $pkgbase/scripts/postinstall <<EOF
663 /bin/launchctl unload "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
664 /bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
667 chmod gou+x $pkgbase/scripts/postinstall
669 find "$pkgbin" -iname "*.dylib" -type f -print0 | while IFS= read -r -d '' f; do
672 sign "$pkgbin/dcpomatic2_disk_writer"
674 mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
675 mv $pkgbin/* "$pkgroot/Library/Application Support/com.dcpomatic/"
676 pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
678 make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer" "dcpomatic2_verify dcpomatic2_kdm_inspect openssl dcpomatic2_disk"