Replace checkboxes with tools.
[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/fonts/LiberationSans-Regular.ttf "$dest"
131     cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Italic.ttf "$dest"
132     cp $ROOT/32/src/dcpomatic/fonts/LiberationSans-Bold.ttf "$dest"
133     cp $ROOT/32/src/dcpomatic/graphics/splash.png "$dest"
134     cp $ROOT/32/src/dcpomatic/graphics/zoom.png "$dest"
135     cp $ROOT/32/src/dcpomatic/graphics/zoom_all.png "$dest"
136     cp $ROOT/32/src/dcpomatic/graphics/select.png "$dest"
137     cp $ROOT/32/src/dcpomatic/graphics/snap.png "$dest"
138     cp $ROOT/32/src/dcpomatic/graphics/sequence.png "$dest"
139
140     # i18n: DCP-o-matic .mo files
141     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
142         mkdir -p "$dest/$lang/LC_MESSAGES"
143         cp $ROOT/32/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
144         cp $ROOT/32/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
145         cp $ROOT/32/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$dest/$lang/LC_MESSAGES"
146     done
147
148     # i18n: wxWidgets .mo files
149     for lang in de es fr it sv nl ru pl da cs; do
150         mkdir "$dest/$lang"
151         cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$dest/$lang"
152     done
153 }
154
155 # param $1 list of things that link to other things
156 function relink {
157     to_relink=`echo $to_relink | sed -e "s/\+//g"`
158     local linkers=("$@")
159
160     for obj in "${linkers[@]}"; do
161         deps=`otool -L "$obj" | awk '{print $1}' | egrep "($to_relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
162         changes=""
163         for dep in $deps; do
164             base=`basename $dep`
165             # $dep will be a path within 64/; make a 32/ path too
166             dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
167             changes="$changes -change $dep @executable_path/../Frameworks/$base -change $dep32 @executable_path/../Frameworks/$base"
168         done
169         if test "x$changes" != "x"; then
170             install_name_tool $changes -id `basename "$obj"` "$obj"
171         fi
172     done
173 }
174
175 # @param #1 .app directory
176 # @param #2 full name e.g. DCP-o-matic Batch Converter
177 function make_dmg {
178     local appdir="$1"
179     local full_name="$2"
180     tmp_dmg=dcpomatic_tmp.dmg
181     dmg="$full_name $version.dmg"
182     vol_name=DCP-o-matic-$version
183
184     codesign --deep --force --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$appdir"
185     if [ "$?" != "0" ]; then
186         echo "Failed to sign .app"
187         exit 1
188     fi
189
190     mkdir -p $vol_name
191     cp -a "$appdir" $vol_name
192     ln -s /Applications "$vol_name/Applications"
193     cat<<EOF > "$vol_name/READ ME.txt"
194 Welcome to DCP-o-matic!  The first time you run the program there may be
195 a long (several-minute) delay while OS X checks the code for viruses and
196 other malware.  Please be patient!
197 EOF
198     cat<<EOF > "$vol_name/READ ME.de_DE.txt"
199 Beim erstmaligen Start der DCP-o-matic Anwendungen kann ein längerer
200 Verifikationsvorgang auftreten.  Dies ist von der OS X Sicherheitsumgebung
201 'Gatekeeper' verursacht.  Dieser je nach Rechner teils minutenlange
202 Verifikationsvorgang ist gegenwärtig normal und nicht zu umgehen,
203 es ist kein Programmfehler.  Warten sie die Verifikation für jede der
204 DCP-o-matic Anwendungen ab, bei weiteren Programmstarts wird sie nicht
205 mehr auftreten.
206 EOF
207
208     rm -f $tmp_dmg "$dmg"
209     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
210     attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
211     device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
212     sleep 5
213
214     echo '
215   tell application "Finder"
216     tell disk "'$vol_name'"
217            open
218            set current view of container window to icon view
219            set toolbar visible of container window to false
220            set statusbar visible of container window to false
221            set the bounds of container window to {400, 200, 940, 300}
222            set theViewOptions to the icon view options of container window
223            set arrangement of theViewOptions to not arranged
224            set icon size of theViewOptions to 64
225            set position of item "'$appdir'" of container window to {90, 80}
226            set position of item "Applications" of container window to {265, 80}
227            set position of item "READ ME.txt" of container window to {430, 80}
228            set position of item "READ ME.de_DE.txt" of container window to {595, 80}
229            close
230            open
231            update without registering applications
232            delay 5
233      end tell
234    end tell
235 ' | osascript
236
237     chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
238     sync
239
240     hdiutil eject $device
241     hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
242     sips -i "$appdir/Contents/Resources/dcpomatic2.icns"
243     DeRez -only icns "$appdir/Contents/Resources/dcpomatic2.icns" > "$appdir/Contents/Resources/DCP-o-matic.rsrc"
244     Rez -append "$appdir/Contents/Resources/DCP-o-matic.rsrc" -o "$dmg"
245     SetFile -a C "$dmg"
246     codesign --verify --verbose --sign "Developer ID Application: Carl Hetherington (R82DXSR997)" "$dmg"
247     if [ "$?" != "0" ]; then
248         echo "Failed to sign .dmg"
249         exit 1
250     fi
251     rm $tmp_dmg
252     rm -rf $vol_name
253 }
254
255 # @param #1 appdir
256 function setup {
257     appdir="$1"
258     approot="$appdir/Contents"
259     rm -rf "$appdir"
260     mkdir -p "$approot/MacOS"
261     mkdir -p "$approot/Frameworks"
262     mkdir -p "$approot/Resources"
263
264     to_relink="dcpomatic"
265     copy_libs "$approot/Frameworks"
266     copy_resources "$approot/Resources"
267 }
268
269 # DCP-o-matic main
270 setup "DCP-o-matic 2.app"
271 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$approot/MacOS"
272 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$approot/MacOS"
273 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_create "$approot/MacOS"
274 universal_copy $ROOT bin/ffprobe "$approot/MacOS"
275 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$approot/Info.plist"
276 rl=("$approot/MacOS/dcpomatic2" "$approot/MacOS/dcpomatic2_cli" "$approot/MacOS/dcpomatic2_create" "$approot/MacOS/ffprobe" "$approot/Frameworks/"*.dylib)
277 relink "${rl[@]}"
278 make_dmg "$appdir" "DCP-o-matic"
279
280 # DCP-o-matic KDM Creator
281 setup "DCP-o-matic 2 KDM Creator.app"
282 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$approot/MacOS"
283 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm_cli "$approot/MacOS"
284 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$approot/Info.plist"
285 rl=("$approot/MacOS/dcpomatic2_kdm" "$approot/MacOS/dcpomatic2_kdm_cli" "$approot/Frameworks/"*.dylib)
286 relink "${rl[@]}"
287 make_dmg "$appdir" "DCP-o-matic KDM Creator"
288
289 # DCP-o-matic Encode Server
290 setup "DCP-o-matic 2 Encode Server.app"
291 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server "$approot/MacOS"
292 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$approot/MacOS"
293 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_server.Info.plist "$approot/Info.plist"
294 rl=("$approot/MacOS/dcpomatic2_server" "$approot/MacOS/dcpomatic2_server_cli" "$approot/Frameworks/"*.dylib)
295 relink "${rl[@]}"
296 make_dmg "$appdir" "DCP-o-matic Encode Server"
297
298 # DCP-o-matic Batch Converter
299 setup "DCP-o-matic 2 Batch converter.app"
300 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$approot/MacOS"
301 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_batch.Info.plist "$approot/Info.plist"
302 rl=("$approot/MacOS/dcpomatic2_batch" "$approot/Frameworks/"*.dylib)
303 relink "${rl[@]}"
304 make_dmg "$appdir" "DCP-o-matic Batch Converter"
305
306 # DCP-o-matic Player
307 setup "DCP-o-matic 2 Player.app"
308 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_player "$approot/MacOS"
309 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_player.Info.plist "$approot/Info.plist"
310 rl=("$approot/MacOS/dcpomatic2_player" "$approot/Frameworks/"*.dylib)
311 relink "${rl[@]}"
312 make_dmg "$appdir" "DCP-o-matic Player"