Due to recent perl script conversion, there are some build errors when compiling openblas with advance toolchain compilers.
412 lines
11 KiB
Bash
Executable File
412 lines
11 KiB
Bash
Executable File
#!/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 ifx"
|
|
|
|
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'
|
|
;;
|
|
*ifx*)
|
|
vendor=INTEL
|
|
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*|*ifx*)
|
|
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
|
|
|