Merge master.
[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 libopenjpeg "$WORK/$libs"
67 universal_copy_lib $ROOT libavdevice "$WORK/$libs"
68 universal_copy_lib $ROOT libavformat "$WORK/$libs"
69 universal_copy_lib $ROOT libavfilter "$WORK/$libs"
70 universal_copy_lib $ROOT libavutil "$WORK/$libs"
71 universal_copy_lib $ROOT libavcodec "$WORK/$libs"
72 universal_copy_lib $ROOT libswscale "$WORK/$libs"
73 universal_copy_lib $ROOT libswresample "$WORK/$libs"
74 universal_copy_lib $ROOT libpostproc "$WORK/$libs"
75 universal_copy $ROOT bin/ffprobe "$WORK/$macos"
76 universal_copy_lib $ENV libboost_system "$WORK/$libs"
77 universal_copy_lib $ENV libboost_filesystem "$WORK/$libs"
78 universal_copy_lib $ENV libboost_thread "$WORK/$libs"
79 universal_copy_lib $ENV libboost_date_time "$WORK/$libs"
80 universal_copy_lib $ENV libxml++ "$WORK/$libs"
81 universal_copy_lib $ENV libxslt "$WORK/$libs"
82 universal_copy_lib $ENV libxml2 "$WORK/$libs"
83 universal_copy_lib $ENV libglibmm-2.4 "$WORK/$libs"
84 universal_copy_lib $ENV libgobject "$WORK/$libs"
85 universal_copy_lib $ENV libgthread "$WORK/$libs"
86 universal_copy_lib $ENV libgmodule "$WORK/$libs"
87 universal_copy_lib $ENV libsigc "$WORK/$libs"
88 universal_copy_lib $ENV libglib-2 "$WORK/$libs"
89 universal_copy_lib $ENV libintl "$WORK/$libs"
90 universal_copy_lib $ENV libsndfile "$WORK/$libs"
91 universal_copy_lib $ENV libMagick++ "$WORK/$libs"
92 universal_copy_lib $ENV libMagickCore "$WORK/$libs"
93 universal_copy_lib $ENV libMagickWand "$WORK/$libs"
94 universal_copy_lib $ENV libssh "$WORK/$libs"
95 universal_copy_lib $ENV libwx "$WORK/$libs"
96 universal_copy_lib $ENV libfontconfig "$WORK/$libs"
97 universal_copy_lib $ENV libfreetype "$WORK/$libs"
98 universal_copy_lib $ENV libexpat "$WORK/$libs"
99 universal_copy_lib $ENV libltdl "$WORK/$libs"
100 universal_copy_lib $ENV libxmlsec1 "$WORK/$libs"
101 universal_copy_lib $ENV libzip "$WORK/$libs"
102 universal_copy_lib $ENV libquickmail "$WORK/$libs"
103 universal_copy_lib $ENV libcurl "$WORK/$libs"
104 universal_copy_lib $ENV libffi "$WORK/$libs"
105 universal_copy_lib $ENV libiconv "$WORK/$libs"
106 universal_copy_lib $ENV libpango "$WORK/$libs"
107 universal_copy_lib $ENV libcairo "$WORK/$libs"
108 universal_copy_lib $ENV libpixman "$WORK/$libs"
109 universal_copy_lib $ENV libharfbuzz "$WORK/$libs"
110
111 relink=`echo $relink | sed -e "s/\+//g"`
112
113 for obj in "$WORK/$macos/dcpomatic2" "$WORK/$macos/dcpomatic2_batch" "$WORK/$macos/dcpomatic2_cli" "$WORK/$macos/dcpomatic2_server_cli" "$WORK/$macos/ffprobe" "$WORK/$libs/"*.dylib; do
114   deps=`otool -L "$obj" | awk '{print $1}' | egrep "($relink)" | egrep "($ENV|$ROOT|boost)"`
115   changes=""
116   for dep in $deps; do
117       echo "Relinking $dep into $obj"
118       base=`basename $dep`
119       # $dep will be a path within 64/; make a 32/ path too
120       dep32=`echo $dep | sed -e "s/\/64\//\/32\//g"`
121       changes="$changes -change $dep @executable_path/../lib/$base -change $dep32 @executable_path/../lib/$base"
122   done
123   if test "x$changes" != "x"; then
124     install_name_tool $changes "$obj"
125   fi
126 done
127
128 cp build/platform/osx/Info.plist "$WORK/$approot"
129 cp icons/dcpomatic.icns "$WORK/$resources/DCP-o-matic.icns"
130 cp icons/colour_conversions.png "$WORK/$resources"
131 cp icons/defaults.png "$WORK/$resources"
132 cp icons/kdm_email.png "$WORK/$resources"
133 cp icons/servers.png "$WORK/$resources"
134 cp icons/tms.png "$WORK/$resources"
135 cp icons/keys.png "$WORK/$resources"
136
137 # i18n: DCP-o-matic .mo files
138 for lang in de_DE es_ES fr_FR it_IT sv_SE nl_NL; do
139   mkdir -p "$WORK/$resources/$lang/LC_MESSAGES"
140   cp build/src/lib/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
141   cp build/src/wx/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
142   cp build/src/tools/mo/$lang/*.mo "$WORK/$resources/$lang/LC_MESSAGES"
143 done
144
145 # i18n: wxWidgets .mo files
146 for lang in de es fr it sv nl; do
147   mkdir "$WORK/$resources/$lang"
148   cp $ENV/64/share/locale/$lang/LC_MESSAGES/wxstd.mo "$WORK/$resources/$lang"
149 done
150
151 tmp_dmg=$WORK/dcpomatic_tmp.dmg
152 dmg="$WORK/DCP-o-matic $version.dmg"
153 vol_name=DCP-o-matic-$version
154
155 mkdir -p $WORK/$vol_name
156 cp -a "$WORK/$appdir" $WORK/$vol_name
157 ln -s /Applications "$WORK/$vol_name/Applications"
158
159 rm -f $tmp_dmg "$dmg"
160 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
161 attach=$(hdiutil attach -readwrite -noverify -noautoopen $tmp_dmg)
162 device=`echo $attach | egrep '^/dev/' | sed 1q | awk '{print $5}'`
163 sleep 5
164
165 echo '
166   tell application "Finder"
167     tell disk "'$vol_name'"
168            open
169            set current view of container window to icon view
170            set toolbar visible of container window to false
171            set statusbar visible of container window to false
172            set the bounds of container window to {400, 200, 790, 410}
173            set theViewOptions to the icon view options of container window
174            set arrangement of theViewOptions to not arranged
175            set icon size of theViewOptions to 64
176            set position of item "DCP-o-matic 2.app" of container window to {90, 80}
177            set position of item "Applications" of container window to {310, 80}
178            close
179            open
180            update without registering applications
181            delay 5
182      end tell
183    end tell
184 ' | osascript
185
186 chmod -Rf go-w /Volumes/"$vol_name"/"$appdir"
187 sync
188
189 hdiutil eject $device
190 hdiutil convert -format UDZO $tmp_dmg -imagekey zlib-level=9 -o "$dmg"
191 sips -i "$WORK/$resources/DCP-o-matic.icns"
192 DeRez -only icns "$WORK/$resources/DCP-o-matic.icns" > "$WORK/$resources/DCP-o-matic.rsrc"
193 Rez -append "$WORK/$resources/DCP-o-matic.rsrc" -o "$dmg"
194 SetFile -a C "$dmg"