#! /bin/bash # configure script # note: has nothing to do with GNU autoconf exec 2> ${LOGFILE:-/dev/null} 3>&1 eval ${LOGFILE:+set -x} shopt -s nullglob export LC_ALL=C CONF_DIR="${0%/*}" CONF_OS="`uname -s`" CONF_MACH="`uname -m`" HAVE_GINAC=false HAVE_MCC=false CONF_BITS= DEBUG=false for arg in "$@" ; do case "$arg" in --debug) DEBUG=true ;; --prefix=*) CONF_PREFIX="${arg#--prefix=}" ;; --host=*) CONF_TARGET="${arg#--host=}" ;; --with-ginac) HAVE_GINAC=true ;; --with-mcc) HAVE_MCC=true ;; --32) CONF_BITS="-m32" ;; --64) CONF_BITS="-m64" ;; -*) echo "Warning: $arg is not a valid option." 1>&3 ;; *=*) eval "$arg" ;; *) echo "Warning: $arg is not a valid argument." 1>&3 ;; esac done test=test$$ trap "rm -fr $test* =." 0 1 2 3 15 ## look for some programs findprog() { echo -n "looking for $1... " 1>&3 var="$2" set -- ${!var:+"${!var}"} "${@:3}" for prog in "$@" ; do full="`type -P "$prog"`" && { echo "$full" 1>&3 printf -v "CONF_$var" "%q" "$full" return 0 } done echo "no $@ in your path" 1>&3 return 1 } addflag() { eval "CONF_$1=\"\${CONF_$1} ${@:2}\"" } gnuflags() { eval addflag FFLAGS -fdefault-real-8 # default double is 8 byte eval addflag FFLAGS -cpp # C pre-processor eval addflag FFLAGS -pedantic-errors -std=f2008 # folow f08 strictly eval addflag FFLAGS -J build # where to put mods eval addflag FFLAGS -Werror -Wall # make every warning an error eval addflag FFLAGS -Wno-uninitialized } findprog fortran FC ifort gfortran || exit 1 set -- `eval $CONF_FC --version -c | sed '/^$/d;s/([^)]*)//;q' 2>&1` case "$1,$2,$3" in GNU,Fortran,[123].*) echo "Only version >= 4 are supported" exit ;; GNU,Fortran,4.*) echo "Code optimisation is *not* suported on gfortran 4" gnuflags eval addflag $CONF_BITS if $DEBUG ; then eval addflag FFLAGS -g -O0 eval addflag FFLAGS -ffpe-trap=invalid,overflow eval addflag FFLAGS -fdump-core -fbacktrace eval addflag FFLAGS -frange-check eval addflag FFLAGS -DDEBUG else eval addflag FFLAGS -DRELEASE eval addflag FFLAGS -march=native -mtune=native fi ;; GNU,Fortran,*) gnuflags eval addflag FFLAGS -Wno-maybe-uninitialized eval addflag $CONF_BITS if $DEBUG ; then eval addflag FFLAGS -g -O0 eval addflag FFLAGS -ffpe-trap=invalid,overflow eval addflag FFLAGS -fdump-core -fbacktrace eval addflag FFLAGS -fcheck=all -frange-check eval addflag FFLAGS -DDEBUG else eval addflag FFLAGS -DRELEASE -O3 eval addflag FFLAGS -march=native -mtune=native fi ;; ifort*) eval addflag FFLAGS -autodouble eval addflag FFLAGS -module build eval addflag FFLAGS -fpp eval addflag FFLAGS -stand f03 eval addflag $CONF_BITS if $DEBUG ; then eval addflag FFLAGS -g -O0 eval addflag FFLAGS -DDEBUG else eval addflag FFLAGS -DRELEASE -O3 eval addflag FFLAGS -xHost -fast fi if HAVE_GINAC ; then echo "Option --with-ginac is incompatible with ifort, disabling" HAVE_GINAC=false fi if HAVE_MCC ; then echo "Option --with-mcc is incompatible with ifort, disabling" HAVE_MCC=false fi ;; *) echo "Unknown compiler" exit ;; esac echo -n "extracting the Fortran libraries... " 1>&3 rm -fr $test* tee $test.f90 << _EOF_ 1>&2 program test integer i common /uscore/ i stop i end _EOF_ while read line ; do set -- ${line//[:,()]/ } [[ "$1" =~ (/collect2|/ld|^ld)$ ]] && while test $# -gt 1 ; do shift case "$1" in *.o | -lc*) ;; -l* | -L* | *.a) FLDFLAGS+=" $1" ;; -Bstatic | -Bdynamic | *.ld) FLDFLAGS+=" -Wl,$1" ;; /*) FLDFLAGS+=" -L$1" ;; -rpath*) FLDFLAGS+=" -Wl,$1,$2" shift ;; -dynamic-linker) shift ;; esac done done < <(eval $CONF_FC $CONF_FFLAGS -v -o $test $test.f90 2>&1) echo "ok" 1>&3 eval addflag LFLAGS "$LDFLAGS $CONF_LDFLAGS $FLDFLAGS" if ( $HAVE_GINAC || $HAVE_MCC ); then findprog gcc CC clang gcc || exit 1 findprog g++ CXX clang++ g++ || exit 1 eval addflag CFLAGS "-std=c99" ## does Fortran append underscores to symbols? echo -n "does $CONF_FC append underscores... " 1>&3 tee $test-c.c << _EOF_ 1>&2 int uscore_ = 95; int uscore = 59; _EOF_ for CONF_BITS in ${CONF_BITS:--m64 -m32} ; do eval $CONF_CC $CONF_CFLAGS $CONF_BITS -c $test-c.c 1>&2 || continue eval $CONF_FC $CONF_FFLAGS -o $test $test.f90 $test-c.o 1>&2 && break done ./$test case $? in 95) echo "yes" 1>&3 CONF_NOUNDERSCORE=0 ;; 59) echo "no" 1>&3 CONF_NOUNDERSCORE=1 ;; *) echo "error linking Fortran and C" 1>&3 exit 1 ;; esac else $CONF_CC= $CONF_CXX= $CONF_CFLAGS= $CONF_NOUNDERSCORE= fi #if ( $CONF_GINA || $CONF_MCC ); then # #fi