#!/bin/sh split() { set -f old_ifs=$IFS IFS=$2 set -- $1 printf '%s ' "$@" IFS=$old_ifs set +f } hostos="$(uname -s | sed 's/\-.*//')" # # 1. Not specified # 1.1 Automatically detect, then check compiler # 1.2 If no fortran compiler is detected, gfortran is default with NOFORTRAN definition # 2. Specified # 2.1 If path is correct, check compiler # 2.2 If path is not correct, but still valid compiler name, force setting # 2.2.2 Path is not correct, invalid compiler name, then gfortran is default with NOFORTRAN definition # makefile="$1" config="$2" nofortran=0 shift 2 compiler="$*" compiler_bin="$1" # f77 is too ambiguous [ "$compiler" = "f77" ] && compiler='' path=`split "$PATH" ':'` if [ -z "$compiler" ]; then lists="gfortran g95 frt fort openf90 openf95 sunf77 sunf90 sunf95 xlf95 xlf90 xlf ppuf77 ppuf95 ppuf90 ppuxlf pathf90 pathf95 pgf95 pgf90 pgf77 pgfortran nvfortran flang egfortran ifort nagfor" for list in $lists; do for p in $path; do if [ -x "$p/$list" ]; then compiler=$list compiler_bin=$list break 2 fi done done fi if [ -z "$compiler" ]; then nofortran=1 compiler=gfortran vendor=GFORTRAN bu="_" else { data="$(command -v "$compiler_bin" >/dev/null 2>&1)" vendor="" } && { data=`$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.s && rm -f ftest.s` if [ -z "$data" ]; then data=`$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.c && rm -f ftest.c` fi case "$data" in *zhoge_*) bu=_ ;; esac case "$data" in *Fujitsu*) vendor=FUJITSU openmp='-Kopenmp' ;; *GNU*|*GCC*) v="${data##*GCC: *\) }" v="${v%%\"*}" major="${v%%.*}" if [ "$major" -ge 4 ]; then vendor=GFORTRAN openmp='-fopenmp' else case "$compiler" in *flang*) vendor=FLANG openmp='-fopenmp' ;; *pgf*|*nvf*) vendor=PGI openmp='-mp' ;; *) vendor=G77 openmp='' ;; esac fi ;; *g95*) vendor=G95 openmp='' ;; *Intel*) vendor=INTEL openmp='-fopenmp' ;; *'Sun Fortran'*) vendor=SUN openmp='-xopenmp=parallel' ;; *PathScale*) vendor=PATHSCALE openmp='-openmp' ;; *Open64*) vendor=OPEN64 openmp='-mp' ;; *PGF*|*NVF*) vendor=PGI openmp='-mp' ;; *'IBM XL'*) vendor=IBM openmp='-openmp' ;; *NAG*) vendor=NAG openmp='-openmp' ;; esac # for embedded underscore name, e.g. zho_ge, it may append 2 underscores. data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.s && rm -f ftest3.s` [ -z "$data" ] && { data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.c && rm -f ftest3.c` } case "$data" in *' zho_ge__'*) need2bu=1 ;; esac case "$vendor" in *G95*) [ "$NO_LAPACKE" != 1 ] && need2bu='' ;; esac } if [ -z "$vendor" ]; then case "$compiler" in *g77*) vendor=G77 bu=_ openmp='' ;; *g95*) vendor=G95 bu=_ openmp='' ;; *gfortran*) vendor=GFORTRAN bu=_ openmp='-fopenmp' ;; *ifort*) vendor=INTEL bu=_ openmp='-fopenmp' ;; *pathf*) vendor=PATHSCALE bu=_ openmp='-mp' ;; *pgf*|*nvf*) vendor=PGI bu=_ openmp='-mp' ;; *ftn*) vendor=PGI bu=_ openmp=-openmp ;; *frt*) vendor=FUJITSU bu=_ openmp='-openmp' ;; *sunf77*|*sunf90*|*sunf95*) vendor=SUN bu=_ openmp='-xopenmp=parallel' ;; *ppuf*|*xlf*) vendor=IBM openmp='-openmp' ;; *open64*) vendor=OPEN64 openmp='-mp' ;; *flang*) vendor=FLANG bu=_ openmp='-fopenmp' ;; *nagfor*) vendor=NAG bu=_ openmp='-openmp' ;; esac if [ -z "$vendor" ]; then nofortran=1 compiler="gfortran" vendor=GFORTRAN bu=_ openmp='' fi fi fi { data=`command -v $compiler_bin >/dev/null 2>&1` } && { binary=$BINARY [ "$USE_OPENMP" != 1 ] && openmp='' case "$binary" in 32) { link=`$compiler $openmp -m32 -v ftest2.f 2>&1 && rm -f a.out a.exe` } || { link=`$compiler $openmp -q32 -v ftest2.f 2>&1 && rm -f a.out a.exe` } || { # for AIX link=`$compiler $openmp -maix32 -v ftest2.f 2>&1 && rm -f a.out a.exe` } || { # for gfortran MIPS mips_data=`$compiler_bin -E -dM - < /dev/null` case "$mips_data" in *_MIPS_ISA_MIPS64*) link=`$compiler $openmp -mabi=n32 -v ftest2.f 2>&1 && rm -f a.out a.exe` ;; *) link=`$compiler $openmp -mabi=32 -v ftest2.f 2>&1 && rm -f a.out a.exe` ;; esac } || { binary='' } ;; 64) { link=`$compiler $openmp -m64 -v ftest2.f 2>&1 && rm -f a.out a.exe` } || { link=`$compiler $openmp -q64 -v ftest2.f 2>&1 && rm -f a.out a.exe` } || { # for AIX link=`$compiler $openmp -maix64 -v ftest2.f 2>&1 && rm -f a.out a.exe` } || { # for gfortran MIPS link=`$compiler $openmp -mabi=64 -v ftest2.f 2>&1 && rm -f a.out a.exe` } || { # for nagfor link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe` } || { binary='' } ;; esac if [ -z "$binary" ]; then link=`$compiler $openmp -v ftest2.f 2>&1 && rm -f a.out a.exe` fi } if [ "$vendor" = "NAG" ]; then link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe` fi linker_L="" linker_l="" linker_a="" if [ -n "$link" ]; then link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'` link=`echo "$link" | sed 's/\-R[[:space:]]*/\-rpath\%/g'` link=`echo "$link" | sed 's/\-rpath[[:space:]]+/\-rpath\%/g'` link=`echo "$link" | sed 's/\-rpath-link[[:space:]]+/\-rpath-link\%/g'` flags=`echo "$link" | tr ',\n' ' '` # remove leading and trailing quotes from each flag. #@flags = map {s/^['"]|['"]$//g; $_} @flags; for flag in $flags; do case "$flag" in -L*) case "$flag" in -LIST:*|-LANG:*) ;; *) linker_L="$linker_L $flag" ;; esac esac case "$flag" in -Y*) [ "$hostos" = "SunOS" ] && continue linker_L="$linker_L -Wl,$flag" ;; esac case "$flag" in --exclude-libs*) linker_L="$linker_L -Wl,$flag" flag="" ;; esac case "$flag" in -rpath%*) flag=`echo "$flag" | sed 's/\%/\,/g'` linker_L="$linker_L -Wl,$flag" esac case "$flag" in -rpath-link%*) flag=`echo "$flag" | sed 's/\%/\,/g'` linker_L="$linker_L -Wl,$flag" ;; esac case "$flag" in *-lgomp*) case "$CC" in *clang*) flag="-lomp" ;; esac esac case "$flag" in -l*) case "$flag" in *ibrary*|*gfortranbegin*|*flangmain*|*frtbegin*|*pathfstart*|\ *crt[0-9]*|*gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|\ -l) ;; *omp*) case "$vendor" in *PGI*|*FUJITSU*) ;; *) linker_l="$linker_l $flag" ;; esac ;; *[0-9]*) if [ "$vendor" = "FUJITSU" ]; then case "$flag" in -lfj90*) linker_l="$linker_l $flag" ;; *) ;; esac fi ;; *) linker_l="$linker_l $flag" ;; esac esac case "$flag" in *quickfit.o*) [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;; esac case "$flag" in *safefit.o*) [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;; esac case "$flag" in *thsafe.o*) [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;; esac case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac done fi if [ "$vendor" = "FLANG" ]; then linker_a="$linker_a -lflang" fi printf "F_COMPILER=%s\n" "$vendor" >> "$makefile" printf "FC=%s\n" "$compiler" >> "$makefile" [ -n "$bu" ] && printf 'BU=%s\n' "$bu" >> "$makefile" [ "$nofortran" -eq 1 ] && printf 'NOFORTRAN=1\n' >> "$makefile" [ -n "$bu" ] && printf '#define BUNDERSCORE\t%s\n' "$bu" >> "$config" [ -n "$bu" ] && printf '#define NEEDBUNDERSCORE\t1\n' >> "$config" [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES\t1\n" >> "$config" [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES=1\n" >> "$config" if [ -n "$linker_l" ] || [ -n "$linker_a" ]; then printf "FEXTRALIB=%s %s %s\n" "$linker_L" "$linker_l" "$linker_a" >> "$makefile" fi