Remove erroneous executable bit from some testcases
[survex.git] / buildmacosx.sh
blobbe520fc55229df9ccc520f60c3a7c3d8f2933ec5
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 FFmpeg 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 FFmpeg 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-ffmpeg
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 build for the architecture of the version of OS X the build machine is
59 # running, which on a modern Mac will be x86_64, producing a build which will
60 # only work on 64-bit Intel Macs (but that's probably all machines modern
61 # enough to worry about).
63 # You can specify an arch explicitly on the command-line, e.g. to force a
64 # build for 64-bit Intel Macs:
66 # ./buildmacosx.sh x86_64
68 # Or if you want a build which also works on older 32 bit Intel Macs, then run
69 # this script passing i386 on the command line, like so (assuming your compiler
70 # supports this):
72 # ./buildmacosx.sh i386
74 # Or to build for much older machines with a Power PC processor, use (again
75 # assuming your compiler supports this):
77 # ./buildmacosx.sh ppc
79 set -e
81 install_wx=yes
82 install_proj=yes
83 install_ffmpeg=yes
84 while [ "$#" != 0 ] ; do
85 case $1 in
86 --no-install-wx)
87 install_wx=no
88 shift
90 --no-install-proj)
91 install_proj=no
92 shift
94 --no-install-ffmpeg)
95 install_ffmpeg=no
96 shift
98 --help|-h)
99 echo "Usage: $0 [--no-install-wx] [--no-install-proj] [--no-install-ffmpeg] [ppc|i386|x86_86]"
100 exit 0
103 echo "Unknown option - try --help" >&2
104 exit 1
107 break
109 esac
110 done
112 arch=$1
113 if [ -z "$arch" ] ; then
114 arch=`uname -m`
116 arch_flags="-arch $arch"
118 # UDBZ means the resultant disk image will only open on OS X 10.4 or above.
119 # UDZO works on 10.1 and later, but is larger, UDCO works on 10.0 as well,
120 # but is larger still.
121 dmg_format=UDBZ
123 WX_VERSION=3.0.4
124 WX_SHA256=96157f988d261b7368e5340afa1a0cad943768f35929c22841f62c25b17bf7f0
126 PROJ_VERSION=4.9.3
127 PROJ_SHA256=6984542fea333488de5c82eea58d699e4aff4b359200a9971537cd7e047185f7
129 FFMPEG_VERSION=3.1.3
130 FFMPEG_SHA256=f8575c071e2a64437aeb70c8c030b385cddbe0b5cde20c9b18a6def840128822
132 if [ -z "${WX_CONFIG+set}" ] && [ "$install_wx" != no ] ; then
133 if test -x WXINSTALL/bin/wx-config ; then
135 else
136 prefix=`pwd`/WXINSTALL
137 wxtarball=wxWidgets-$WX_VERSION.tar.bz2
138 test -f "$wxtarball" || \
139 curl -L -O "https://github.com/wxWidgets/wxWidgets/releases/download/v$WX_VERSION/$wxtarball"
140 if echo "$WX_SHA256 $wxtarball" | shasum -a256 -c ; then
141 : # OK
142 else
143 echo "Checksum of downloaded file '$wxtarball' is incorrect, aborting."
144 exit 1
146 echo "+++ Extracting $wxtarball"
147 test -d "wxWidgets-$WX_VERSION" || tar xf "$wxtarball"
148 test -d "wxWidgets-$WX_VERSION/BUILD" || mkdir "wxWidgets-$WX_VERSION/BUILD"
149 cd "wxWidgets-$WX_VERSION/BUILD"
150 # Compilation of wx 3.0.2 fails on OS X 10.10.1 with webview enabled.
151 # A build with liblzma enabled doesn't work on OS X 10.6.8.
152 ../configure --disable-shared --prefix="$prefix" \
153 --with-opengl --enable-display \
154 --disable-webview --without-liblzma \
155 CC="gcc $arch_flags" CXX="g++ $arch_flags"
156 make -s
157 make -s install
158 cd ../..
160 WX_CONFIG=`pwd`/WXINSTALL/bin/wx-config
163 [ -n "${WX_CONFIG}" ] || WX_CONFIG=`which wx-config 2>/dev/null`
164 if [ -z "${WX_CONFIG}" ] ; then
165 echo "wx-config not found in PATH."
166 echo
167 echo "If wxWidgets is installed, you can specify its location by setting environment variable WX_CONFIG:"
168 echo
169 echo "WX_CONFIG=/opt/bin/wx-config sh ./buildmacosx.sh"
170 exit 1
172 CC=`$WX_CONFIG --cc`
173 CXX=`$WX_CONFIG --cxx`
175 if [ "$install_proj" != no ] ; then
176 if test -f PROJINSTALL/include/proj_api.h ; then
178 else
179 prefix=`pwd`/PROJINSTALL
180 projtarball=proj-$PROJ_VERSION.tar.gz
181 test -f "$projtarball" || \
182 curl -O "http://download.osgeo.org/proj/$projtarball"
183 if echo "$PROJ_SHA256 $projtarball" | shasum -a256 -c ; then
184 : # OK
185 else
186 echo "Checksum of downloaded file '$projtarball' is incorrect, aborting."
187 exit 1
189 echo "+++ Extracting $projtarball"
190 test -d "proj-$PROJ_VERSION" || tar xf "$projtarball"
191 test -d "proj-$PROJ_VERSION/BUILD" || mkdir "proj-$PROJ_VERSION/BUILD"
192 cd "proj-$PROJ_VERSION/BUILD"
193 ../configure --disable-shared --prefix="$prefix" CC="$CC" CXX="$CXX"
194 make -s
195 make -s install
196 cd ../..
200 if [ "$install_ffmpeg" != no ] ; then
201 if test -f FFMPEGINSTALL/include/libavcodec/avcodec.h ; then
203 else
204 prefix=`pwd`/FFMPEGINSTALL
205 ffmpegtarball=ffmpeg-$FFMPEG_VERSION.tar.xz
206 test -f "$ffmpegtarball" || \
207 curl -O "https://ffmpeg.org/releases/$ffmpegtarball"
208 if echo "$FFMPEG_SHA256 $ffmpegtarball" | shasum -a256 -c ; then
209 : # OK
210 else
211 echo "Checksum of downloaded file '$ffmpegtarball' is incorrect, aborting."
212 exit 1
214 echo "+++ Extracting $ffmpegtarball"
215 test -d "ffmpeg-$FFMPEG_VERSION" || tar xf "$ffmpegtarball"
216 test -d "ffmpeg-$FFMPEG_VERSION/BUILD" || mkdir "ffmpeg-$FFMPEG_VERSION/BUILD"
217 cd "ffmpeg-$FFMPEG_VERSION/BUILD"
218 FFMPEG_CONFIGURE_OPTS='--disable-shared --disable-programs --disable-network --disable-bsfs --disable-protocols --disable-devices'
219 # We don't need to decode video, but disabling these causes a link failure
220 # when linking aven:
221 # --disable-decoders --disable-demuxers
222 if ! nasm -hf|grep -q macho64 ; then
223 # nasm needs to support macho64, at least for x86_64 builds.
224 FFMPEG_CONFIGURE_OPTS="$FFMPEG_CONFIGURE_OPTS --disable-yasm"
226 ../configure --prefix="$prefix" --cc="$CC" $FFMPEG_CONFIGURE_OPTS
227 make -s
228 make -s install
229 cd ../..
233 test -n "$WX_CONFIG" || WX_CONFIG=`which wx-config`
234 if test -z "$WX_CONFIG" ; then
235 echo "WX_CONFIG not set and wx-config not on your PATH"
236 exit 1
238 # Force static linking so the user doesn't need to install wxWidgets.
239 WX_CONFIG=$WX_CONFIG' --static'
240 rm -rf *.dmg Survex macosxtmp
241 C=`pwd`
242 D=$C/Survex
243 T=$C/macosxtmp
244 PKG_CONFIG_PATH=$C/PROJINSTALL/lib/pkgconfig:$C/FFMPEGINSTALL/lib/pkgconfig
245 export PKG_CONFIG_PATH
246 ./configure --prefix="$D" --bindir="$D" --mandir="$T" \
247 WX_CONFIG="$WX_CONFIG" CC="$CC" CXX="$CXX"
248 make
249 make install
250 #mv Survex/survex Survex/Survex
252 # Construct the Aven application bundle.
253 make create-aven-app APP_PATH=Survex/Aven.app
254 mv Survex/share/doc/survex Survex/Docs
255 rmdir Survex/share/doc
256 mv Survex/share/survex/images Survex/Aven.app/Contents/Resources/
257 mv Survex/share/survex/unifont.pixelfont Survex/Aven.app/Contents/Resources/
258 ln Survex/share/survex/*.msg Survex/Aven.app/Contents/Resources/
259 mv Survex/aven Survex/Aven.app/Contents/MacOS/
260 ln Survex/cavern Survex/extend Survex/Aven.app/Contents/MacOS/
261 rm -rf Survex/share/applications Survex/share/icons Survex/share/mime-info
262 mkdir Survex/share/survex/proj
263 cp -p PROJINSTALL/share/proj/epsg PROJINSTALL/share/proj/esri Survex/share/survex/proj
264 mkdir Survex/Aven.app/Contents/Resources/proj
265 ln Survex/share/survex/proj/* Survex/Aven.app/Contents/Resources/proj
267 size=`du -s Survex|sed 's/[^0-9].*//'`
268 # Allow 1500 extra sectors for various overheads (1000 wasn't enough).
269 sectors=`expr 1500 + "$size"`
270 # Partition needs to be at least 4M and sectors are 512 bytes.
271 if test "$sectors" -lt 8192 ; then
272 sectors=8192
274 echo "Creating new blank image survex-macosx.dmg of $sectors sectors"
275 # This creates the diskimage file and initialises it as an HFS+ volume.
276 hdiutil create -sectors "$sectors" survex-macosx -layout NONE -fs HFS+ -volname Survex
278 echo "Presenting image to the filesystems for mounting."
279 # This will mount the image onto the Desktop.
280 # Get the name of the device it is mounted on and the mount point.
282 # man hdiutil says:
283 # "The output of [hdiutil] attach has been stable since OS X 10.0 (though it
284 # was called hdid(8) then) and is intended to be program-readable. It consists
285 # of the /dev node, a tab, a content hint (if applicable), another tab, and a
286 # mount point (if any filesystems were mounted)."
288 # In reality, it seems there are also some spaces before each tab character.
289 hdid_output=`hdid survex-macosx.dmg|tail -1`
290 echo "Last line of hdid output was: $hdid_output"
291 dev=`echo "$hdid_output"|sed 's!/dev/\([^ ]*\).*!\1!'`
292 mount_point=`echo "$hdid_output"|sed 's!.* !!'`
294 echo "Device $dev mounted on $mount_point, copying files into image."
295 ditto -rsrcFork Survex "$mount_point/Survex"
296 ditto lib/INSTALL.OSX "$mount_point/INSTALL"
298 echo "Detaching image."
299 hdiutil detach "$dev"
301 version=`sed 's/^VERSION *= *//p;d' Makefile`
302 file=survex-macosx-$version.dmg
303 echo "Compressing image file survex-macosx.dmg to $file"
304 hdiutil convert survex-macosx.dmg -format "$dmg_format" -o "$file"
305 rm survex-macosx.dmg
307 echo "$file created successfully."