Octave has too many configure options. On IRIX you can choose the C compiler (gcc vs cc), the Fortran compiler (g77 vs f77), the C++ compiler (g++ vs CC), the FFT library (FFTW or FFTPACK), the linear algebra library (scs, ATLAS or LAPACK) and others. Some options do not work together, such as scs and g++.

The following script allows you to easily specify the options you want use while encoding the constraints for my specific setup. Save it as octaveconf somewhere in your path and type octaveconf for help. You may need to modify details such as the location of the compiler.

Perhaps we want to build a script covering multiple systems which encodes knowledge of compilers and environments other than gcc.

IRIX Issues

rpath isn't being set correctly in configure

If my g++ 3.2 environment was set up properly, this would be a matter of converting the RLD_FLAG='...' line for sgi into '-rpath $(octlibdir)', but in my current setup I need -rpath /usr/local/lib:$(octlibdir) because I can't figure out how to get /usr/local/lib on to the default load library path.

My octaveconf script converts RLD_PATH in Makeconf after ./configure runs. --enable-rpath=... would do the same job, except that configure.in will need to be patched to support this.

syscalls has issues with 64 bit numbers

This is a problem for fs.ino() and fs.size(). It is not correct to cast them to double, but that is what I am doing now. Until we figure out a nice way to limit the type explosion in the operator table, I'm not keen to and any more basic numeric types to octave. The fact that we need scalar, complex scalar, matrix, complex matrix and maybe sparse and complex sparse types for each precision doesn't help.

Mips PRO CC 7.3 is not ISO compliant

The following issues may go away when we upgrade to 7.4.

a. I needed to fake the <cxxx> headers.See here cmath is particularly tricky --- some lines therein may be copied from the GNU stdc++ lib which I referenced while doing this.

b. I get the following errors when building, but commenting out the offending functions seems to solve the problem:

 CC -c  -I. -I.. -I../liboctave -I../src -I../libcruft/misc  -I../glob -I../glob -DHAVE_CONFIG_H  -g -O2 -LANG:std \
 -I/data/freeware/src/CC-isoheaders -I/usr/local/include -woff 3333 ./TEMPLATE-INST/Array-tc.cc -o Array-tc.o 
 cc-3234 CC: ERROR File = ./TEMPLATE-INST/Array-tc.cc, Line = 44
   Explicit specialization of function "Array<octave_value>::resize_fill_value" must precede its first use.
 Array<octave_value>::resize_fill_value (void)
 cc-1136 CC: ERROR File = oct-obj.h, Line = 70
   Too many arguments in function call.
     { ::operator delete (p, static_cast<void *> (0)); }

SGI has multiple ABIs, and the linker complains if it has to guess

To suppress the warnings, the link line needs -L/usr/lib32/mips4. I haven't tried compiling for lib64. octaveconf predefines LDFLAGS to include this, -L/usr/local/lib (for readline) and -rpath /usr/local/lib (for readline and libc++). There may be a problem with multiple -rpath options in src/Makefile which I haven't yet resolved automatically.

scs and g++ 3.2 won't work together

Configure --without-lapack --without-blas in this case.

octaveconf

#!/bin/sh
# Octave configure script for jazz.  Type octaveconf for options.
#
# Notes:
# (1) The gcc compiler we are using is gcc 3.2 stored in /usr/local/bin.
#     The gcc 3.0.4 compiler in /usr/freeware/bin also works, except that
#     libstdc++ in /usr/local/lib trumps that in /usr/freeware/lib. We need
#     -L/usr/local/lib on the command line to pick up libreadline, thus
#     we are forced to use /usr/local/lib
# (2) atlas is not yet compiled for jazz.
# (3) fftw will not compile with the current octave sources (2003-01-01)
# (4) We are using a slightly old version of the SGI compiler.  The new
#     one is more standards compliant.  Fix the CXXFLAGS after we upgrade.
# (5) We need to hack -rpath because --enable-rpath doesn't allow us to
#     override the RLD_FLAG options.  Fix configure so that we can.
# (6) We can't use scs with g++ until we resolve the bus error that results.
# Usage notes
if test -z "$*" || test "$1" = "--help"; then cat <<EOF
Configure octave for jazz.
First change to the root octave directory:
   cd /data/freeware/src/octaveXXX
where XXX is the version of octave you are compiling.
If compiling from CVS, XXX is blank and you need to do the following:
   gmake distclean
   cvs -q update -d
   # resolve any conflicts then do the following
   ./autogen.sh
Next configure octave as appropriate. Leave options blank for the default.
   ../octaveconf  options
