Better document which members can be set when writing
[survex.git] / buildmacosx.sh
blob7bb10a4ae0c06ec442efa1488207086322b45900
1 #!/bin/sh
3 # You'll need some development tools which aren't installed by default. To
4 # get these you can install Xcode (which is a free download from Apple):
6 # https://developer.apple.com/xcode/downloads/
8 # To build, open a terminal (Terminal.app in the "Utils" folder in
9 # "Applications") and unpack the downloaded survex source code. E.g. for
10 # 1.2.17:
12 # tar xf survex-1.2.17.tar.gz
14 # Then change directory into the unpacked sources:
16 # cd survex-1.2.17
18 # And then run this script:
20 # ./buildmacosx.sh
22 # This will automatically download and temporarily install wxWidgets,
23 # PROJ.4 and libav in subdirectories of the source tree (this script is smart
24 # enough not to re-download or re-build these if it already has).
26 # If you already have wxWidgets, PROJ.4 and/or libav installed permanently,
27 # you can disable these by passing one or more extra options - e.g. to build
28 # none of them, use:
30 # ./buildmacosx.sh --no-install-wx --no-install-proj --no-install-libav
32 # If wxWidgets is installed somewhere such that wx-config isn't on your
33 # PATH you need to indicate where wx-config is by running this script
34 # something like this:
36 # env WX_CONFIG=/path/to/wx-config ./buildmacosx.sh
38 # (If you set WX_CONFIG, there's no need to pass --no-install-wx).
40 # If using a pre-installed wxWidgets, note that it must satisfy the
41 # following requirements:
43 # - It must be built with OpenGL support (--with-opengl).
45 # We strongly recommend using wxWidgets >= 3.0, but if you want to build with
46 # wxWidgets 2.8, it probably should be a "Unicode" build (--enable-unicode);
47 # wxWidgets >= 3.0 effectively is always a "Unicode" build, so the
48 # --enable-unicode option isn't needed (and is ignored if specified).
50 # This script builds diskimages which are known to work at least as far back
51 # as OS X 10.6.8. A build of wxWidgets 3.0.2 with the options we pass will
52 # default to assuming at least OS X 10.5, but we've not heard from anyone
53 # trying with such an old version.
55 # Mac OS X support "fat" binaries which contain code for more than one
56 # processor, but the wxWidgets build system doesn't seem to allow creating
57 # these, so we have to choose what processor family to build for. By default
58 # we use -arch x86_64 which produces a build which will only work on 64-bit
59 # Intel Macs, but that's probably all machines modern enough to worry about.
61 # If you want a build which also works on older 32 bit Intel Macs, then run
62 # this script passing i386 on the command line, like so:
64 # ./buildmacosx.sh i386
66 # Or to build for much older machines with a Power PC processor, use:
68 # ./buildmacosx.sh ppc
70 set -e
72 install_wx=yes
73 install_proj=yes
74 install_libav=yes
75 while [ "$#" != 0 ] ; do
76 case $1 in
77 --no-install-wx)
78 install_wx=no
79 shift
81 --no-install-proj)
82 install_proj=no
83 shift
85 --no-install-libav)
86 install_libav=no
87 shift
89 --help|-h)
90 echo "Usage: $0 [--no-install-wx] [--no-install-proj] [ppc|i386|x86_86]"
91 exit 0
93 -*)
94 echo "Unknown option - try --help" >&2
95 exit 1
98 break
100 esac
101 done
103 arch_flags='-arch '${1:-x86_64}
105 # UDBZ means the resultant disk image will only open on OS X 10.4 or above.
106 # UDZO works on 10.1 and later, but is larger, UDCO works on 10.0 as well,
107 # but is larger still.
108 dmg_format=UDBZ
110 WX_VERSION=3.0.2
111 WX_SHA256=346879dc554f3ab8d6da2704f651ecb504a22e9d31c17ef5449b129ed711585d
113 PROJ_VERSION=4.8.0
114 PROJ_SHA256=2db2dbf0fece8d9880679154e0d6d1ce7c694dd8e08b4d091028093d87a9d1b5
116 LIBAV_VERSION=11.4
117 LIBAV_SHA256=0b7dabc2605f3a254ee410bb4b1a857945696aab495fe21b34c3b6544ff5d525
119 if [ -z "${WX_CONFIG+set}" ] && [ "$install_wx" != no ] ; then
120 if test -x WXINSTALL/bin/wx-config ; then
122 else
123 prefix=`pwd`/WXINSTALL
124 wxtarball=wxWidgets-$WX_VERSION.tar.bz2
125 test -f "$wxtarball" || \
126 curl -L -O "http://downloads.sourceforge.net/project/wxwindows/$WX_VERSION/$wxtarball"
127 if echo "$WX_SHA256 $wxtarball" | shasum -a256 -c ; then
128 : # OK
129 else
130 echo "Checksum of downloaded file '$wxtarball' is incorrect, aborting."
131 exit 1
133 echo "+++ Extracting $wxtarball"
134 test -d "wxWidgets-$WX_VERSION" || tar xf "$wxtarball"
135 test -d "wxWidgets-$WX_VERSION/BUILD" || mkdir "wxWidgets-$WX_VERSION/BUILD"
136 cd "wxWidgets-$WX_VERSION/BUILD"
137 # Compilation of wx 3.0.2 fails on OS X 10.10.1 with webview enabled.
138 # A build with liblzma enabled doesn't work on OS X 10.6.8.
139 ../configure --disable-shared --prefix="$prefix" \
140 --with-opengl --enable-display \
141 --disable-webview --without-liblzma \
142 CC="gcc $arch_flags" CXX="g++ $arch_flags"
143 make -s
144 make -s install
145 cd ../..
147 WX_CONFIG=`pwd`/WXINSTALL/bin/wx-config
150 CC=`$WX_CONFIG --cc`
151 CXX=`$WX_CONFIG --cxx`
153 if [ "$install_proj" != no ] ; then
154 if test -f PROJINSTALL/include/proj_api.h ; then
156 else
157 prefix=`pwd`/PROJINSTALL
158 projtarball=proj-$PROJ_VERSION.tar.gz
159 test -f "$projtarball" || \
160 curl -O "http://download.osgeo.org/proj/$projtarball"
161 if echo "$PROJ_SHA256 $projtarball" | shasum -a256 -c ; then
162 : # OK
163 else
164 echo "Checksum of downloaded file '$projtarball' is incorrect, aborting."
165 exit 1
167 echo "+++ Extracting $projtarball"
168 test -d "proj-$PROJ_VERSION" || tar xf "$projtarball"
169 test -d "proj-$PROJ_VERSION/BUILD" || mkdir "proj-$PROJ_VERSION/BUILD"
170 cd "proj-$PROJ_VERSION/BUILD"
171 ../configure --disable-shared --prefix="$prefix" CC="$CC" CXX="$CXX"
172 make -s
173 make -s install
174 cd ../..
178 if [ "$install_libav" != no ] ; then
179 if test -f LIBAVINSTALL/include/libavcodec/avcodec.h ; then
181 else
182 prefix=`pwd`/LIBAVINSTALL
183 libavtarball=libav-$LIBAV_VERSION.tar.xz
184 test -f "$libavtarball" || \
185 curl -O "http://libav.org/releases/$libavtarball"
186 if echo "$LIBAV_SHA256 $libavtarball" | shasum -a256 -c ; then
187 : # OK
188 else
189 echo "Checksum of downloaded file '$libavtarball' is incorrect, aborting."
190 exit 1
192 echo "+++ Extracting $libavtarball"
193 test -d "libav-$LIBAV_VERSION" || tar xf "$libavtarball"
194 test -d "libav-$LIBAV_VERSION/BUILD" || mkdir "libav-$LIBAV_VERSION/BUILD"
195 cd "libav-$LIBAV_VERSION/BUILD"
196 LIBAV_CONFIGURE_OPTS='--disable-shared --disable-programs --disable-network --disable-bsfs --disable-protocols --disable-devices'
197 # We don't need to decode video, but disabling these causes a link failure
198 # when linking aven:
199 # --disable-decoders --disable-demuxers
200 if ! nasm -hf|grep -q macho64 ; then
201 # nasm needs to support macho64, at least for x86_64 builds.
202 LIBAV_CONFIGURE_OPTS="$LIBAV_CONFIGURE_OPTS --disable-yasm"
204 ../configure --prefix="$prefix" --cc="$CC" $LIBAV_CONFIGURE_OPTS
205 make -s
206 make -s install
207 cd ../..
211 test -n "$WX_CONFIG" || WX_CONFIG=`which wx-config`
212 if test -z "$WX_CONFIG" ; then
213 echo "WX_CONFIG not set and wx-config not on your PATH"
214 exit 1
216 # Force static linking so the user doesn't need to install wxWidgets.
217 WX_CONFIG=$WX_CONFIG' --static'
218 rm -rf *.dmg Survex macosxtmp
219 D=`pwd`/Survex
220 T=`pwd`/macosxtmp
221 PKG_CONFIG_PATH=`pwd`/PROJINSTALL/lib/pkgconfig:`pwd`/LIBAVINSTALL/lib/pkgconfig
222 export PKG_CONFIG_PATH
223 ./configure --prefix="$D" --bindir="$D" --mandir="$T" \
224 WX_CONFIG="$WX_CONFIG" CC="$CC" CXX="$CXX"
225 make
226 make install
227 #mv Survex/survex Survex/Survex
229 # Construct the Aven application bundle.
230 mkdir -p Survex/Aven.app/Contents/MacOS Survex/Aven.app/Contents/Resources
231 cp lib/Info.plist Survex/Aven.app/Contents
232 printf APPLAVEN > Survex/Aven.app/Contents/PkgInfo
233 mv Survex/share/doc/survex Survex/Docs
234 rmdir Survex/share/doc
235 mv Survex/share/survex/images Survex/Aven.app/Contents/Resources/
236 mv Survex/share/survex/unifont.pixelfont Survex/Aven.app/Contents/Resources/
237 ln Survex/share/survex/*.msg Survex/Aven.app/Contents/Resources/
238 mv Survex/aven Survex/Aven.app/Contents/MacOS/
239 ln Survex/cavern Survex/Aven.app/Contents/MacOS/
240 rm -rf Survex/share/applications Survex/share/icons Survex/share/mime-info
241 mkdir Survex/share/survex/proj
242 cp -p PROJINSTALL/share/proj/epsg PROJINSTALL/share/proj/esri Survex/share/survex/proj
243 mkdir Survex/Aven.app/Contents/Resources/proj
244 ln Survex/share/survex/proj/* Survex/Aven.app/Contents/Resources/proj
246 # Create .icns files in the bundle's "Resources" directory.
247 for zip in lib/icons/*.iconset.zip ; do
248 unzip -d Survex/Aven.app/Contents/Resources "$zip"
249 i=`echo "$zip"|sed 's!.*/\(.*\)\.zip$!\1!'`
250 iconutil --convert icns "Survex/Aven.app/Contents/Resources/$i"
251 rm -rf "Survex/Aven.app/Contents/Resources/$i"
252 done
254 size=`du -s Survex|sed 's/[^0-9].*//'`
255 # Allow 1500 extra sectors for various overheads (1000 wasn't enough).
256 sectors=`expr 1500 + "$size"`
257 # Partition needs to be at least 4M and sectors are 512 bytes.
258 if test "$sectors" -lt 8192 ; then
259 sectors=8192
261 echo "Creating new blank image survex-macosx.dmg of $sectors sectors"
262 # This creates the diskimage file and initialises it as an HFS+ volume.
263 hdiutil create -sectors "$sectors" survex-macosx -layout NONE -fs HFS+ -volname Survex
265 echo "Presenting image to the filesystems for mounting."
266 # This will mount the image onto the Desktop.
267 # Get the name of the device it is mounted on and the mount point.
269 # man hdiutil says:
270 # "The output of [hdiutil] attach has been stable since OS X 10.0 (though it
271 # was called hdid(8) then) and is intended to be program-readable. It consists
272 # of the /dev node, a tab, a content hint (if applicable), another tab, and a
273 # mount point (if any filesystems were mounted)."
275 # In reality, it seems there are also some spaces before each tab character.
276 hdid_output=`hdid survex-macosx.dmg|tail -1`
277 echo "Last line of hdid output was: $hdid_output"
278 dev=`echo "$hdid_output"|sed 's!/dev/\([^ ]*\).*!\1!'`
279 mount_point=`echo "$hdid_output"|sed 's!.* !!'`
281 echo "Device $dev mounted on $mount_point, copying files into image."
282 ditto -rsrcFork Survex "$mount_point/Survex"
283 ditto lib/INSTALL.OSX "$mount_point/INSTALL"
285 echo "Detaching image."
286 hdiutil detach "$dev"
288 version=`sed 's/^VERSION *= *//p;d' Makefile`
289 file=survex-macosx-$version.dmg
290 echo "Compressing image file survex-macosx.dmg to $file"
291 hdiutil convert survex-macosx.dmg -format "$dmg_format" -o "$file"
292 rm survex-macosx.dmg
294 echo "$file created successfully."