Compiling on MacOSX

From GRASS-Wiki
Jump to: navigation, search

Up-to-date compilation instructions are maintained in the source macosx/ReadMe.rtf. This builds a double-clickable application with "aqua" options where possible (Tcl/Tk, Python, OpenGL,...) and leaves out obscure X11-only-based features that have newer system-agnostic options (like motif/xganim), though these newer features may not be quite as fully-featured, yet. The X11 display system is included, since it is simple to include and is still quite useful.

The method below is for the older X11-based compilation, and includes the X11 motif-based xganim.

To build Grass from source you can use the frameworks that are on : http://www.kyngchaos.com/software:frameworks great thanks to W.Kyngesburye.

After installing all the frameworks you can add some library such "motif" needed by Xganim, using fink or build the source code

Install from source the tcl-tk library : http://www.tcl.tk/software/tcltk/downloadnow84.tml in /usr/local

Postgres can be easily compiled from source.

Download a SVN version http://grass.osgeo.org/download/index.php

Then configure and make GRASS from SVN/source code snapshot :

cd /path_to_grass_source

./configure --enable-sysv --with-x --with-opengl=x11 --without-odbc --with-cxx --with-freetype \
--with-freetype-includes=/Library/Frameworks/FreeType.framework/unix/include \
--with-freetype-libs=/Library/Frameworks/FreeType.framework/unix/lib \
--with-gdal=/Library/Frameworks/GDAL.framework/Versions/1.5/Programs/gdal-config \
--with-proj-includes=/Library/Frameworks/PROJ.framework/unix/include \
--with-proj-libs=/Library/Frameworks/PROJ.framework/unix/lib \
--with-proj-share=/Library/Frameworks/PROJ.framework/Versions/4.5/unix/share/ \
--with-tiff --with-tiff-includes=/Library/Frameworks/UnixImageIO.framework/unix/include \
--with-tiff-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib \
--with-png-includes=/Library/Frameworks/UnixImageIO.framework/unix/include \
--with-png-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib \
--with-sqlite --with-sqlite-libs=/Library/Frameworks/SQLite3.framework/unix/lib \
--with-sqlite-includes=/Library/Frameworks/SQLite3.framework/unix/include \
--with-fftw --with-fftw-includes=/Library/Frameworks/FFTW3.framework/unix/include \
--with-fftw-libs=/Library/Frameworks/FFTW3.framework/unix/lib \
--with-postgres-includes=/usr/local/pgsql/include --with-postgres-libs=/usr/local/pgsql/lib \
--with-freetype --with-freetype-includes=/Library/Frameworks/FreeType.framework/unix/include \
--with-freetype-libs=/Library/Frameworks/FreeType.framework/unix/lib --with-python --with-readline \
--with-readline-includes=/sw/include/readline --with-readline-libs=/sw/lib --with-tcltk-includes=/usr/local/include \
--with-tcltk-libs=/usr/local/lib --with-blas --with-lapack \
--with-blas-includes=/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers \
--with-lapack-includes=/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers \
--with-motif --with-motif-includes=/sw/include --with-motif-libs=/sw/lib --with-glw

make
sudo make install

COMPILING GRASS ON MAC OSX 10.8 TO RUN ON OSX 10.6 AND UP 64 BIT

Here are instructions on how to compile GRASS 6 and 7 on Mac OS X 10.8 so that it also runs in GRASS OS X 10.6 and up in 64 bit (but with 32 bit wxPython).

You must have Apple's developer tools installed, including the MacOSX10.6.sdk if you want your binary to run on OS X 10.6 as well as later versions of the OS

PREPARATION TO COMPILE (you only need to do this once)

Step 1: Python and wxPython:

Currently, do NOT install a 3rd party Python (e.g., from python.org) unless you know how to configure PYTHONPATH appropriately for GRASS and wxPython.

Mac OS X comes with Python 2.6 and OS X 10.7/10.8 comes with Python 2.6 and 2.7. This set up will use whatever your system comes with, but compiles wxPython to use Python 2.6

Install wxPython 2.8.12.1 for Python 2.6 (note that the installation directory must be correctly referenced in the configure script)

Create a script named "python" with the following in it and put it somewhere so it can be added to your path at compile time. For example, I put it in /Applications/python/bin32

#!/bin/sh
exec arch -i386 pythonw2.6 "$@"

This is to force python to run 32bit so wxpython tests work in configure (it also references the system python 2.6 and not 2.7).

Step 2: edit bundling code in ../grass7/macosx/

Make a script named "bundle.sh" with the following code:

# DYLD_FRAMEWORK_PATH for bundled frameworks

sed -i '' -e 's,^export DYLD_LIBRARY_PATH$,&\
export DYLD_FRAMEWORK_PATH="\$GISBASE/lib",' \
	${INST_DIR_TARGET}/grass.sh

Step 3: Set up bundling to make GRASS binary package for distribution

Edit bundle.make to reference wxPython. This includes a copy of wxPython with the GRASS binary so it will run regardless of what version of wxPython the user has installed separately. It also bundles fftw3.

