#!/bin/bash
#
-# Syntax: make_dmg.sh <builddir> <type>
+# Syntax: make_dmg.sh <environment> <builddir> <type> <apple-id> <apple-password>
# where <type> is universal or thin
#
-# e.g. make_dmg.sh /Users/carl/cdist
+# e.g. make_dmg.sh /Users/carl/osx-environment /Users/carl/cdist universal foo@bar.net opensesame
# Don't set -e here as egrep (used a few times) returns 1 if no matches
# were found.
# DMG size in megabytes
DMG_SIZE=256
-ENV=/Users/carl/Environments/dcpomatic
-ROOT=$1
-TYPE=$2
+ENV=$1
+ROOT=$2
+TYPE=$3
+APPLE_ID=$4
+APPLE_PASSWORD=$5
if [ "$TYPE" != "universal" -a "$TYPE" != "thin" ]; then
echo "Syntax: $0 <builddir> <type>"
local dest="$1"
copy_lib_root libcxml "$dest"
copy_lib_root libdcp-1.0 "$dest"
- copy_lib_root libasdcp-cth "$dest"
- copy_lib_root libkumu-cth "$dest"
+ copy_lib_root libasdcp-carl "$dest"
+ copy_lib_root libkumu-carl "$dest"
copy_lib_root libsub "$dest"
copy_lib_root libopenjp2 "$dest"
copy_lib_root libavdevice "$dest"
copy_lib_root libswscale "$dest"
copy_lib_root libpostproc "$dest"
copy_lib_root libswresample "$dest"
+ copy_lib_root liblwext4 "$dest"
+ copy_lib_root libblockdev "$dest"
copy $ROOT src/dcpomatic/build/src/lib/libdcpomatic2.dylib "$dest"
copy $ROOT src/dcpomatic/build/src/wx/libdcpomatic2-wx.dylib "$dest"
copy_lib_env libboost_system "$dest"
copy_lib_env libFLAC "$dest"
copy_lib_env libvorbis "$dest"
copy_lib_env libogg "$dest"
+ copy_lib_env libxerces-c "$dest"
}
# @param #1 directory to copy to
cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
+ cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_playlist.icns "$dest"
+ cp $prefix/src/dcpomatic/graphics/osx/dcpomatic2_disk.icns "$dest"
cp $prefix/src/dcpomatic/graphics/osx/preferences/colour_conversions.png "$dest"
cp $prefix/src/dcpomatic/graphics/osx/preferences/defaults.png "$dest"
cp $prefix/src/dcpomatic/graphics/osx/preferences/kdm_email.png "$dest"
cp $prefix/src/dcpomatic/graphics/osx/preferences/keys.png "$dest"
cp $prefix/src/dcpomatic/graphics/osx/preferences/cover_sheet.png "$dest"
cp $prefix/src/dcpomatic/graphics/osx/preferences/notifications.png "$dest"
- cp $prefix/src/dcpomatic/graphics/osx/preferences/accounts.png "$dest"
cp $prefix/src/dcpomatic/graphics/osx/preferences/locations.png "$dest"
+ cp $prefix/src/dcpomatic/graphics/osx/preferences/sound.png "$dest"
cp $prefix/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
cp $prefix/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
cp $prefix/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
cp $prefix/src/dcpomatic/graphics/snap.png "$dest"
cp $prefix/src/dcpomatic/graphics/sequence.png "$dest"
cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
+ cp -r $prefix/share/libdcp/xsd "$dest"
# i18n: DCP-o-matic .mo files
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
}
# param $1 list of things that link to other things
-function relink {
+function relink_relative {
to_relink=`echo $to_relink | sed -e "s/\+//g"`
local linkers=("$@")
done
}
+# param $1 directory containg things
+# $2 list of things that link to other things
+function relink_absolute {
+ to_relink=`echo $to_relink | sed -e "s/\+//g"`
+ target=$1
+ shift
+ local linkers=("$@")
+
+ for obj in "${linkers[@]}"; do
+ deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
+ changes=""
+ for dep in $deps; do
+ base=`basename $dep`
+ changes="$changes -change "$dep" \"$target/$base\""
+ done
+ if test "x$changes" != "x"; then
+ install_name_tool $changes -id "`basename "$obj"`" "$obj"
+ fi
+ done
+}
+
+function sign {
+ codesign --deep --force --verify --verbose --options runtime --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$1"
+ if [ "$?" != "0" ]; then
+ echo "Failed to sign $1"
+ exit 1
+ fi
+}
+
+
# @param #1 .app directory
-# @param #2 full name e.g. DCP-o-matic Batch Converter
+# @param #2 .pkg or ""
+# @param #3 full name e.g. DCP-o-matic Batch Converter
+# @param #4 bundle id e.g. com.dcpomatic.batch
function make_dmg {
local appdir="$1"
- local full_name="$2"
+ local pkg="$2"
+ local full_name="$3"
+ local bundle_id="$4"
tmp_dmg=dcpomatic_tmp.dmg
dmg="$full_name $version.dmg"
vol_name=DCP-o-matic-$version
- codesign --deep --force --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$appdir"
- if [ "$?" != "0" ]; then
- echo "Failed to sign .app"
- exit 1
+ sign "$appdir"
+
+ if [ "$pkg" != "" ]; then
+ productsign --sign "Developer ID Installer: Carl Hetherington (R82DXSR997)" "$pkg" "signed_temp.pkg"
+ if [ "$?" != "0" ]; then
+ echo "Failed to sign .pkg"
+ exit 1
+ fi
+ mv signed_temp.pkg "$pkg"
fi
mkdir -p $vol_name
cp -a "$appdir" $vol_name
+ if [ "$pkg" != "" ]; then
+ cp -a "$pkg" $vol_name
+ fi
ln -s /Applications "$vol_name/Applications"
cat<<EOF > "$vol_name/READ ME.txt"
Welcome to DCP-o-matic! The first time you run the program there may be
mehr auftreten.
EOF
+ if [ "$pkg" != "" ]; then
+ cat<<EOF > "$vol_name/READ ME.txt"
+
+To run this software successfully you must install $pkg before running
+the .app
+EOF
+ fi
+
+ if [ "$pkg" != "" ]; then
+ cat<<EOF > "$vol_name/READ ME.de_DE.txt"
+
+To run this software successfully you must install $pkg before running
+the .app
+EOF
+
+ fi
rm -f $tmp_dmg "$dmg"
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
attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
- set the bounds of container window to {400, 200, 940, 300}
+ set the bounds of container window to {400, 200, 940, 600}
set theViewOptions to the icon view options of container window
set arrangement of theViewOptions to not arranged
set icon size of theViewOptions to 64
set position of item "Applications" of container window to {265, 80}
set position of item "READ ME.txt" of container window to {430, 80}
set position of item "READ ME.de_DE.txt" of container window to {595, 80}
+ set position of item "DCP-o-matic Disk Writer.pkg" of container window to {90, 255}
close
open
update without registering applications
Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
SetFile -a C "$dmg"
xattr -c "$dmg"
- codesign --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
- if [ "$?" != "0" ]; then
- echo "Failed to sign .dmg"
- exit 1
+
+ set -e
+ codesign --verify --verbose --options runtime --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
+
+ # We only notarize thin builds, as if we're building universal binaries we must be on an OS
+ # sufficiently old that it can't notarize anyway
+ if [ "$TYPE" == "thin" ]; then
+
+ id=$(xcrun altool --notarize-app -t osx -f "$dmg" --primary-bundle-id $bundle_id -u $APPLE_ID -p $APPLE_PASSWORD --output-format xml | grep -C1 RequestUUID | tail -n 1 | sed -e "s/<string>//g" | sed -e "s/<\/string>//g")
+ N=0
+ while [ 1 ]; do
+ echo "Checking up on $id"
+ status=$(xcrun altool --notarization-info $id -u $APPLE_ID -p $APPLE_PASSWORD --output-format xml)
+ summary=$(echo "$status" | grep -C1 "<key>Status</key>" | tail -n 1 | sed -e "s/ .//g")
+ echo "Got $summary"
+ if [ "$summary" == "<string>invalid</string>" ]; then
+ echo "Notarization failed."
+ echo $status
+ exit 1
+ fi
+ if [ "$summary" == "<string>success</string>" ]; then
+ break
+ fi
+ sleep 30
+ N=$((N+1))
+ if [ "$N" == "30" ]; then
+ echo "Timed out waiting for notarization"
+ exit 1
+ fi
+ done
+
+ xcrun stapler staple "$dmg"
fi
+ set +e
+
rm $tmp_dmg
rm -rf $vol_name
}
esac
# DCP-o-matic main
-setup "DCP-o-matic 2.app"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
-copy $ROOT bin/ffprobe "$approot/MacOS"
-cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
-rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
-relink "${rl[@]}"
-make_dmg "$appdir" "DCP-o-matic"
+##setup "DCP-o-matic 2.app"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
+##copy $ROOT bin/ffprobe "$approot/MacOS"
+##copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
+##cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
+##rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
+##relink_relative "${rl[@]}"
+##make_dmg "$appdir" "" "DCP-o-matic" com.dcpomatic
# DCP-o-matic KDM Creator
-setup "DCP-o-matic 2 KDM Creator.app"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
-cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
-rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
-relink "${rl[@]}"
-make_dmg "$appdir" "DCP-o-matic KDM Creator"
+##setup "DCP-o-matic 2 KDM Creator.app"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
+##copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
+##cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
+##rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
+##relink_relative "${rl[@]}"
+##make_dmg "$appdir" "" "DCP-o-matic KDM Creator" com.dcpomatic.kdm
# DCP-o-matic Encode Server
-setup "DCP-o-matic 2 Encode Server.app"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
-cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
-rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
-relink "${rl[@]}"
-make_dmg "$appdir" "DCP-o-matic Encode Server"
+##setup "DCP-o-matic 2 Encode Server.app"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
+##copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
+##cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
+##rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
+##relink_relative "${rl[@]}"
+##make_dmg "$appdir" "" "DCP-o-matic Encode Server" com.dcpomatic.server
# DCP-o-matic Batch Converter
-setup "DCP-o-matic 2 Batch converter.app"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
-cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
-rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
-relink "${rl[@]}"
-make_dmg "$appdir" "DCP-o-matic Batch Converter"
+##setup "DCP-o-matic 2 Batch converter.app"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
+##copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
+##cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
+##rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
+##relink_relative "${rl[@]}"
+##make_dmg "$appdir" "" "DCP-o-matic Batch Converter" com.dcpomatic.batch
# DCP-o-matic Player
-setup "DCP-o-matic 2 Player.app"
-copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
-cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
-rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
-relink "${rl[@]}"
-make_dmg "$appdir" "DCP-o-matic Player"
+##setup "DCP-o-matic 2 Player.app"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
+##copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
+##cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
+##rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
+##relink_relative "${rl[@]}"
+##make_dmg "$appdir" "" "DCP-o-matic Player" com.dcpomatic.player
+
+# DCP-o-matic Playlist Editor
+##setup "DCP-o-matic 2 Playlist Editor.app"
+##copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_playlist "$approot/MacOS"
+##copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
+##cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_playlist.Info.plist "$approot/Info.plist"
+##rl=("$approot/MacOS/dcpomatic2_playlist" "$approot/Frameworks/"*.dylib)
+##relink_relative "${rl[@]}"
+##make_dmg "$appdir" "" "DCP-o-matic Playlist Editor" com.dcpomatic.playlist
+
+# DCP-o-matic Disk Writer .app
+setup "DCP-o-matic 2 Disk Writer.app"
+copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk "$approot/MacOS"
+# XXX: this shouldn't really be necessary
+copy $ROOT src/openssl/apps/openssl "$approot/MacOS"
+cp $prefix/src/dcpomatic/build/platform/osx/dcpomatic2_disk.Info.plist "$approot/Info.plist"
+rl=("$approot/MacOS/dcpomatic2_disk" "$approot/Frameworks/"*.dylib)
+relink_relative "${rl[@]}"
+
+# DCP-o-matic Disk Writer daemon .pkg
+pkgbase=tmp-disk-writer
+rm -rf $pkgbase
+mkdir $pkgbase
+pkgroot=$pkgbase/root
+mkdir -p $pkgroot/Library/LaunchDaemons
+cat > $pkgroot/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>Label</key>
+ <string>com.dcpomatic.disk.writer</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>/Library/Application Support/com.dcpomatic/dcpomatic2_disk_writer</string>
+ </array>
+ <key>EnvironmentVariables</key>
+ <dict>
+ <key>DYLD_LIBRARY_PATH</key>
+ <string><![CDATA[/Library/Application Support/com.dcpomatic]]></string>
+ </dict>
+ <key>KeepAlive</key>
+ <true/>
+ <key>RunAtLoad</key>
+ <true/>
+ <key>Debug</key>
+ <true/>
+ <key>StandardOutPath</key>
+ <string>/Users/carl/damon.out.log</string>
+ <key>StandardErrorPath</key>
+ <string>/Users/carl/damon.err.log</string>
+</dict>
+</plist>
+EOF
+
+mkdir -p "$pkgroot/Library/Application Support/com.dcpomatic"
+target="$pkgroot/Library/Application Support/com.dcpomatic"
+copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_disk_writer "$target"
+copy_lib_root libcxml "$target"
+copy_lib_env libboost_system "$target"
+copy_lib_env libboost_filesystem "$target"
+copy_lib_env libboost_thread "$target"
+copy_lib_env libboost_date_time "$target"
+copy_lib_env libboost_locale "$target"
+copy_lib_env libboost_regex "$target"
+copy_lib_env libicui18n "$target"
+copy_lib_env libicudata "$target"
+copy_lib_env libicuio "$target"
+copy_lib_env libicule "$target"
+copy_lib_env libiculx "$target"
+copy_lib_env libicutest "$target"
+copy_lib_env libicutu "$target"
+copy_lib_env libicuuc "$target"
+
+rl=("$target/dcpomatic2_disk_writer" "$target/"*.dylib)
+relink_absolute "${rl[@]}"
+
+mkdir $pkgbase/scripts
+cat > $pkgbase/scripts/postinstall <<EOF
+#!/bin/sh
+/bin/launchctl load "/Library/LaunchDaemons/com.dcpomatic.disk.writer.plist"
+exit 0
+EOF
+chmod gou+x $pkgbase/scripts/postinstall
+
+find "$target" -iname "*.dylib" -print0 | while IFS= read -r -d '' f; do
+ sign "$f"
+done
+sign "$target/dcpomatic2_disk_writer"
+
+pkgbuild --root $pkgroot --identifier com.dcpomatic.disk.writer --scripts $pkgbase/scripts "DCP-o-matic Disk Writer.pkg"
+
+make_dmg "$appdir" "DCP-o-matic Disk Writer.pkg" "DCP-o-matic Disk Writer" com.dcpomatic.disk