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