|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- #!/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
-
|