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