More OS X tweaks.
[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
25 # KDM creator
26 appdir_kdm="DCP-o-matic 2 KDM Creator.app"
27 approot_kdm="$appdir_kdm/Contents"
28 libs_kdm="$approot_kdm/lib"
29 macos_kdm="$approot_kdm/MacOS"
30 resources_kdm="$approot_kdm/Resources"
31
32 rm -rf "$WORK/$appdir"
33 mkdir -p "$WORK/$macos"
34 mkdir -p "$WORK/$libs"
35 mkdir -p "$WORK/$resources"
36
37 relink="dcpomatic"
38
39 function universal_copy {
40     for f in $1/32/$2; do
41         if [ -h $f ]; then
42             ln -s $(readlink $f) "$3/`basename $f`"
43         else
44             g=`echo $f | sed -e "s/\/32\//\/64\//g"`
45             mkdir -p "$3"
46             lipo -create $f $g -output "$3/`basename $f`"
47         fi
48     done
49 }
50
51 function universal_copy_lib {
52     for f in $1/32/lib/$2*.dylib; do
53         if [ -h $f ]; then
54             ln -s $(readlink $f) "$3/`basename $f`"
55         else
56             g=`echo $f | sed -e "s/\/32\//\/64\//g"`
57             mkdir -p "$3"
58             lipo -create $f $g -output "$3/`basename $f`"
59         fi
60     done
61     relink="$relink|$2"
62 }
63
64 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2 "$WORK/$macos"
65 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_cli "$WORK/$macos"
66 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_server_cli "$WORK/$macos"
67 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_batch "$WORK/$macos"
68 universal_copy $ROOT src/dcpomatic/build/src/tools/dcpomatic2_kdm "$WORK/$macos_kdm"
69 universal_copy $ROOT src/dcpomatic/build/src/lib/libdcpomatic2.dylib "$WORK/$libs"
70 universal_copy $ROOT src/dcpomatic/build/src/wx/libdcpomatic2-wx.dylib "$WORK/$libs"
71 universal_copy_lib $ROOT libcxml "$WORK/$libs"
72 universal_copy_lib $ROOT libdcp-1.0 "$WORK/$libs"
73 universal_copy_lib $ROOT libasdcp-libdcp-1.0 "$WORK/$libs"
74 universal_copy_lib $ROOT libkumu-libdcp-1.0 "$WORK/$libs"
75 universal_copy_lib $ROOT libsub "$WORK/$libs"
76 universal_copy_lib $ROOT libasdcp-libsub-1.0 "$WORK/$libs"
77 universal_copy_lib $ROOT libkumu-libsub-1.0 "$WORK/$libs"
78 universal_copy_lib $ROOT libopenjpeg "$WORK/$libs"
79 universal_copy_lib $ROOT libavdevice "$WORK/$libs"
80 universal_copy_lib $ROOT libavformat "$WORK/$libs"
81 universal_copy_lib $ROOT libavfilter "$WORK/$libs"
82 universal_copy_lib $ROOT libavutil "$WORK/$libs"
83 universal_copy_lib $ROOT libavcodec "$WORK/$libs"
84 universal_copy_lib $ROOT libswscale "$WORK/$libs"
85 universal_copy_lib $ROOT libpostproc "$WORK/$libs"
86 universal_copy $ROOT bin/ffprobe "$WORK/$macos"
87 universal_copy_lib $ENV libboost_system "$WORK/$libs"
88 universal_copy_lib $ENV libboost_filesystem "$WORK/$libs"
89 universal_copy_lib $ENV libboost_thread "$WORK/$libs"
90 universal_copy_lib $ENV libboost_date_time "$WORK/$libs"
91 universal_copy_lib $ENV libboost_locale "$WORK/$libs"
92 universal_copy_lib $ENV libboost_regex "$WORK/$libs"
93 universal_copy_lib $ENV libxml++ "$WORK/$libs"
94 universal_copy_lib $ENV libxslt "$WORK/$libs"
95 universal_copy_lib $ENV libxml2 "$WORK/$libs"
96 universal_copy_lib $ENV libglibmm-2.4 "$WORK/$libs"
97 universal_copy_lib $ENV libgobject "$WORK/$libs"
98 universal_copy_lib $ENV libgthread "$WORK/$libs"
99 universal_copy_lib $ENV libgmodule "$WORK/$libs"
100 universal_copy_lib $ENV libsigc "$WORK/$libs"
101 universal_copy_lib $ENV libglib-2 "$WORK/$libs"
102 universal_copy_lib $ENV libintl "$WORK/$libs"
103 universal_copy_lib $ENV libsndfile "$WORK/$libs"
104 universal_copy_lib $ENV libMagick++ "$WORK/$libs"
105 universal_copy_lib $ENV libMagickCore "$WORK/$libs"
106 universal_copy_lib $ENV libMagickWand "$WORK/$libs"
107 universal_copy_lib $ENV libssh "$WORK/$libs"
108 universal_copy_lib $ENV libwx "$WORK/$libs"
109 universal_copy_lib $ENV libfontconfig "$WORK/$libs"
110 universal_copy_lib $ENV libfreetype "$WORK/$libs"
111 universal_copy_lib $ENV libexpat "$WORK/$libs"
112 universal_copy_lib $ENV libltdl "$WORK/$libs"
113 universal_copy_lib $ENV libxmlsec1 "$WORK/$libs"
114 universal_copy_lib $ENV libzip "$WORK/$libs"
115 universal_copy_lib $ENV libquickmail "$WORK/$libs"
116 universal_copy_lib $ENV libcurl "$WORK/$libs"
117 universal_copy_lib $ENV libffi "$WORK/$libs"
118 universal_copy_lib $ENV libiconv "$WORK/$libs"
119 universal_copy_lib $ENV libpango "$WORK/$libs"
120 universal_copy_lib $ENV libcairo "$WORK/$libs"
121 universal_copy_lib $ENV libpixman "$WORK/$libs"
122 universal_copy_lib $ENV libharfbuzz "$WORK/$libs"
123 universal_copy_lib $ENV libsamplerate "$WORK/$libs"
124 universal_copy_lib $ENV libicui18n "$WORK/$libs"
125 universal_copy_lib $ENV libicudata "$WORK/$libs"
126 universal_copy_lib $ENV libicuio "$WORK/$libs"
127 universal_copy_lib $ENV libicule "$WORK/$libs"
128 universal_copy_lib $ENV libiculx "$WORK/$libs"
129 universal_copy_lib $ENV libicutest "$WORK/$libs"
130 universal_copy_lib $ENV libicutu "$WORK/$libs"
131 universal_copy_lib $ENV libicuuc "$WORK/$libs"
132
133 relink=`echo $relink | sed -e "s/\+//g"`
134
135 for obj in "$WORK/$macos/dcpomatic2" "$WORK/$macos/dcpomatic2_batch" "$WORK/$macos/dcpomatic2_server" "$WORK/$macos_kdm/dcpomatic2_kdm" "$WORK/$macos/dcpomatic2_cli" "$WORK/$macos/dcpomatic2_server_cli" "$WORK/$macos/ffprobe" "$WORK/$libs/"*.dylib; do
136   deps=`otool -L "$obj" | awk '{print $1}' | egrep "($relink)" | egrep "($ENV|$ROOT|boost|libicu)"`
137   changes=""
138   for dep in $deps; do
139       echo "Relinking $dep into $obj"
140       base=`basename $dep`
141       # $dep will be a path within 64/; make a 32/ path too
142       dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
143       changes="$changes -change $dep @executable_path/../lib/$base -change $dep32 @executable_path/../lib/$base"
144   done
145   if test "x$changes" != "x"; then
146     install_name_tool $changes "$obj"
147   fi
148 done
149
150 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2.Info.plist "$WORK/$approot/Info.plist"
151 cp $ROOT/32/src/dcpomatic/graphics/dcpomatic.icns "$WORK/$resources/DCP-o-matic.icns"
152 cp $ROOT/32/src/dcpomatic/graphics/colour_conversions.png "$WORK/$resources"
153 cp $ROOT/32/src/dcpomatic/graphics/defaults.png "$WORK/$resources"
154 cp $ROOT/32/src/dcpomatic/graphics/kdm_email.png "$WORK/$resources"
155 cp $ROOT/32/src/dcpomatic/graphics/servers.png "$WORK/$resources"
156 cp $ROOT/32/src/dcpomatic/graphics/tms.png "$WORK/$resources"
157 cp $ROOT/32/src/dcpomatic/graphics/keys.png "$WORK/$resources"
158 cp $ROOT/32/src/dcpomatic/LiberationSans-Regular.ttf "$WORK/$resources"
159 cp $ROOT/32/src/dcpomatic/graphics/splash.png "$WORK/$resources"
160
161 # i18n: DCP-o-matic .mo files
162 for lang in de_DE es_ES fr_FR it_IT sv_SE nl_NL ru_RU pl_PL da_DK; do
163   mkdir -p "$WORK/$resources/$lang/LC_MESSAGES"
164   cp $ROOT/32/src/dcpomatic/build/src/lib/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
165   cp $ROOT/32/src/dcpomatic/build/src/wx/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
166   cp $ROOT/32/src/dcpomatic/build/src/tools/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
167 done
168
169 # i18n: wxWidgets .mo files
170 for lang in de es fr it sv nl; do
171   mkdir "$WORK/$resources/$lang"
172   cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$WORK/$resources/$lang"
173 done
174
175 tmp_dmg=$WORK/dcpomatic_tmp.dmg
176 dmg="$WORK/DCP-o-matic $version.dmg"
177 vol_name=DCP-o-matic-$version
178
179 mkdir -p $WORK/$vol_name
180 cp -a "$WORK/$appdir" $WORK/$vol_name
181 ln -s /Applications "$WORK/$vol_name/Applications"
182
183 # KDM creator
184 appdir_kdm="DCP-o-matic 2 KDM Creator.app"
185 approot_kdm="$appdir_kdm/Contents"
186 libs_kdm="$approot_kdm/lib"
187 macos_kdm="$approot_kdm/MacOS"
188 resources_kdm="$approot_kdm/Resources"
189 rm -rf "$WORK/$appdir_kdm"
190 mkdir -p "$WORK/$macos_kdm"
191 ln -s "../../../DCP-o-matic 2.app/Contents/lib" "$WORK/$libs_kdm"
192 ln -s "../../../DCP-o-matic 2.app/Contents/Resources" "$WORK/$resources_kdm"
193 cp $ROOT/32/src/dcpomatic/build/platform/osx/dcpomatic2_kdm.Info.plist "$WORK/$approot/Info.plist"
194 cp -a "$WORK/$appdir_kdm" $WORK/$vol_name
195
196 rm -f $tmp_dmg "$dmg"
197 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
198 attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
199 device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
200 sleep 5
201
202 echo '
203   tell application "Finder"
204     tell disk "'$vol_name'"
205            open
206            set current view of container window to icon view
207            set toolbar visible of container window to false
208            set statusbar visible of container window to false
209            set the bounds of container window to {400, 200, 790, 410}
210            set theViewOptions to the icon view options of container window
211            set arrangement of theViewOptions to not arranged
212            set icon size of theViewOptions to 64
213            set position of item "DCP-o-matic 2.app" of container window to {90, 80}
214            set position of item "DCP-o-matic 2 KDM Creator.app" of container window to {310, 80}
215            set position of item "Applications" of container window to {530, 80}
216            close
217            open
218            update without registering applications
219            delay 5
220      end tell
221    end tell
222 ' | osascript
223
224 chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
225 sync
226
227 hdiutil eject $device
228 hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
229 sips -i "$WORK/$resources/DCP-o-matic.icns"
230 DeRez -only icns "$WORK/$resources/DCP-o-matic.icns" > "$WORK/$resources/DCP-o-matic.rsrc"
231 Rez -append "$WORK/$resources/DCP-o-matic.rsrc" -o "$dmg"
232 SetFile -a C "$dmg"