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=`cat wscript | egrep ^VERSION | awk '{print $3}' | sed -e "s/'//g"`
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/servers.png "$dest"
125 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/tms.png "$dest"
126 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/keys.png "$dest"
127 cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/cover_sheet.png "$dest"
128 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$dest"
129 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
130 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
131 cp $ROOT/32/src/dcpomatic/graphics/splash.png "$dest"
133 # i18n: DCP-o-matic .mo files
134 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
135 mkdir -p "$dest/$lang/LC_MESSAGES"
136 cp $ROOT/32/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
137 cp $ROOT/32/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
138 cp $ROOT/32/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
141 # i18n: wxWidgets .mo files
142 for lang in de es fr it sv nl ru pl da cs; do
144 cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
148 # param $1 list of things that link to other things
150 to_relink=`echo $to_relink | sed -e "s/\+//g"`
153 for obj in "${linkers[@]}"; do
154 deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
158 # $dep will be a path within 64/; make a 32/ path too
159 dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
160 changes="$changes -change $dep @executable_path/../Frameworks/$base -change $dep32 @executable_path/../Frameworks/$base"
162 if test "x$changes" != "x"; then
163 install_name_tool $changes -id `basename "$obj"` "$obj"
168 # @param #1 .app directory
169 # @param #2 full name e.g. DCP-o-matic Batch Converter
173 tmp_dmg=dcpomatic_tmp.dmg
174 dmg="$full_name $version.dmg"
175 vol_name=DCP-o-matic-$version
177 codesign --deep --force --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$appdir"
178 if [ "$?" != "0" ]; then
179 echo "Failed to sign .app"
184 cp -a "$appdir" $vol_name
185 ln -s /Applications "$vol_name/Applications"
186 cat<<EOF > "$vol_name/READ ME.txt"
187 Welcome to DCP-o-matic! The first time you run the program there may be
188 a long (several-minute) delay while OS X checks the code for viruses and
189 other malware. Please be patient!
192 rm -f $tmp_dmg "$dmg"
193 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
194 attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
195 device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
199 tell application "Finder"
200 tell disk "$vol_name"
202 set current view of container window to icon view
203 set toolbar visible of container window to false
204 set statusbar visible of container window to false
205 set the bounds of container window to {400, 200, 940, 300}
206 set theViewOptions to the icon view options of container window
207 set arrangement of theViewOptions to not arranged
208 set icon size of theViewOptions to 64
209 set position of item "$appdir" of container window to {90, 80}
210 set position of item "Applications" of container window to {265, 80}
211 set position of item "READ ME.txt" of container window to {430, 80}
214 update without registering applications
220 chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
223 hdiutil eject $device
224 hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
225 sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
226 DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
227 Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
229 codesign --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
230 if [ "$?" != "0" ]; then
231 echo "Failed to sign .dmg"
241 approot="$appdir/Contents"
243 mkdir -p "$approot/MacOS"
244 mkdir -p "$approot/Frameworks"
245 mkdir -p "$approot/Resources"
247 to_relink="dcpomatic"
248 copy_libs "$approot/Frameworks"
249 copy_resources "$approot/Resources"
253 setup "DCP-o-matic 2.app"
254 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
255 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
256 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
257 universal_copy $ROOT bin/ffprobe "$approot/MacOS"
258 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
259 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
261 make_dmg "$appdir" "DCP-o-matic"
263 # DCP-o-matic KDM Creator
264 setup "DCP-o-matic 2 KDM Creator.app"
265 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
266 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
267 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
268 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
270 make_dmg "$appdir" "DCP-o-matic KDM Creator"
272 # DCP-o-matic Encode Server
273 setup "DCP-o-matic 2 Encode Server.app"
274 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
275 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
276 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
277 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
279 make_dmg "$appdir" "DCP-o-matic Encode Server"
281 # DCP-o-matic Batch Converter
282 setup "DCP-o-matic 2 Batch converter.app"
283 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
284 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
285 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
287 make_dmg "$appdir" "DCP-o-matic Batch Converter"
290 setup "DCP-o-matic 2 Player.app"
291 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
292 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
293 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
295 make_dmg "$appdir" "DCP-o-matic Player"