where options are chosen from the following
   default             use defaults for all options
   shared|static       build shared or static libs
   cc|gcc              C compiler
   CC|g++              C++ compiler
   f77|g77             Fortran compiler
   fftpack|fftw        FFT library
   scs|atlas|lapack    Linear algebra library
The first option in each group is the default.
EOF
   exit
fi
# Make sure we are in the octave root
if test ! -f "src/octave.cc"; then
   echo "Change to the octave root directory first"
   exit
fi
# Process the options
otheropts=
for opt in $*; do
   case "$opt" in
       shared)  shared=yes ;;
       static)  shared=no ;;
       cc)      cc=cc ;;
       gcc)     cc=gcc ;;
       CC)      cxx=CC ;;
       g++)     cxx=g++ ;;
       f77)     f77=f77 ;;
       g77)     f77=g77 ;;
       fftw)    fft=fftw ;;
       fftpack) fft=fftpack ;;
       scs)     lapack=scs ;;
       atlas)   lapack=atlas ;;
       lapack)  lapack=lapack ;;
       default) ;;
       *)       otheropts="$otheropts $opt" ;;
   esac
done
# Assign defaults
: ${shared:=yes} ${cc:=cc} ${cxx:=CC} ${f77:=f77} ${fft:=fftpack} ${lapack:=scs}
# Which FFT library to use
case "$fft" in
   fftw)    fftopts='--with-fftw="-I/usr/freeware/include -L/usr/freeware/lib32 -lfftw"' ;;
   fftpack) fftopts= ;;
esac
# Build static or shared
case "$shared" in
   yes) sharedopts="--disable-static --enable-shared" ;;
   no)  sharedopts="--disable-shared --enable-static --enable-dl" ;;
esac
# Which C compiler to use
case "$cc" in
   cc)  CC=cc CFLAGS="-g -O -I/usr/local/include" ;;
   gcc) CC=/usr/local/bin/gcc CFLAGS="-g -O -I/usr/local/include" ;;
esac
# Which C++ compiler to use.
# The following notes apply to the SGI compiler
#   1. Warning 1682 occurs when a overloaded virtual function is only
#      partially instantiated for a particular class
#      Warning 3333 says placement delete has been disabled.
#   2. /data/freeware/src/CC-isoheaders is my implementation of the
#      standard C++ headers corresponding to the standard C headers.
#   3. LANG:std says to follow the ISO standards
#   Points 2 and 3 will be resolved when the CC compiler is upgraded.
case "$cxx" in
   CC)  CXX=CC CXXFLAGS="-g -O2 -LANG:std -I/data/freeware/src/CC-isoheaders -I/usr/local/include -woff 3333" ;;
   g++) CXX=/usr/local/bin/g++ CXXFLAGS="-g -O2 -Wall -I/usr/local/include" ;;
esac
# Which Fortran compiler to use
case "$f77" in
   f77) F77=f77 FFLAGS="-g -O" ;;
   g77) F77=/usr/local/bin/g77 FFLAGS="-g -O" ;;
esac
# Need -L/usr/local/lib to find libreadline.
# Need -L/usr/lib32/mips4 to avoid complaints about mips3 vs mips4.
LDFLAGS="-L/usr/local/lib -L/usr/lib32/mips4 -rpath /usr/local/lib"
# Hack the configure script so that it doesn't find scs unless we are
# explicitly looking for it.
# Override scs if using g++ until we resolve the bus error that results
if test "$cxx" = "g++" -a "$lapack" = scs ; then lapack=lapack; fi
case "$lapack" in
 lapack) lapackopts="--without-lapack --without-blas" ;;
 scs)    lapackopts="" ;; # configure will find scs if it exists
 atlas)  echo "Atlas is not yet compiled for jazz" && exit ;;
esac
cp configure configure.bak
sed $sedopts < configure.bak > configure
# Do the actual configure
export CC CFLAGS CXX CXXFLAGS F77 FFLAGS LDFLAGS
./configure $sharedopts $lapackopts $fftopts $otheropts
# Hack the resulting Makeconf so that it includes the correct RLD_PATH
# New versions of octave accept --enable-rpath='-rpath ...' so the
# the sed hack below is not necessary.
case "$shared" in
 yes) rld='-rpath /usr/local/lib:$(octlibdir)' ;;
 no) rld='-rpath /usr/local/lib' ;;
esac
cp Makeconf Makeconf.bak
sed -e"s,RLD_FLAG *=.*$,RLD_FLAG = $rld," < Makeconf.bak > Makeconf