...

WXPREFIX=/usr/local/lib/wxPython-unicode-2.8.12.1

bundle-macosx:
	${INSTALL} ${WXPREFIX}/lib/libwx_macud-2.8.0.dylib ${INST_DIR_TARGET}/lib
	${INSTALL} ${WXPREFIX}/lib/libwx_macud_gl-2.8.0.dylib ${INST_DIR_TARGET}/lib
	${INSTALL} ${WXPREFIX}/lib/libwx_macud_stc-2.8.0.dylib ${INST_DIR_TARGET}/lib
	${INSTALL} ${WXPREFIX}/lib/libwx_macud_gizmos-2.8.0.dylib ${INST_DIR_TARGET}/lib
	${INSTALL} ${WXPREFIX}/lib/libwx_macud_gizmos_xrc-2.8.0.dylib ${INST_DIR_TARGET}/lib
	cp -Rf ${WXPREFIX}/lib/python2.6/site-packages/wx-2.8-mac-unicode/wx ${INST_DIR_TARGET}/etc/python
	cp -Rf ${WXPREFIX}/lib/python2.6/site-packages/wx-2.8-mac-unicode/wxPython ${INST_DIR_TARGET}/etc/python
	cp -f ${WXPREFIX}/lib/python2.6/site-packages/wxversion.py ${INST_DIR_TARGET}/etc/python
	sed -i '' -e 's/^GRASS_WXBUNDLED=.*/GRASS_WXBUNDLED=1/' ${INST_DIR_TARGET}/grass.sh
	cp -Rf /Library/Frameworks/FFTW3.framework ${INST_DIR_TARGET}/lib/FFTW3.framework
	/usr/bin/env INST_DIR_TARGET="${INST_DIR_TARGET}" ./bundle.sh

You can bundle additional code if you desire. I also bundle gettext and LAS tools.


AT THE TIME OF COMPILATION (do this each time you compile)

Step 1: export the following prior to configuration. This makes GRASS run on OSX 10.6 as well as 10.7 and 10.8

export MACOSX_DEPLOYMENT_TARGET=10.6

export PATH="/Applications/python/bin32:/System/Library/Frameworks/Python.framework/Versions/2.6/bin:$PATH"

export CXX=g++

Step 2: configuration. Here is my configure script. This configures for both 32 and 64 bit. Because wxPython 2.8.x only runs 32 bit, it is configured to run in Python 2.6 32 bit. But the rest of GRASS will take advantage of the Mac 64 bit processing.

Here is my configuration script

./configure --with-macosx-sdk=/Developer/SDKs/MacOSX10.6.sdk --with-freetype --with-freetype-includes="/Library/Frameworks/FreeType.framework/unix/include/freetype2 /Library/Frameworks/FreeType.framework/unix/include" --with-freetype-libs=/Library/Frameworks/FreeType.framework/unix/lib --with-gdal=/Library/Frameworks/GDAL.framework/Programs/gdal-config --with-proj --with-proj-includes=/Library/Frameworks/PROJ.framework/unix/include --with-proj-libs=/Library/Frameworks/PROJ.framework/unix/lib --with-proj-share=/Library/Frameworks/PROJ.framework/Resources/proj --with-geos=/Library/Frameworks/GEOS.framework/Versions/3/unix/bin/geos-config --with-jpeg-includes=/Library/Frameworks/UnixImageIO.framework/unix/include --with-jpeg-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib --with-png-includes=/Library/Frameworks/UnixImageIO.framework/unix/include --with-png-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib --with-tiff-includes=/Library/Frameworks/UnixImageIO.framework/unix/include --with-tiff-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib --with-cairo --with-cairo-includes="/Library/Frameworks/cairo.framework/unix/include/cairo /Library/Frameworks/cairo.framework/unix/include" --with-cairo-libs=/Library/Frameworks/cairo.framework/unix/lib --with-cairo-ldflags="-lcairo" --without-postgres --without-mysql --with-odbc --with-sqlite --with-sqlite-libs=/Library/Frameworks/SQLite3.framework/unix/lib --with-sqlite-includes=/Library/Frameworks/SQLite3.framework/unix/include --with-fftw-includes=/Library/Frameworks/FFTW3.framework/unix/include --with-fftw-libs=/Library/Frameworks/FFTW3.framework/unix/lib --with-x --with-cxx --with-opengl=aqua --without-readline --prefix=/Applications/GRASS --enable-macosx-app --with-python --with-wxwidgets=/usr/local/lib/wxPython-unicode-2.8.12.1/bin/wx-config --with-tcltk-includes="/Library/Frameworks/Tcl.framework/Headers /Library/Frameworks/Tk.framework/Headers /Library/Frameworks/Tk.framework/PrivateHeaders" --with-tcltk-libs="/usr/local/tcltk_active/lib" --with-macosx-archs="i386 x86_64" 

Step 3: make

make GDAL_DYNAMIC=

for GRASS 6, simply use make

Step 4: create installation bundle

make bindist