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