3 # Syntax: make_dmg.sh <builddir>
5 # e.g. make_dmg.sh /Users/carl/cdist
7 # Don't set -e here as egrep (used a few times) returns 1 if no matches
10 version=`git describe --tags --abbrev=0 | sed -e "s/v//"`
12 # DMG size in megabytes
14 ENV=/Users/carl/Environments/dcpomatic
17 # This is our work area for making up the .dmgs
18 mkdir -p build/platform/osx
21 function universal_copy {
24 ln -s $(readlink $f) "$3/`basename $f`"
26 g=`echo $f | sed -e "s/\/32\//\/64\//g"`
28 lipo -create $f $g -output "$3/`basename $f`"
33 function universal_copy_lib {
34 for f in $1/32/lib/$2*.dylib; do
36 ln -s $(readlink $f) "$3/`basename $f`"
38 g=`echo $f | sed -e "s/\/32\//\/64\//g"`
40 lipo -create $f $g -output "$3/`basename $f`"
43 to_relink="$to_relink|$2"
46 # @param #1 directory to copy to
49 universal_copy_lib $ROOT libcxml "$dest"
50 universal_copy_lib $ROOT libdcp-1.0 "$dest"
51 universal_copy_lib $ROOT libasdcp-cth "$dest"
52 universal_copy_lib $ROOT libkumu-cth "$dest"
53 universal_copy_lib $ROOT libsub "$dest"
54 universal_copy_lib $ROOT libopenjp2 "$dest"
55 universal_copy_lib $ROOT libavdevice "$dest"
56 universal_copy_lib $ROOT libavformat "$dest"
57 universal_copy_lib $ROOT libavfilter "$dest"
58 universal_copy_lib $ROOT libavutil "$dest"
59 universal_copy_lib $ROOT libavcodec "$dest"
60 universal_copy_lib $ROOT libswscale "$dest"
61 universal_copy_lib $ROOT libpostproc "$dest"
62 universal_copy_lib $ROOT libswresample "$dest"
63 universal_copy $ROOT src/dcpomatic/build/src/lib/libdcpomatic2.dylib "$dest"
64 universal_copy $ROOT src/dcpomatic/build/src/wx/libdcpomatic2-wx.dylib "$dest"
65 universal_copy_lib $ENV libboost_system "$dest"
66 universal_copy_lib $ENV libboost_filesystem "$dest"
67 universal_copy_lib $ENV libboost_thread "$dest"
68 universal_copy_lib $ENV libboost_date_time "$dest"
69 universal_copy_lib $ENV libboost_locale "$dest"
70 universal_copy_lib $ENV libboost_regex "$dest"
71 universal_copy_lib $ENV libxml++ "$dest"
72 universal_copy_lib $ENV libxslt "$dest"
73 universal_copy_lib $ENV libxml2 "$dest"
74 universal_copy_lib $ENV libglibmm-2.4 "$dest"
75 universal_copy_lib $ENV libgobject "$dest"
76 universal_copy_lib $ENV libgthread "$dest"
77 universal_copy_lib $ENV libgmodule "$dest"
78 universal_copy_lib $ENV libsigc "$dest"
79 universal_copy_lib $ENV libglib-2 "$dest"
80 universal_copy_lib $ENV libintl "$dest"
81 universal_copy_lib $ENV libsndfile "$dest"
82 universal_copy_lib $ENV libMagick++ "$dest"
83 universal_copy_lib $ENV libMagickCore "$dest"
84 universal_copy_lib $ENV libMagickWand "$dest"
85 universal_copy_lib $ENV libssh "$dest"
86 universal_copy_lib $ENV libwx "$dest"
87 universal_copy_lib $ENV libfontconfig "$dest"
88 universal_copy_lib $ENV libfreetype "$dest"
89 universal_copy_lib $ENV libexpat "$dest"
90 universal_copy_lib $ENV libltdl "$dest"
91 universal_copy_lib $ENV libxmlsec1 "$dest"
92 universal_copy_lib $ENV libcurl "$dest"
93 universal_copy_lib $ENV libffi "$dest"
94 universal_copy_lib $ENV libpango "$dest"
95 universal_copy_lib $ENV libcairo "$dest"
96 universal_copy_lib $ENV libpixman "$dest"
97 universal_copy_lib $ENV libharfbuzz "$dest"
98 universal_copy_lib $ENV libsamplerate "$dest"
99 universal_copy_lib $ENV libicui18n "$dest"
100 universal_copy_lib $ENV libicudata "$dest"
101 universal_copy_lib $ENV libicuio "$dest"
102 universal_copy_lib $ENV libicule "$dest"
103 universal_copy_lib $ENV libiculx "$dest"
104 universal_copy_lib $ENV libicutest "$dest"
105 universal_copy_lib $ENV libicutu "$dest"
106 universal_copy_lib $ENV libicuuc "$dest"
107 universal_copy_lib $ENV libFLAC "$dest"
108 universal_copy_lib $ENV libvorbis "$dest"
109 universal_copy_lib $ENV libogg "$dest"
112 # @param #1 directory to copy to
113 function copy_resources {
115 cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic_small.png "$dest"
116 cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
117 cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
118 cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
119 cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
120 cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
121 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/colour_conversions.png "$dest"
122 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/defaults.png "$dest"
123 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/kdm_email.png "$dest"
124 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/email.png "$dest"
125 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/servers.png "$dest"
126 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/tms.png "$dest"
127 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/keys.png "$dest"
128 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/cover_sheet.png "$dest"
129 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/notifications.png "$dest"
130 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/accounts.png "$dest"
131 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/locations.png "$dest"
132 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
133 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
134 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
135 cp $ROOT/32/src/dcpomatic/graphics/splash.png "$dest"
136 cp $ROOT/32/src/dcpomatic/graphics/zoom.png "$dest"
137 cp $ROOT/32/src/dcpomatic/graphics/zoom_all.png "$dest"
138 cp $ROOT/32/src/dcpomatic/graphics/select.png "$dest"
139 cp $ROOT/32/src/dcpomatic/graphics/snap.png "$dest"
140 cp $ROOT/32/src/dcpomatic/graphics/sequence.png "$dest"
142 # i18n: DCP-o-matic .mo files
143 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 ar_LB fi_FI el_GR; do
144 mkdir -p "$dest/$lang/LC_MESSAGES"
145 cp $ROOT/32/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
146 cp $ROOT/32/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
147 cp $ROOT/32/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
150 # i18n: wxWidgets .mo files
151 for lang in de es fr it sv nl ru pl da cs; do
153 cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
157 # param $1 list of things that link to other things
159 to_relink=`echo $to_relink | sed -e "s/\+//g"`
162 for obj in "${linkers[@]}"; do
163 deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
167 # $dep will be a path within 64/; make a 32/ path too
168 dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
169 changes="$changes -change $dep @executable_path/../Frameworks/$base -change $dep32 @executable_path/../Frameworks/$base"
171 if test "x$changes" != "x"; then
172 install_name_tool $changes -id `basename "$obj"` "$obj"
177 # @param #1 .app directory
178 # @param #2 full name e.g. DCP-o-matic Batch Converter
182 tmp_dmg=dcpomatic_tmp.dmg
183 dmg="$full_name $version.dmg"
184 vol_name=DCP-o-matic-$version
186 codesign --deep --force --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$appdir"
187 if [ "$?" != "0" ]; then
188 echo "Failed to sign .app"
193 cp -a "$appdir" $vol_name
194 ln -s /Applications "$vol_name/Applications"
195 cat<<EOF > "$vol_name/READ ME.txt"
196 Welcome to DCP-o-matic! The first time you run the program there may be
197 a long (several-minute) delay while OS X checks the code for viruses and
198 other malware. Please be patient!
200 cat<<EOF > "$vol_name/READ ME.de_DE.txt"
201 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
202 Verifikationsvorgang auftreten. Dies ist von der OS X Sicherheitsumgebung
203 'Gatekeeper' verursacht. Dieser je nach Rechner teils minutenlange
204 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
205 es ist kein Programmfehler. Warten sie die Verifikation für jede der
206 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
210 rm -f $tmp_dmg "$dmg"
211 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
212 attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
213 device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
217 tell application "Finder"
218 tell disk "'$vol_name'"
220 set current view of container window to icon view
221 set toolbar visible of container window to false
222 set statusbar visible of container window to false
223 set the bounds of container window to {400, 200, 940, 300}
224 set theViewOptions to the icon view options of container window
225 set arrangement of theViewOptions to not arranged
226 set icon size of theViewOptions to 64
227 set position of item "'$appdir'" of container window to {90, 80}
228 set position of item "Applications" of container window to {265, 80}
229 set position of item "READ ME.txt" of container window to {430, 80}
230 set position of item "READ ME.de_DE.txt" of container window to {595, 80}
233 update without registering applications
239 chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
242 hdiutil eject $device
243 hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
244 sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
245 DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
246 Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
248 codesign --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
249 if [ "$?" != "0" ]; then
250 echo "Failed to sign .dmg"
260 approot="$appdir/Contents"
262 mkdir -p "$approot/MacOS"
263 mkdir -p "$approot/Frameworks"
264 mkdir -p "$approot/Resources"
266 to_relink="dcpomatic"
267 copy_libs "$approot/Frameworks"
268 copy_resources "$approot/Resources"
272 setup "DCP-o-matic 2.app"
273 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
274 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
275 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
276 universal_copy $ROOT bin/ffprobe "$approot/MacOS"
277 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
278 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
280 make_dmg "$appdir" "DCP-o-matic"
282 # DCP-o-matic KDM Creator
283 setup "DCP-o-matic 2 KDM Creator.app"
284 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
285 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
286 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
287 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
289 make_dmg "$appdir" "DCP-o-matic KDM Creator"
291 # DCP-o-matic Encode Server
292 setup "DCP-o-matic 2 Encode Server.app"
293 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
294 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
295 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
296 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
298 make_dmg "$appdir" "DCP-o-matic Encode Server"
300 # DCP-o-matic Batch Converter
301 setup "DCP-o-matic 2 Batch converter.app"
302 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
303 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
304 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
306 make_dmg "$appdir" "DCP-o-matic Batch Converter"
309 setup "DCP-o-matic 2 Player.app"
310 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
311 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
312 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
314 make_dmg "$appdir" "DCP-o-matic Player"