Don't try to copy non-existant wxstd.mo files.
[dcpomatic.git] / platform / osx / make_dmg.sh
1 #!/bin/bash
2 #
3 # Syntax: make_dmg.sh <builddir>
4 #
5 # e.g. make_dmg.sh /Users/carl/cdist
6
7 # Don't set -e here as egrep (used a few times) returns 1 if no matches
8 # were found.
9
10 version=`cat wscript | egrep ^VERSION | awk '{print $3}' | sed -e "s/'//g"`
11
12 # DMG size in megabytes
13 DMG_SIZE=256
14 WORK=build/platform/osx
15 ENV=/Users/carl/Environments/osx/10.6
16 ROOT=$1
17
18 # Main application
19 appdir="DCP-o-matic 2.app"
20 approot="$appdir/Contents"
21 libs="$approot/lib"
22 macos="$approot/MacOS"
23 resources="$approot/Resources"
24 rm -rf "$WORK/$appdir"
25 mkdir -p "$WORK/$macos"
26 mkdir -p "$WORK/$libs"
27 mkdir -p "$WORK/$resources"
28
29 # KDM creator
30 appdir_kdm="DCP-o-matic 2 KDM Creator.app"
31 approot_kdm="$appdir_kdm/Contents"
32 libs_kdm="$approot_kdm/lib"
33 macos_kdm="$approot_kdm/MacOS"
34 resources_kdm="$approot_kdm/Resources"
35 rm -rf "$WORK/$appdir_kdm"
36 mkdir -p "$WORK/$macos_kdm"
37
38 # Server
39 appdir_server="DCP-o-matic 2 Server.app"
40 approot_server="$appdir_server/Contents"
41 libs_server="$approot_server/lib"
42 macos_server="$approot_server/MacOS"
43 resources_server="$approot_server/Resources"
44 rm -rf "$WORK/$appdir_server"
45 mkdir -p "$WORK/$macos_server"
46
47 # Batch converter
48 appdir_batch="DCP-o-matic 2 Batch Converter.app"
49 approot_batch="$appdir_batch/Contents"
50 libs_batch="$approot_batch/lib"
51 macos_batch="$approot_batch/MacOS"
52 resources_batch="$approot_batch/Resources"
53 rm -rf "$WORK/$appdir_batch"
54 mkdir -p "$WORK/$macos_batch"
55
56 relink="dcpomatic"
57
58 function universal_copy {
59     for f in $1/32/$2; do
60         if [ -h $f ]; then
61             ln -s $(readlink $f) "$3/`basename $f`"
62         else
63             g=`echo $f | sed -e "s/\/32\//\/64\//g"`
64             mkdir -p "$3"
65             lipo -create $f $g -output "$3/`basename $f`"
66         fi
67     done
68 }
69
70 function universal_copy_lib {
71     for f in $1/32/lib/$2*.dylib; do
72         if [ -h $f ]; then
73             ln -s $(readlink $f) "$3/`basename $f`"
74         else
75             g=`echo $f | sed -e "s/\/32\//\/64\//g"`
76             mkdir -p "$3"
77             lipo -create $f $g -output "$3/`basename $f`"
78         fi
79     done
80     relink="$relink|$2"
81 }
82
83 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$WORK/$macos"
84 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$WORK/$macos"
85 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$WORK/$macos"
86 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$WORK/$macos"
87 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$WORK/$macos_kdm"
88 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$WORK/$macos_server"
89 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$WORK/$macos_batch"
90 universal_copy $ROOT src/dcpomatic/build/src/lib/libdcpomatic2.dylib "$WORK/$libs"
91 universal_copy $ROOT src/dcpomatic/build/src/wx/libdcpomatic2-wx.dylib "$WORK/$libs"
92 universal_copy_lib $ROOT libcxml "$WORK/$libs"
93 universal_copy_lib $ROOT libdcp-1.0 "$WORK/$libs"
94 universal_copy_lib $ROOT libasdcp-libdcp-1.0 "$WORK/$libs"
95 universal_copy_lib $ROOT libkumu-libdcp-1.0 "$WORK/$libs"
96 universal_copy_lib $ROOT libsub "$WORK/$libs"
97 universal_copy_lib $ROOT libasdcp-libsub-1.0 "$WORK/$libs"
98 universal_copy_lib $ROOT libkumu-libsub-1.0 "$WORK/$libs"
99 universal_copy_lib $ROOT libopenjp2 "$WORK/$libs"
100 universal_copy_lib $ROOT libavdevice "$WORK/$libs"
101 universal_copy_lib $ROOT libavformat "$WORK/$libs"
102 universal_copy_lib $ROOT libavfilter "$WORK/$libs"
103 universal_copy_lib $ROOT libavutil "$WORK/$libs"
104 universal_copy_lib $ROOT libavcodec "$WORK/$libs"
105 universal_copy_lib $ROOT libswscale "$WORK/$libs"
106 universal_copy_lib $ROOT libpostproc "$WORK/$libs"
107 universal_copy_lib $ROOT libswresample "$WORK/$libs"
108 universal_copy $ROOT bin/ffprobe "$WORK/$macos"
109 universal_copy_lib $ENV libboost_system "$WORK/$libs"
110 universal_copy_lib $ENV libboost_filesystem "$WORK/$libs"
111 universal_copy_lib $ENV libboost_thread "$WORK/$libs"
112 universal_copy_lib $ENV libboost_date_time "$WORK/$libs"
113 universal_copy_lib $ENV libboost_locale "$WORK/$libs"
114 universal_copy_lib $ENV libboost_regex "$WORK/$libs"
115 universal_copy_lib $ENV libxml++ "$WORK/$libs"
116 universal_copy_lib $ENV libxslt "$WORK/$libs"
117 universal_copy_lib $ENV libxml2 "$WORK/$libs"
118 universal_copy_lib $ENV libglibmm-2.4 "$WORK/$libs"
119 universal_copy_lib $ENV libgobject "$WORK/$libs"
120 universal_copy_lib $ENV libgthread "$WORK/$libs"
121 universal_copy_lib $ENV libgmodule "$WORK/$libs"
122 universal_copy_lib $ENV libsigc "$WORK/$libs"
123 universal_copy_lib $ENV libglib-2 "$WORK/$libs"
124 universal_copy_lib $ENV libintl "$WORK/$libs"
125 universal_copy_lib $ENV libsndfile "$WORK/$libs"
126 universal_copy_lib $ENV libMagick++ "$WORK/$libs"
127 universal_copy_lib $ENV libMagickCore "$WORK/$libs"
128 universal_copy_lib $ENV libMagickWand "$WORK/$libs"
129 universal_copy_lib $ENV libssh "$WORK/$libs"
130 universal_copy_lib $ENV libwx "$WORK/$libs"
131 universal_copy_lib $ENV libfontconfig "$WORK/$libs"
132 universal_copy_lib $ENV libfreetype "$WORK/$libs"
133 universal_copy_lib $ENV libexpat "$WORK/$libs"
134 universal_copy_lib $ENV libltdl "$WORK/$libs"
135 universal_copy_lib $ENV libxmlsec1 "$WORK/$libs"
136 universal_copy_lib $ENV libzip "$WORK/$libs"
137 universal_copy_lib $ENV libquickmail "$WORK/$libs"
138 universal_copy_lib $ENV libcurl "$WORK/$libs"
139 universal_copy_lib $ENV libffi "$WORK/$libs"
140 universal_copy_lib $ENV libiconv "$WORK/$libs"
141 universal_copy_lib $ENV libpango "$WORK/$libs"
142 universal_copy_lib $ENV libcairo "$WORK/$libs"
143 universal_copy_lib $ENV libpixman "$WORK/$libs"
144 universal_copy_lib $ENV libharfbuzz "$WORK/$libs"
145 universal_copy_lib $ENV libsamplerate "$WORK/$libs"
146 universal_copy_lib $ENV libicui18n "$WORK/$libs"
147 universal_copy_lib $ENV libicudata "$WORK/$libs"
148 universal_copy_lib $ENV libicuio "$WORK/$libs"
149 universal_copy_lib $ENV libicule "$WORK/$libs"
150 universal_copy_lib $ENV libiculx "$WORK/$libs"
151 universal_copy_lib $ENV libicutest "$WORK/$libs"
152 universal_copy_lib $ENV libicutu "$WORK/$libs"
153 universal_copy_lib $ENV libicuuc "$WORK/$libs"
154 universal_copy_lib $ENV libFLAC "$WORK/$libs"
155 universal_copy_lib $ENV libvorbis "$WORK/$libs"
156 universal_copy_lib $ENV libogg "$WORK/$libs"
157
158 relink=`echo $relink | sed -e "s/\+//g"`
159
160 for obj in \
161     "$WORK/$macos/dcpomatic2" \
162     "$WORK/$macos/dcpomatic2_cli" \
163     "$WORK/$macos/dcpomatic2_server_cli" \
164     "$WORK/$macos_kdm/dcpomatic2_kdm" \
165     "$WORK/$macos_server/dcpomatic2_server" \
166     "$WORK/$macos_batch/dcpomatic2_batch" \
167     "$WORK/$macos/ffprobe" \
168     "$WORK/$libs/"*.dylib; do
169   deps=`otool -L "$obj" | awk '{print $1}' | egrep "($relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
170   changes=""
171   for dep in $deps; do
172       echo "Relinking $dep into $obj"
173       base=`basename $dep`
174       # $dep will be a path within 64/; make a 32/ path too
175       dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
176       changes="$changes -change $dep @executable_path/../lib/$base -change $dep32 @executable_path/../lib/$base"
177   done
178   if test "x$changes" != "x"; then
179     install_name_tool $changes "$obj"
180   fi
181 done
182
183 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$WORK/$approot/Info.plist"
184 cp $ROOT/32/src/dcpomatic/graphics/dcpomatic2.icns "$WORK/$resources/dcpomatic2.icns"
185 cp $ROOT/32/src/dcpomatic/graphics/dcpomatic2_kdm.icns "$WORK/$resources/dcpomatic2_kdm.icns"
186 cp $ROOT/32/src/dcpomatic/graphics/dcpomatic2_server.icns "$WORK/$resources/dcpomatic2_server.icns"
187 cp $ROOT/32/src/dcpomatic/graphics/dcpomatic2_batch.icns "$WORK/$resources/dcpomatic2_batch.icns"
188 cp $ROOT/32/src/dcpomatic/graphics/colour_conversions.png "$WORK/$resources"
189 cp $ROOT/32/src/dcpomatic/graphics/defaults.png "$WORK/$resources"
190 cp $ROOT/32/src/dcpomatic/graphics/kdm_email.png "$WORK/$resources"
191 cp $ROOT/32/src/dcpomatic/graphics/servers.png "$WORK/$resources"
192 cp $ROOT/32/src/dcpomatic/graphics/tms.png "$WORK/$resources"
193 cp $ROOT/32/src/dcpomatic/graphics/keys.png "$WORK/$resources"
194 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Regular.ttf "$WORK/$resources"
195 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$WORK/$resources"
196 cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$WORK/$resources"
197 cp $ROOT/32/src/dcpomatic/graphics/splash.png "$WORK/$resources"
198 cp $ROOT/32/src/dcpomatic/graphics/dcpomatic2_server_small.png "$WORK/$resources"
199
200 # i18n: DCP-o-matic .mo files
201 for lang in de_DE es_ES fr_FR it_IT sv_SE nl_NL ru_RU pl_PL da_DK pt_PT sk_SK cs_CZ; do
202   mkdir -p "$WORK/$resources/$lang/LC_MESSAGES"
203   cp $ROOT/32/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
204   cp $ROOT/32/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
205   cp $ROOT/32/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
206 done
207
208 # i18n: wxWidgets .mo files
209 for lang in de es fr it sv nl ru pl da cs; do
210   mkdir "$WORK/$resources/$lang"
211   cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$WORK/$resources/$lang"
212 done
213
214 tmp_dmg=$WORK/dcpomatic_tmp.dmg
215 dmg="$WORK/DCP-o-matic $version.dmg"
216 vol_name=DCP-o-matic-$version
217
218 mkdir -p $WORK/$vol_name
219 cp -a "$WORK/$appdir" $WORK/$vol_name
220 ln -s /Applications "$WORK/$vol_name/Applications"
221
222 # KDM creator
223 appdir_kdm="DCP-o-matic 2 KDM Creator.app"
224 approot_kdm="$appdir_kdm/Contents"
225 libs_kdm="$approot_kdm/lib"
226 macos_kdm="$approot_kdm/MacOS"
227 resources_kdm="$approot_kdm/Resources"
228 ln -s "../../DCP-o-matic 2.app/Contents/lib" "$WORK/$libs_kdm"
229 ln -s "../../DCP-o-matic 2.app/Contents/Resources" "$WORK/$resources_kdm"
230 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$WORK/$approot_kdm/Info.plist"
231 cp -a "$WORK/$appdir_kdm" $WORK/$vol_name
232
233 # Server
234 appdir_server="DCP-o-matic 2 Server.app"
235 approot_server="$appdir_server/Contents"
236 libs_server="$approot_server/lib"
237 macos_server="$approot_server/MacOS"
238 resources_server="$approot_server/Resources"
239 ln -s "../../DCP-o-matic 2.app/Contents/lib" "$WORK/$libs_server"
240 ln -s "../../DCP-o-matic 2.app/Contents/Resources" "$WORK/$resources_server"
241 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$WORK/$approot_server/Info.plist"
242 cp -a "$WORK/$appdir_server" $WORK/$vol_name
243
244 # Batch converter
245 appdir_batch="DCP-o-matic 2 Batch Converter.app"
246 approot_batch="$appdir_batch/Contents"
247 libs_batch="$approot_batch/lib"
248 macos_batch="$approot_batch/MacOS"
249 resources_batch="$approot_batch/Resources"
250 ln -s "../../DCP-o-matic 2.app/Contents/lib" "$WORK/$libs_batch"
251 ln -s "../../DCP-o-matic 2.app/Contents/Resources" "$WORK/$resources_batch"
252 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$WORK/$approot_batch/Info.plist"
253 cp -a "$WORK/$appdir_batch" $WORK/$vol_name
254
255 rm -f $tmp_dmg "$dmg"
256 hdiutil create -srcfolder $WORK/$vol_name -volname $vol_name -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size $DMG_SIZE $tmp_dmg
257 attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
258 device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
259 sleep 5
260
261 echo '
262   tell application "Finder"
263     tell disk "'$vol_name'"
264            open
265            set current view of container window to icon view
266            set toolbar visible of container window to false
267            set statusbar visible of container window to false
268            set the bounds of container window to {400, 200, 930, 610}
269            set theViewOptions to the icon view options of container window
270            set arrangement of theViewOptions to not arranged
271            set icon size of theViewOptions to 64
272            set position of item "DCP-o-matic 2.app" of container window to {90, 80}
273            set position of item "DCP-o-matic 2 KDM Creator.app" of container window to {270, 80}
274            set position of item "DCP-o-matic 2 Server.app" of container window to {90, 200}
275            set position of item "DCP-o-matic 2 Batch Converter.app" of container window to {270, 200}
276            set position of item "Applications" of container window to {450, 80}
277            close
278            open
279            update without registering applications
280            delay 5
281      end tell
282    end tell
283 ' | osascript
284
285 chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
286 sync
287
288 hdiutil eject $device
289 hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
290 sips -i "$WORK/$resources/dcpomatic2.icns"
291 DeRez -only icns "$WORK/$resources/dcpomatic2.icns" > "$WORK/$resources/DCP-o-matic.rsrc"
292 Rez -append "$WORK/$resources/DCP-o-matic.rsrc" -o "$dmg"
293 SetFile -a C "$dmg"