1. Easy to install Binary Releases
==================================

A MacOS bundle is available from sourceforge.

  http://octave.sourceforge.net/index.html

There are also Octave packages available from both Fink and MacPorts.  Each
of these package managers handle the details of compiling Octave from source.

  http://www.finkproject.com
  http://www.macports.org/


2. Building from Source
=======================

Stable releases, development snapshots as well as the current developers
sources are available. The sources for stable releases are available from
the links below.

  ftp://ftp.gnu.org/pub/gnu/octave/
  http://ftp.gnu.org/pub/gnu/octave/

Development snapshots, intended for testing, are available from the link
below.

  ftp://alpha.gnu.org/gnu/octave

Links to the stable releases, snap shots, and instructions for obtaining
the current development sources using mercurial can be found on Octave's 
web-site below.

  http://www.gnu.org/software/octave/download.html

Building on MacOS can vary significantly between versions.  These
instructions document the procedure for MacOS 10.6.X.


2.1 Developer's Tools
---------------------

Apple's Xcode Developer's Tools must be installed to build Octave on MacOS X.

A fortran compiler is also required to build Octave.

AT&T Research provides versions of gfortran which have been patched to work
with gcc tool set bundled with Xcode.

  http://r.research.att.com/tools/

Alternatively, the Fink and MacPorts package managers provide more recent
versions of gcc which include gfortan.  Those may be used to build the sources
as well.  However, care must be taken.

  * The same compiler must be used to build all all of Octave's sources.  This
    is necessary to avoid conflicts between the compiler libraries such as
    libstdc++.  For a successful build the first file in LDFLAGS must refer to
    this library.  For example, if building with gcc-4.5 obtained from MacPorts
    LDFLAGS would begin as,

      export LDFLAGS="/opt/local/lib/gcc45/libstdc++.6.dylib [...]"

  * As of MacOS 10.6.6, the 64-bit BLAS routines that are part of Apple's vecLib
    (framework accelerate) are not functioning correctly.  As a work around, an
    alternative BLAS/LAPACK library, such as ATLAS, must be used.  A bug report 
    has been filed with Apple.

      http://bugreport.apple.com
      Title: "64 bit ABI issue with libBLAS.dylib"
      Problem ID: 7850167
      Date: April 11, 2010 at 12:04 AM


2.2 Manual Package Management
-----------------------------

Instructions for building Octave are available on the web at the link below.

    http://wiki.octave.org/wiki.pl?BuildFromSource

In addition, those wishing to build on MacOS X (10.6.x) should read section
2.1 above.

2.2.1 Critical Dependencies
---------------------------

The minimal dependencies needed to build Octave's snap-shots are listed below.

  * Xcode

  * Xcode-compatible gfortran: Available from http://r.reseach.att.com/tools

  * gnu sed: Available from http://www.gnu.org/software/sed/

      ./configure --prefix=/usr
      make
      sudo make install

  * gnu pcre: Available from ftp://ftp.gnu.org/
      The following build instructions will produce a universal binary,
      allowing both 32- and 64-bit code to link to pcre.  Whenever replacing
      libraries which came with the OS, it is necessary to compile them as
      universal binaries (even if you are only going to use one architecture)
      to avoid disrupting unrelated code which might also link to the library.

      export CFLAGS="-arch i686 -arch x86_64"
      export LDFLAGS="-arch i686 -arch x86_64"
      ./configure --prefix=/usr --disable-dependency-tracking
      make
      sudo make install

  * flex: Available from http://flex.sourceforge.net/

      ./configure --prefix=/usr
      make
      sudo make install

  * blas/lapack

    - The Apple/Intel-provided BLAS works out of the box in 32-bit as long as
      the -ff2c flag is used.  Alternatively, a wrapper for Apple's vecLib
      framework may be used, enabling 64-bit.

      https://mailman.cae.wisc.edu/pipermail/octave-maintainers/2011-January/022541.html

A fully functional Octave requires additional dependencies.  Here is an example
 of how to compile one of them as a universal binary:

  * fftw3: Available from http://www.fftw.org/download.html

      export F77="/usr/bin/gfortran"
      export CFLAGS="-arch i686 -arch x86_64"
      export FFLAGS="$CFLAGS"
      export LDFLAGS="$CFLAGS"
      ./configure --disable-dependency-tracking
      make
      sudo make install
      make clean
      ./configure --enable-float --disable-dependency-tracking
      make
      sudo make install

See the link below for additional details about optional dependencies.

    http://wiki.octave.org/wiki.pl?BuildFromSource

