Add locations page for some player preferences.
[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=`git describe --tags --abbrev=0 | sed -e "s/v//"`
11
12 # DMG size in megabytes
13 DMG_SIZE=256
14 ENV=/Users/carl/Environments/dcpomatic
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 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"
110 }
111
112 # @param #1 directory to copy to
113 function copy_resources {
114     local dest="$1"
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"
141
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"
148     done
149
150     # i18n: wxWidgets .mo files
151     for lang in de es fr it sv nl ru pl da cs; do
152         mkdir "$dest/$lang"
153         cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
154     done
155 }
156
157 # param $1 list of things that link to other things
158 function relink {
159     to_relink=`echo $to_relink | sed -e "s/\+//g"`
160     local linkers=("$@")
161
162     for obj in "${linkers[@]}"; do
163         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
164         changes=""
165         for dep in $deps; do
166             base=`basename $dep`
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"
170         done
171         if test "x$changes" != "x"; then
172             install_name_tool $changes -id `basename "$obj"` "$obj"
173         fi
174     done
175 }
176
177 # @param #1 .app directory
178 # @param #2 full name e.g. DCP-o-matic Batch Converter
179 function make_dmg {
180     local appdir="$1"
181     local full_name="$2"
182     tmp_dmg=dcpomatic_tmp.dmg
183     dmg="$full_name $version.dmg"
184     vol_name=DCP-o-matic-$version
185
186     codesign --deep --force --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$appdir"
187     if [ "$?" != "0" ]; then
188         echo "Failed to sign .app"
189         exit 1
190     fi
191
192     mkdir -p $vol_name
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!
199 EOF
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
207 mehr auftreten.
208 EOF
209
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}'`
214     sleep 5
215
216     echo '
217   tell application "Finder"
218     tell disk "'$vol_name'"
219            open
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}
231            close
232            open
233            update without registering applications
234            delay 5
235      end tell
236    end tell
237 ' | osascript
238
239     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
240     sync
241
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"
247     SetFile -a C "$dmg"
248     codesign --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
249     if [ "$?" != "0" ]; then
250         echo "Failed to sign .dmg"
251         exit 1
252     fi
253     rm $tmp_dmg
254     rm -rf $vol_name
255 }
256
257 # @param #1 appdir
258 function setup {
259     appdir="$1"
260     approot="$appdir/Contents"
261     rm -rf "$appdir"
262     mkdir -p "$approot/MacOS"
263     mkdir -p "$approot/Frameworks"
264     mkdir -p "$approot/Resources"
265
266     to_relink="dcpomatic"
267     copy_libs "$approot/Frameworks"
268     copy_resources "$approot/Resources"
269 }
270
271 # DCP-o-matic main
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)
279 relink "${rl[@]}"
280 make_dmg "$appdir" "DCP-o-matic"
281
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)
288 relink "${rl[@]}"
289 make_dmg "$appdir" "DCP-o-matic KDM Creator"
290
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)
297 relink "${rl[@]}"
298 make_dmg "$appdir" "DCP-o-matic Encode Server"
299
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)
305 relink "${rl[@]}"
306 make_dmg "$appdir" "DCP-o-matic Batch Converter"
307
308 # DCP-o-matic Player
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)
313 relink "${rl[@]}"
314 make_dmg "$appdir" "DCP-o-matic Player"