Player build stuff.
[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 ENV=/Users/carl/Environments/osx/10.6
15 ROOT=$1
16
17 # This is our work area for making up the .dmgs
18 mkdir -p build/platform/osx
19 cd build/platform/osx
20
21 function universal_copy {
22     for f in $1/32/$2; do
23         if [ -h $f ]; then
24             ln -s $(readlink $f) "$3/`basename $f`"
25         else
26             g=`echo $f | sed -e "s/\/32\//\/64\//g"`
27             mkdir -p "$3"
28             lipo -create $f $g -output "$3/`basename $f`"
29         fi
30     done
31 }
32
33 function universal_copy_lib {
34     for f in $1/32/lib/$2*.dylib; do
35         if [ -h $f ]; then
36             ln -s $(readlink $f) "$3/`basename $f`"
37         else
38             g=`echo $f | sed -e "s/\/32\//\/64\//g"`
39             mkdir -p "$3"
40             lipo -create $f $g -output "$3/`basename $f`"
41         fi
42     done
43     to_relink="$to_relink|$2"
44 }
45
46 # @param #1 directory to copy to
47 function copy_libs {
48     local dest="$1"
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 libzip "$dest"
93     universal_copy_lib $ENV libcurl "$dest"
94     universal_copy_lib $ENV libffi "$dest"
95     universal_copy_lib $ENV libpango "$dest"
96     universal_copy_lib $ENV libcairo "$dest"
97     universal_copy_lib $ENV libpixman "$dest"
98     universal_copy_lib $ENV libharfbuzz "$dest"
99     universal_copy_lib $ENV libsamplerate "$dest"
100     universal_copy_lib $ENV libicui18n "$dest"
101     universal_copy_lib $ENV libicudata "$dest"
102     universal_copy_lib $ENV libicuio "$dest"
103     universal_copy_lib $ENV libicule "$dest"
104     universal_copy_lib $ENV libiculx "$dest"
105     universal_copy_lib $ENV libicutest "$dest"
106     universal_copy_lib $ENV libicutu "$dest"
107     universal_copy_lib $ENV libicuuc "$dest"
108     universal_copy_lib $ENV libFLAC "$dest"
109     universal_copy_lib $ENV libvorbis "$dest"
110     universal_copy_lib $ENV libogg "$dest"
111 }
112
113 # @param #1 directory to copy to
114 function copy_resources {
115     local dest="$1"
116     cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic_small.png "$dest"
117     cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2.icns "$dest"
118     cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_kdm.icns "$dest"
119     cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_server.icns "$dest"
120     cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_player.icns "$dest"
121     cp $ROOT/32/src/dcpomatic/graphics/osx/dcpomatic2_batch.icns "$dest"
122     cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/colour_conversions.png "$dest"
123     cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/defaults.png "$dest"
124     cp $ROOT/32/src/dcpomatic/graphics/osx/preferences/kdm_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/fonts/LiberationSans-Regular.ttf "$dest"
130     cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
131     cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
132     cp $ROOT/32/src/dcpomatic/graphics/splash.png "$dest"
133
134     # i18n: DCP-o-matic .mo files
135     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; do
136         mkdir -p "$dest/$lang/LC_MESSAGES"
137         cp $ROOT/32/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
138         cp $ROOT/32/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
139         cp $ROOT/32/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
140     done
141
142     # i18n: wxWidgets .mo files
143     for lang in de es fr it sv nl ru pl da cs; do
144         mkdir "$dest/$lang"
145         cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
146     done
147 }
148
149 # param $1 list of things that link to other things
150 function relink {
151     to_relink=`echo $to_relink | sed -e "s/\+//g"`
152     local linkers=("$@")
153
154     for obj in "${linkers[@]}"; do
155         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
156         changes=""
157         for dep in $deps; do
158             base=`basename $dep`
159             # $dep will be a path within 64/; make a 32/ path too
160             dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
161             changes="$changes -change $dep @executable_path/../lib/$base -change $dep32 @executable_path/../lib/$base"
162         done
163         if test "x$changes" != "x"; then
164             install_name_tool $changes "$obj"
165         fi
166     done
167 }
168
169 # @param #1 .app directory
170 # @param #2 full name e.g. DCP-o-matic Batch Converter
171 function make_dmg {
172     local appdir="$1"
173     local full_name="$2"
174     tmp_dmg=dcpomatic_tmp.dmg
175     dmg="$full_name $version.dmg"
176     vol_name=DCP-o-matic-$version
177
178     mkdir -p $vol_name
179     cp -a "$appdir" $vol_name
180     ln -s /Applications "$vol_name/Applications"
181
182     rm -f $tmp_dmg "$dmg"
183     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
184     attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
185     device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
186     sleep 5
187
188     echo '
189   tell application "Finder"
190     tell disk "'$vol_name'"
191            open
192            set current view of container window to icon view
193            set toolbar visible of container window to false
194            set statusbar visible of container window to false
195            set the bounds of container window to {400, 200, 650, 370}
196            set theViewOptions to the icon view options of container window
197            set arrangement of theViewOptions to not arranged
198            set icon size of theViewOptions to 64
199            set position of item "'$appdir'" of container window to {90, 80}
200            set position of item "Applications" of container window to {220, 80}
201            close
202            open
203            update without registering applications
204            delay 5
205      end tell
206    end tell
207 ' | osascript
208
209     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
210     sync
211
212     hdiutil eject $device
213     hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
214     sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
215     DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
216     Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
217     SetFile -a C "$dmg"
218     rm $tmp_dmg
219     rm -rf $vol_name
220 }
221
222 # @param #1 appdir
223 function setup {
224     appdir="$1"
225     approot="$appdir/Contents"
226     rm -rf "$appdir"
227     mkdir -p "$approot/MacOS"
228     mkdir -p "$approot/lib"
229     mkdir -p "$approot/Resources"
230
231     to_relink="dcpomatic"
232     copy_libs "$approot/lib"
233     copy_resources "$approot/Resources"
234 }
235
236 # DCP-o-matic main
237 setup "DCP-o-matic 2.app"
238 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
239 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
240 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
241 universal_copy $ROOT bin/ffprobe "$approot/MacOS"
242 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
243 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/ffprobe" "$approot/lib/"*.dylib)
244 relink "${rl[@]}"
245 make_dmg "$appdir" "DCP-o-matic"
246
247 # DCP-o-matic KDM Creator
248 setup "DCP-o-matic 2 KDM Creator.app"
249 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
250 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
251 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/lib/"*.dylib)
252 relink "${rl[@]}"
253 make_dmg "$appdir" "DCP-o-matic KDM Creator"
254
255 # DCP-o-matic Encode Server
256 setup "DCP-o-matic 2 Encode Server.app"
257 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
258 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
259 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
260 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/lib/"*.dylib)
261 relink "${rl[@]}"
262 make_dmg "$appdir" "DCP-o-matic Encode Server"
263
264 # DCP-o-matic Batch Converter
265 setup "DCP-o-matic 2 Batch converter.app"
266 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
267 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
268 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/lib/"*.dylib)
269 relink "${rl[@]}"
270 make_dmg "$appdir" "DCP-o-matic Batch Converter"
271
272 # DCP-o-matic Player
273 setup "DCP-o-matic 2 Player.app"
274 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
275 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
276 rl=("$approot/MacOS/dcpomatic2_player" "$approot/lib/"*.dylib)
277 relink "${rl[@]}"
278 make_dmg "$appdir" "DCP-o-matic Player"