TODO - Modify the configure script to test for 64 bit vecLib bug.  When the bug
       is present, apply the wrapper solution.


2.2.2 Building Octave as a 32-bit Application
--------------------------------------------

The commands below are sufficient to build a 32-bit Octave.

  export FC="/usr/bin/gfortran"
  export CFLAGS="-m32"
  export FFLAGS="$CFLAGS -ff2c"
  export CPPFLAGS="$CFLAGS -D_REENTRANT -D__LISTS__"
  export LDFLAGS="$CFLAGS"
  ./configure --disable-readline --disable-docs
  make

Octave provides an integrated tests suite.

  make check

Octave may be run without installing the application using the utility below.

  ./run-octave

2.2.3 Building Octave as a 64-bit Application
--------------------------------------------

The commands below are sufficient to build a 64-bit Octave.

  export FC="/usr/bin/gfortran"
  export CFLAGS="-arch x86_64"
  export FFLAGS="$CFLAGS"
  export CPPFLAGS="$CFLAGS -D_REENTRANT -D__LISTS__"
  export LDFLAGS="$CFLAGS"
  ./configure --disable-readline --disable-docs
  make

Octave provides an integrated tests suite.

  make check

Octave may be run without installing the application using the utility below.

  ./run-octave


2.3 Building With Dependencies Satisfied by Fink
------------------------------------------------

To install and setup the Fink package manager see the on line documentation.

  http://www.finkproject.org/

Currently, Fink does not have a package available for Octave versions above
3.0.x.  These instructions will allow the developers sources to be build and
run, but will not permit Octave to be installed in the usual Fink way.

TODO - When a Fink package is developed for Octave 3.4.x, modify these 
       instructions to model the MacPorts section.


2.3.1 Dependencies
------------------

To build Octave's sources the list of Fink packages below need to be installed.

  aquaterm
  arpack
  autoconf (>= 2.6.0)
  automake (>= 1.11)
  fftw3 (>= 3.1.1)
  fftw3-shlibs (>= 3.1.1)
  flex >= 2.5.30
  fltk-aqua-shlibs 
  glpk-dev
  glpk-shlibs
  gnuplot (>= 4.2.6)
  graphicsmagick (<= 1.3.7)
  graphicsmagick-shlibs (<= 1.3.7)
  hdf5 (>= 1.6.5)
  hdf5-shlibs (>= 1.6.5)
  libcurl4
  libcurl4-shlibs
  libncurses5
  libncurses5-shlibs
  libtool >= 2.2.2 
  ncurses
  pcre
  pcre-shlibs
  qhull
  qrupdate [1]
  readline5
  readline5-shlibs 
  sed
  suitesparse (= 3.1.0-1 )

Some of Octave's dependencies are among the default packages for Fink.  These
include the list below, and possibly others as well.

  tetex
  texinfo

For fully functional printing (graphics output), the following packages must
be installed.

  epstool
  ghostscript
  pstoedit
  transfig [2]

[1] Fink does not yet have a package for qrupdate.  However, one is available
    in the tracker at the link below.

    http://sourceforge.net/tracker/index.php?func=detail&aid=2861045&group_id=17203&atid=414256

[2] Optionally the "xfig" package may be installed.


2.3.2 Building With Dependencies Satisfied by Fink
--------------------------------------------------

After installing each of the dependencies, the sources are compiled by
setting the proper environment variables and then following the standard build
sequence.  The following is an example set of variables for a 32-bit build
using gcc-4.2.  When building from the sources obtained from the mercurial
archive, ./autogen.sh must be run prior to ./configure.

  export FINK_PREFIX="/sw"
  export PREFIX="/usr/local/bin"

  export OPTFLAGS="-O2 -g"
  export LDFLAGS="-L$FINK_PREFIX/lib -L/usr/lib -m32"
  export CFLAGS="-I$FINK_PREFIX/include $OPTFLAGS -m32"
  export CXXFLAGS=$CFLAGS
  export CPPFLAGS="$CXXFLAGS -D__LISTS__"
  export ACLOCAL_FLAGS="-I$FINK_PREFIX/share/aclocal"
  export PKG_CONFIG_PATH="$FINK_PREFIX/lib/pkgconfig"
  export PATH="$FINK_PREFIX/var/lib/fink/path-prefix-10.6/:$PATH"
  export MACOSX_DEPLOYMENT_TARGET=10.5
  export PATH="$FINK_PREFIX/lib/flex/bin:$PATH"
  export CPPFLAGS="-I$FINK_PREFIX/lib/flex/include $CPPFLAGS"
  export LDFLAGS="-L$FINK_PREFIX/lib/flex/lib $LDFLAGS"
  export CC="gcc-4.2"
  export CPP="cpp-4.2"
  export CXX="g++-4.2"
  export F77="/usr/bin/gfortran-4.2"
  export FLIBS="-lgfortran -lgfortranbegin"
  export FFLAGS="-ff2c $OPTFLAGS -m32"
  export CPPFLAGS="$CPPFLAGS -I$FINK_PREFIX/include/freetype2 \
                             -I$FINK_PREFIX/include/qhull \
                             -I/usr/include"
  export CXXFLAGS="$CXXFLAGS -D_THREAD_SAFE -D_REENTRANT"

  ./configure --prefix=$PREFIX \
              --libexecdir='${prefix}/lib' \
              --with-blas="-Wl,-framework -Wl,vecLib"
  make

Note: This approach to building Octave does not support "make install".

TODO - Develop a Fink package for Octave 3.4.x.


2.4 Building With Dependencies Satisfied by MacPorts
----------------------------------------------------

To install and setup the MacPorts package manager see the online documentation

    http://guide.macports.org/

Using MacPorts, two approaches are described.  The first describes how to build
and locally install Octave from a formal snapshot of the developer's sources or
from the developer's sources themselves.  This is intended to the casual Octave
developer, or for users who want to live on the bleeding edge.

The second describes an approach for building Octave which is intended for
active developers.  In this case, MacPorts is used to satisfy Octave's
dependencies, but MacPorts does not build Octave.  Further a direct install of
Octave is not possible (i.e., cannot "make install").


2.4.1 Building and Installing Octave
------------------------------------

With MacPorts building the developer's sources is convenient.  MacPorts
includes a port file for octave-devel.  To build and run the most recent
development snapshots, enter the commands below.

  sudo port selfupdate
  sudo port install octave-devel

To build the developers sources in one's own way, or if MacPorts' version is
outdated, a custom port file can be added.  This requires setting up a local
port file repository (link below).

  http://guide.macports.org/#development.local-repositories

The octave-devel port file may be used as an initial starting point.  The port
file is accessible from the web at the link below.

  http://trac.macports.org/browser/trunk/dports/math/octave-devel/Portfile

It is also available locally at the location below.  The parameter ${prefix} is
corresponds to where MacPorts is install, which by default is "/opt/local".

  ${prefix}/var/macports/sources/rsync.macports.org/release/ports/math/octave-devel/Portfile

If the Portfile is missing the dependencies, epstools, epstoedit, and transfig,
those should be installed manually or added to the Portfile. To install
manually, type the command below.

  sudo port install epstools epstoedit transfig

The local source tarball must be placed in the location below, where ${name}
and ${distname} are each specified in the port file.

  ${prefix}/var/macports/distfiles/${name}/${disname}.tar.gz


2.4.2 Building for Active Development of Octave
-----------------------------------------------

To satisfy most of Octave's dependencies, first install the octave-devel port.

  sudo port selfupdate
  sudo port install octave-devel

Now uninstall the Octave port.

  sudo port deactivate octave-devel

This will remove Octave and leave its dependencies in place. Some additional
dependencies may be needed.

  sudo port install epstools epstoedit transfig

Octave may now be built from a local mercurial archive by typing the commands
below (these assume gcc-4.4 is installed by macports).

  ./autogen.sh
  export PREFIX=/opt/local
  export CC=/opt/local/bin/gcc-mp-4.4
  export CXX=/opt/local/bin/g++-mp-4.4
  export CXXCPP="/opt/local/bin/g++-mp-4.4 -E"
  export F77=/opt/local/bin/gfortran-mp-4.4
  export FC=/opt/local/bin/gfortran-mp-4.4
  export CXXFLAGS="-pipe -O2 -m64"
  export FFLAGS="$CXXFLAGS -D_THREAD_SAFE -pthread"
  export CFLAGS="$FFLAGS -lstdc++"
  export LDFLAGS=-L$PREFIX/lib
  export CPPFLAGS=-I$PREFIX/include
  export BLAS_LIBS="-lcblas -lf77blas -latlas"
  export LAPACK_LIBS=-llapack
  ./configure --prefix="/opt/local" --without-framework-carbon --with-x
  make

Octave's integrated tests may be run.

  make check

"make install" should not be run as it will bypass the macports package 
management.  To run Octave, type the command below from the root of the
mercurial archive.

  ./run-octave


John W. Eaton
jwe@octave.org

Ben Abbott
bpabbott@mac.com

Last updated: Sat Feb 19 14:15:04 PST 2011
