| @@ -245,7 +245,7 @@ endif() | |||
| if (APPLE AND DYNAMIC_ARCH AND BUILD_SHARED_LIBS) | |||
| set (CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1) | |||
| if (NOT NOFORTRAN) | |||
| if (NOT NOFORTRAN) | |||
| set (CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1) | |||
| set (CMAKE_Fortran_CREATE_SHARED_LIBRARY | |||
| "sh -c 'cat ${CMAKE_BINARY_DIR}/CMakeFiles/openblas_shared.dir/objects*.rsp | xargs -n 1024 ar -ru libopenblas.a && exit 0' " | |||
| @@ -395,7 +395,7 @@ if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "") | |||
| endif() | |||
| add_custom_command(TARGET ${OpenBLAS_LIBNAME}_shared POST_BUILD | |||
| COMMAND perl ${PROJECT_SOURCE_DIR}/exports/gensymbol "objcopy" "${ARCH}" "${BU}" "${EXPRECISION_IN}" "${NO_CBLAS_IN}" "${NO_LAPACK_IN}" "${NO_LAPACKE_IN}" "${NEED2UNDERSCORES_IN}" "${ONLY_CBLAS_IN}" \"${SYMBOLPREFIX}\" \"${SYMBOLSUFFIX}\" "${BUILD_LAPACK_DEPRECATED}" > ${PROJECT_BINARY_DIR}/objcopy.def | |||
| COMMAND ${PROJECT_SOURCE_DIR}/exports/gensymbol "objcopy" "${ARCH}" "${BU}" "${EXPRECISION_IN}" "${NO_CBLAS_IN}" "${NO_LAPACK_IN}" "${NO_LAPACKE_IN}" "${NEED2UNDERSCORES_IN}" "${ONLY_CBLAS_IN}" \"${SYMBOLPREFIX}\" \"${SYMBOLSUFFIX}\" "${BUILD_LAPACK_DEPRECATED}" > ${PROJECT_BINARY_DIR}/objcopy.def | |||
| COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR}/objcopy.def ${PROJECT_BINARY_DIR}/lib/lib${OpenBLAS_LIBNAME}.so | |||
| COMMENT "renaming symbols" | |||
| ) | |||
| @@ -54,9 +54,9 @@ all: getarch_2nd | |||
| ./getarch_2nd 1 >> $(TARGET_CONF) | |||
| $(TARGET_CONF): c_check f_check getarch | |||
| perl ./c_check $(TARGET_MAKE) $(TARGET_CONF) $(CC) $(TARGET_FLAGS) $(CFLAGS) | |||
| ./c_check $(TARGET_MAKE) $(TARGET_CONF) $(CC) $(TARGET_FLAGS) $(CFLAGS) | |||
| ifneq ($(ONLY_CBLAS), 1) | |||
| perl ./f_check $(TARGET_MAKE) $(TARGET_CONF) $(FC) $(TARGET_FLAGS) | |||
| ./f_check $(TARGET_MAKE) $(TARGET_CONF) $(FC) $(TARGET_FLAGS) | |||
| else | |||
| #When we only build CBLAS, we set NOFORTRAN=2 | |||
| echo "NOFORTRAN=2" >> $(TARGET_MAKE) | |||
| @@ -71,8 +71,8 @@ endif | |||
| getarch : getarch.c cpuid.S dummy $(CPUIDEMU) | |||
| avx512=$$(perl c_check - - $(CC) $(TARGET_FLAGS) $(CFLAGS) | grep NO_AVX512); \ | |||
| rv64gv=$$(perl c_check - - $(CC) $(TARGET_FLAGS) $(CFLAGS) | grep NO_RV64GV); \ | |||
| avx512=$$(./c_check - - $(CC) $(TARGET_FLAGS) $(CFLAGS) | grep NO_AVX512); \ | |||
| rv64gv=$$(./c_check - - $(CC) $(TARGET_FLAGS) $(CFLAGS) | grep NO_RV64GV); \ | |||
| $(HOSTCC) $(HOST_CFLAGS) $(EXFLAGS) $${avx512:+-D$${avx512}} $${rv64gv:+-D$${rv64gv}} -o $(@F) getarch.c cpuid.S $(CPUIDEMU) | |||
| getarch_2nd : getarch_2nd.c $(TARGET_CONF) dummy | |||
| @@ -1,451 +1,413 @@ | |||
| #!/usr/bin/env perl | |||
| #use File::Basename; | |||
| # use File::Temp qw(tempfile); | |||
| #!/bin/sh | |||
| # Checking cross compile | |||
| $hostos = `uname -s | sed -e s/\-.*//`; chop($hostos); | |||
| $hostarch = `uname -m | sed -e s/i.86/x86/`; | |||
| $hostarch = `uname -p` if ($hostos eq "AIX" || $hostos eq "SunOS"); | |||
| chop($hostarch); | |||
| $hostarch = "x86_64" if ($hostarch eq "amd64"); | |||
| $hostarch = "arm" if ($hostarch ne "arm64" && $hostarch =~ /^arm.*/); | |||
| $hostarch = "arm64" if ($hostarch eq "aarch64"); | |||
| $hostarch = "power" if ($hostarch =~ /^(powerpc|ppc).*/); | |||
| $hostarch = "zarch" if ($hostarch eq "s390x"); | |||
| #$tmpf = new File::Temp( UNLINK => 1 ); | |||
| $binary = $ENV{"BINARY"}; | |||
| $makefile = shift(@ARGV); | |||
| $config = shift(@ARGV); | |||
| $compiler_name = shift(@ARGV); | |||
| $flags = join(" ", @ARGV); | |||
| hostos=`uname -s | sed -e 's/\-.*//'` | |||
| hostarch=`uname -m | sed -e 's/i.86/x86/'` | |||
| if [ "$hostos" = "AIX" ] || [ "$hostos" = "SunOS" ]; then | |||
| hostarch=`uname -p` | |||
| fi | |||
| case "$hostarch" in | |||
| amd64) hostarch=x86_64 ;; | |||
| arm*) [ "$hostarch" = "arm64" ] || hostarch='arm' ;; | |||
| aarch64) hostarch=arm64 ;; | |||
| powerpc*|ppc*) hostarch=power ;; | |||
| s390x) hostarch=zarch ;; | |||
| esac | |||
| makefile="$1" | |||
| config="$2" | |||
| compiler_name="$3" | |||
| shift 3 | |||
| flags="$*" | |||
| # First, we need to know the target OS and compiler name | |||
| $data = `$compiler_name $flags -E ctest.c`; | |||
| if ($?) { | |||
| printf STDERR "C Compiler ($compiler_name) is something wrong.\n"; | |||
| die 1; | |||
| } | |||
| $cross_suffix = ""; | |||
| eval "use File::Basename"; | |||
| if ($@){ | |||
| warn "could not load PERL module File::Basename, emulating its functionality"; | |||
| my $dirnam = substr($compiler_name, 0, rindex($compiler_name, "/")-1 ); | |||
| if ($dirnam ne ".") { | |||
| $cross_suffix .= $dirnam . "/"; | |||
| } | |||
| my $basnam = substr($compiler_name, rindex($compiler_name,"/")+1, length($compiler_name)-rindex($compiler_name,"/")-1); | |||
| if ($basnam =~ /([^\s]*-)(.*)/) { | |||
| $cross_suffix .= $1; | |||
| } | |||
| } else { | |||
| if (dirname($compiler_name) ne ".") { | |||
| $cross_suffix .= dirname($compiler_name) . "/"; | |||
| } | |||
| if (basename($compiler_name) =~ /([^\s]*-)(.*)/) { | |||
| $cross_suffix .= $1; | |||
| } | |||
| } | |||
| $compiler = ""; | |||
| $compiler = LSB if ($data =~ /COMPILER_LSB/); | |||
| $compiler = CLANG if ($data =~ /COMPILER_CLANG/); | |||
| $compiler = PGI if ($data =~ /COMPILER_PGI/); | |||
| $compiler = PATHSCALE if ($data =~ /COMPILER_PATHSCALE/); | |||
| $compiler = INTEL if ($data =~ /COMPILER_INTEL/); | |||
| $compiler = OPEN64 if ($data =~ /COMPILER_OPEN64/); | |||
| $compiler = SUN if ($data =~ /COMPILER_SUN/); | |||
| $compiler = IBM if ($data =~ /COMPILER_IBM/); | |||
| $compiler = DEC if ($data =~ /COMPILER_DEC/); | |||
| $compiler = GCC if ($compiler eq ""); | |||
| $os = Linux if ($data =~ /OS_LINUX/); | |||
| $os = FreeBSD if ($data =~ /OS_FREEBSD/); | |||
| $os = NetBSD if ($data =~ /OS_NETBSD/); | |||
| $os = OpenBSD if ($data =~ /OS_OPENBSD/); | |||
| $os = DragonFly if ($data =~ /OS_DRAGONFLY/); | |||
| $os = Darwin if ($data =~ /OS_DARWIN/); | |||
| $os = SunOS if ($data =~ /OS_SUNOS/); | |||
| $os = AIX if ($data =~ /OS_AIX/); | |||
| $os = osf if ($data =~ /OS_OSF/); | |||
| $os = WINNT if ($data =~ /OS_WINNT/); | |||
| $os = CYGWIN_NT if ($data =~ /OS_CYGWIN_NT/); | |||
| $os = Interix if ($data =~ /OS_INTERIX/); | |||
| $os = Android if ($data =~ /OS_ANDROID/); | |||
| $os = Haiku if ($data =~ /OS_HAIKU/); | |||
| $architecture = x86 if ($data =~ /ARCH_X86/); | |||
| $architecture = x86_64 if ($data =~ /ARCH_X86_64/); | |||
| $architecture = e2k if ($data =~ /ARCH_E2K/); | |||
| $architecture = power if ($data =~ /ARCH_POWER/); | |||
| $architecture = mips if ($data =~ /ARCH_MIPS/); | |||
| $architecture = mips64 if ($data =~ /ARCH_MIPS64/); | |||
| $architecture = alpha if ($data =~ /ARCH_ALPHA/); | |||
| $architecture = sparc if ($data =~ /ARCH_SPARC/); | |||
| $architecture = ia64 if ($data =~ /ARCH_IA64/); | |||
| $architecture = arm if ($data =~ /ARCH_ARM/); | |||
| $architecture = arm64 if ($data =~ /ARCH_ARM64/); | |||
| $architecture = zarch if ($data =~ /ARCH_ZARCH/); | |||
| $architecture = riscv64 if ($data =~ /ARCH_RISCV64/); | |||
| $architecture = loongarch64 if ($data =~ /ARCH_LOONGARCH64/); | |||
| $defined = 0; | |||
| if ($os eq "AIX") { | |||
| $compiler_name .= " -maix32" if ($binary eq "32"); | |||
| $compiler_name .= " -maix64" if ($binary eq "64"); | |||
| $defined = 1; | |||
| } | |||
| if ($architecture eq "mips") { | |||
| $compiler_name .= " -mabi=32"; | |||
| $defined = 1; | |||
| } | |||
| if ($architecture eq "mips64") { | |||
| $compiler_name .= " -mabi=n32" if ($binary eq "32"); | |||
| $compiler_name .= " -mabi=64" if ($binary eq "64"); | |||
| $defined = 1; | |||
| } | |||
| if (($architecture eq "arm") || ($architecture eq "arm64")) { | |||
| $defined = 1; | |||
| } | |||
| if ($architecture eq "zarch") { | |||
| $defined = 1; | |||
| $binary = 64; | |||
| } | |||
| if ($architecture eq "e2k") { | |||
| $defined = 1; | |||
| $binary = 64; | |||
| } | |||
| if ($architecture eq "alpha") { | |||
| $defined = 1; | |||
| $binary = 64; | |||
| } | |||
| if ($architecture eq "ia64") { | |||
| $defined = 1; | |||
| $binary = 64; | |||
| } | |||
| if (($architecture eq "x86") && ($os ne Darwin) && ($os ne SunOS)) { | |||
| $defined = 1; | |||
| $binary =32; | |||
| } | |||
| if ($architecture eq "riscv64") { | |||
| $defined = 1; | |||
| $binary = 64; | |||
| } | |||
| if ($architecture eq "loongarch64") { | |||
| $defined = 1; | |||
| $binary = 64; | |||
| } | |||
| if ($compiler eq "PGI") { | |||
| $compiler_name .= " -tp p7" if ($binary eq "32"); | |||
| $compiler_name .= " -tp p7-64" if ($binary eq "64"); | |||
| $openmp = "-mp"; | |||
| $defined = 1; | |||
| } | |||
| if ($compiler eq "IBM") { | |||
| $compiler_name .= " -q32" if ($binary eq "32"); | |||
| $compiler_name .= " -q64" if ($binary eq "64"); | |||
| $openmp = "-qsmp=omp"; | |||
| $defined = 1; | |||
| } | |||
| if ($compiler eq "INTEL") { | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($compiler eq "PATHSCALE") { | |||
| $openmp = "-mp"; | |||
| } | |||
| if ($compiler eq "OPEN64") { | |||
| $openmp = "-mp"; | |||
| } | |||
| if ($compiler eq "CLANG") { | |||
| $openmp = "-fopenmp"; | |||
| } | |||
| if ($compiler eq "GCC" || $compiler eq "LSB") { | |||
| $openmp = "-fopenmp"; | |||
| { | |||
| data=`$compiler_name $flags -E ctest.c` | |||
| } || { | |||
| printf '%s\n' "C Compiler ($compiler_name) is something wrong." >&2 | |||
| exit 1 | |||
| } | |||
| if ($defined == 0) { | |||
| $compiler_name .= " -m32" if ($binary eq "32"); | |||
| $compiler_name .= " -m64" if ($binary eq "64"); | |||
| } | |||
| cross_suffix="" | |||
| if [ "`dirname $compiler_name`" != '.' ]; then | |||
| cross_suffix="$cross_suffix`dirname $compiler_name`/" | |||
| fi | |||
| bn=`basename $compiler_name` | |||
| case "$bn" in | |||
| *-*) cross_suffix="$cross_suffix${bn%-*}-" | |||
| esac | |||
| compiler="" | |||
| case "$data" in | |||
| *COMPILER_LSB*) compiler=LSB ;; | |||
| *COMPILER_CLANG*) compiler=CLANG ;; | |||
| *COMPILER_PGI*) compiler=PGI ;; | |||
| *COMPILER_PATHSCALE*) compiler=PATHSCALE ;; | |||
| *COMPILER_INTEL*) compiler=INTEL ;; | |||
| *COMPILER_OPEN64*) compiler=OPEN64 ;; | |||
| *COMPILER_SUN*) compiler=SUN ;; | |||
| *COMPILER_IBM*) compiler=IBM ;; | |||
| *COMPILER_DEC*) compiler=DEC ;; | |||
| esac | |||
| if [ -z "$compiler" ]; then | |||
| compiler=GCC | |||
| fi | |||
| case "$data" in *OS_LINUX*) os=Linux ;; esac | |||
| case "$data" in *OS_FREEBSD*) os=FreeBSD ;; esac | |||
| case "$data" in *OS_NETBSD*) os=NetBSD ;; esac | |||
| case "$data" in *OS_OPENBSD*) os=OpenBSD ;; esac | |||
| case "$data" in *OS_DRAGONFLY*) os=DragonFly ;; esac | |||
| case "$data" in *OS_DARWIN*) os=Darwin ;; esac | |||
| case "$data" in *OS_SUNOS*) os=SunOS ;; esac | |||
| case "$data" in *OS_AIX*) os=AIX ;; esac | |||
| case "$data" in *OS_OSF*) os=osf ;; esac | |||
| case "$data" in *OS_WINNT*) os=WINNT ;; esac | |||
| case "$data" in *OS_CYGWIN_NT*) os=CYGWIN_NT ;; esac | |||
| case "$data" in *OS_INTERIX*) os=Interix ;; esac | |||
| case "$data" in *OS_ANDROID*) os=Android ;; esac | |||
| case "$data" in *OS_HAIKU*) os=Haiku ;; esac | |||
| case "$data" in | |||
| *ARCH_X86_64*) architecture=x86_64 ;; | |||
| *ARCH_X86*) architecture=x86 ;; | |||
| *ARCH_E2K*) architecture=e2k ;; | |||
| *ARCH_POWER*) architecture=power ;; | |||
| *ARCH_MIPS64*) architecture=mips64 ;; | |||
| *ARCH_MIPS*) architecture=mips ;; | |||
| *ARCH_ALPHA*) architecture=alpha ;; | |||
| *ARCH_SPARC*) architecture=sparc ;; | |||
| *ARCH_IA64*) architecture=ia64 ;; | |||
| *ARCH_ARM64*) architecture=arm64 ;; | |||
| *ARCH_ARM*) architecture=arm ;; | |||
| *ARCH_ZARCH*) architecture=zarch ;; | |||
| *ARCH_RISCV64*) architecture=riscv64 ;; | |||
| *ARCH_LOONGARCH64*) architecture=loongarch64 ;; | |||
| esac | |||
| defined=0 | |||
| if [ "$os" = "AIX" ]; then | |||
| case "$BINARY" in | |||
| 32) compiler_name="$compiler_name -maix32" ;; | |||
| 64) compiler_name="$compiler_name -maix64" ;; | |||
| esac | |||
| defined=1 | |||
| fi | |||
| case "$architecture" in | |||
| mips) | |||
| compiler_name="$compiler_name -mabi=32" | |||
| defined=1 | |||
| ;; | |||
| mips64) | |||
| case "$BINARY" in | |||
| 32) compiler_name="$compiler_name -mabi=n32" ;; | |||
| 64) compiler_name="$compiler_name -mabi=64" ;; | |||
| esac | |||
| defined=1 | |||
| ;; | |||
| arm|arm64) defined=1 ;; | |||
| zarch|e2k|alpha|ia64|riscv64|loonarch64) | |||
| defined=1 | |||
| BINARY=64 | |||
| ;; | |||
| x86) | |||
| [ "$os" != "Darwin" ] && [ "$os" != "SunOS" ] && { | |||
| defined=1 | |||
| BINARY=32 | |||
| } | |||
| ;; | |||
| esac | |||
| case "$compiler" in | |||
| PGI) | |||
| case "$BINARY" in | |||
| 32) compiler_name="$compiler_name -tp p7" ;; | |||
| 64) compiler_name="$compiler_name -tp p7-64" ;; | |||
| esac | |||
| openmp='-mp' | |||
| defined=1 | |||
| ;; | |||
| IBM) | |||
| case "$BINARY" in | |||
| 32) compiler_name="$compiler_name -q32" ;; | |||
| 64) compiler_name="$compiler_name -q64" ;; | |||
| esac | |||
| openmp='-qsmp=omp' | |||
| defined=1 | |||
| ;; | |||
| INTEL) openmp='-openmp' ;; | |||
| PATHSCALE|OPEN64) openmp='-mp' ;; | |||
| CLANG|GCC|LSB) openmp='-fopenmp' ;; | |||
| esac | |||
| if [ "$defined" -eq 0 ]; then | |||
| case "$BINARY" in | |||
| 32) compiler_name="$compiler_name -m32" ;; | |||
| 64) compiler_name="$compiler_name -m64" ;; | |||
| esac | |||
| fi | |||
| # Do again | |||
| $data = `$compiler_name $flags -E ctest.c`; | |||
| if ($?) { | |||
| printf STDERR "C Compiler ($compiler_name) is something wrong.\n"; | |||
| die 1; | |||
| } | |||
| $have_msa = 0; | |||
| if (($architecture eq "mips") || ($architecture eq "mips64")) { | |||
| eval "use File::Temp qw(tempfile)"; | |||
| if ($@){ | |||
| warn "could not load PERL module File::Temp, so could not check MSA capatibility"; | |||
| } else { | |||
| $tmpf = new File::Temp( SUFFIX => '.c' , UNLINK => 1 ); | |||
| $code = '"addvi.b $w0, $w1, 1"'; | |||
| $msa_flags = "-mmsa -mfp64 -mload-store-pairs"; | |||
| print $tmpf "#include <msa.h>\n\n"; | |||
| print $tmpf "void main(void){ __asm__ volatile($code); }\n"; | |||
| $args = "$msa_flags -o $tmpf.o $tmpf"; | |||
| my @cmd = ("$compiler_name $flags $args >/dev/null 2>/dev/null"); | |||
| system(@cmd) == 0; | |||
| if ($? != 0) { | |||
| $have_msa = 0; | |||
| } else { | |||
| $have_msa = 1; | |||
| } | |||
| unlink("$tmpf.o"); | |||
| } | |||
| { | |||
| data="$($compiler_name $flags -E ctest.c)" | |||
| } || { | |||
| printf '%s\n' "C Compiler ($compiler_name) is something wrong." >&2 | |||
| exit 1 | |||
| } | |||
| $architecture = x86 if ($data =~ /ARCH_X86/); | |||
| $architecture = x86_64 if ($data =~ /ARCH_X86_64/); | |||
| $architecture = e2k if ($data =~ /ARCH_E2K/); | |||
| $architecture = power if ($data =~ /ARCH_POWER/); | |||
| $architecture = mips if ($data =~ /ARCH_MIPS/); | |||
| $architecture = mips64 if ($data =~ /ARCH_MIPS64/); | |||
| $architecture = alpha if ($data =~ /ARCH_ALPHA/); | |||
| $architecture = sparc if ($data =~ /ARCH_SPARC/); | |||
| $architecture = ia64 if ($data =~ /ARCH_IA64/); | |||
| $architecture = arm if ($data =~ /ARCH_ARM/); | |||
| $architecture = arm64 if ($data =~ /ARCH_ARM64/); | |||
| $architecture = zarch if ($data =~ /ARCH_ZARCH/); | |||
| $architecture = loongarch64 if ($data =~ /ARCH_LOONGARCH64/); | |||
| $binformat = bin32; | |||
| $binformat = bin64 if ($data =~ /BINARY_64/); | |||
| $no_avx512= 0; | |||
| if (($architecture eq "x86") || ($architecture eq "x86_64")) { | |||
| eval "use File::Temp qw(tempfile)"; | |||
| if ($@){ | |||
| warn "could not load PERL module File::Temp, so could not check compiler compatibility with AVX512"; | |||
| $no_avx512 = 0; | |||
| } else { | |||
| # $tmpf = new File::Temp( UNLINK => 1 ); | |||
| ($fh,$tmpf) = tempfile( SUFFIX => '.c' , UNLINK => 1 ); | |||
| $code = '"vbroadcastss -4 * 4(%rsi), %zmm2"'; | |||
| print $fh "#include <immintrin.h>\n\nint main(void){ __asm__ volatile($code); }\n"; | |||
| $args = " -march=skylake-avx512 -c -o $tmpf.o $tmpf"; | |||
| if ($compiler eq "PGI") { | |||
| $args = " -tp skylake -c -o $tmpf.o $tmpf"; | |||
| } | |||
| my @cmd = ("$compiler_name $flags $args >/dev/null 2>/dev/null"); | |||
| system(@cmd) == 0; | |||
| if ($? != 0) { | |||
| $no_avx512 = 1; | |||
| } else { | |||
| $no_avx512 = 0; | |||
| } | |||
| unlink("$tmpf.o"); | |||
| have_msa=0 | |||
| if [ "$architecture" = "mips" ] || [ "$architecture" = "mips64" ]; then | |||
| tmpd="$(mktemp -d)" | |||
| tmpf="$tmpd/a.c" | |||
| code='"addvi.b $w0, $w1, 1"' | |||
| msa_flags='-mmsa -mfp64 -mload-store-pairs' | |||
| printf "#include <msa.h>\n\n" >> "$tmpf" | |||
| printf "void main(void){ __asm__ volatile(%s); }\n" "$code" >> "$tmpf" | |||
| args="$msa_flags -o $tmpf.o $tmpf" | |||
| have_msa=1 | |||
| { | |||
| $compiler_name $flags $args >/dev/null 2>&1 | |||
| } || { | |||
| have_msa=0 | |||
| } | |||
| } | |||
| $no_rv64gv= 0; | |||
| if (($architecture eq "riscv64")) { | |||
| eval "use File::Temp qw(tempfile)"; | |||
| if ($@){ | |||
| warn "could not load PERL module File::Temp, so could not check compiler compatibility with the RISCV vector extension"; | |||
| $no_rv64gv = 0; | |||
| } else { | |||
| # $tmpf = new File::Temp( UNLINK => 1 ); | |||
| ($fh,$tmpf) = tempfile( SUFFIX => '.c' , UNLINK => 1 ); | |||
| $code = '"vsetvli zero, zero, e8, m1\n"'; | |||
| print $fh "int main(void){ __asm__ volatile($code); }\n"; | |||
| $args = " -march=rv64gv -c -o $tmpf.o $tmpf"; | |||
| my @cmd = ("$compiler_name $flags $args >/dev/null 2>/dev/null"); | |||
| system(@cmd) == 0; | |||
| if ($? != 0) { | |||
| $no_rv64gv = 1; | |||
| } else { | |||
| $no_rv64gv = 0; | |||
| } | |||
| unlink("$tmpf.o"); | |||
| rm -rf "$tmpd" | |||
| fi | |||
| case "$data" in | |||
| *ARCH_X86_64*) architecture=x86_64 ;; | |||
| *ARCH_X86*) architecture=x86 ;; | |||
| *ARCH_E2K*) architecture=e2k ;; | |||
| *ARCH_POWER*) architecture=power ;; | |||
| *ARCH_MIPS64*) architecture=mips64 ;; | |||
| *ARCH_MIPS*) architecture=mips ;; | |||
| *ARCH_ALPHA*) architecture=alpha ;; | |||
| *ARCH_SPARC*) architecture=sparc ;; | |||
| *ARCH_IA64*) architecture=ia64 ;; | |||
| *ARCH_ARM64*) architecture=arm64 ;; | |||
| *ARCH_ARM*) architecture=arm ;; | |||
| *ARCH_ZARCH*) architecture=zarch ;; | |||
| *ARCH_LOONGARCH64*) architecture=loongarch64 ;; | |||
| esac | |||
| binformat='bin32' | |||
| case "$data" in | |||
| *BINARY_64*) binformat='bin64' ;; | |||
| esac | |||
| no_avx512=0 | |||
| if [ "$architecture" = "x86" ] || [ "$architecture" = "x86_64" ]; then | |||
| tmpd=`mktemp -d` | |||
| tmpf="$tmpd/a.c" | |||
| code='"vbroadcastss -4 * 4(%rsi), %zmm2"' | |||
| printf "#include <immintrin.h>\n\nint main(void){ __asm__ volatile(%s); }\n" "$code" >> "$tmpf" | |||
| if [ "$compiler" = "PGI" ]; then | |||
| args=" -tp skylake -c -o $tmpf.o $tmpf" | |||
| else | |||
| args=" -march=skylake-avx512 -c -o $tmpf.o $tmpf" | |||
| fi | |||
| no_avx512=0 | |||
| { | |||
| $compiler_name $flags $args >/dev/null 2>&1 | |||
| } || { | |||
| no_avx512=1 | |||
| } | |||
| } | |||
| $c11_atomics = 0; | |||
| if ($data =~ /HAVE_C11/) { | |||
| eval "use File::Temp qw(tempfile)"; | |||
| if ($@){ | |||
| warn "could not load PERL module File::Temp, so could not check compiler compatibility with C11"; | |||
| $c11_atomics = 0; | |||
| } else { | |||
| ($fh,$tmpf) = tempfile( SUFFIX => '.c' , UNLINK => 1 ); | |||
| print $fh "#include <stdatomic.h>\nint main(void){}\n"; | |||
| $args = " -c -o $tmpf.o $tmpf"; | |||
| my @cmd = ("$compiler_name $flags $args >/dev/null 2>/dev/null"); | |||
| system(@cmd) == 0; | |||
| if ($? != 0) { | |||
| $c11_atomics = 0; | |||
| } else { | |||
| $c11_atomics = 1; | |||
| } | |||
| unlink("$tmpf.o"); | |||
| rm -rf "$tmpd" | |||
| fi | |||
| no_rv64gv=0 | |||
| if [ "$architecture" = "riscv64" ]; then | |||
| tmpd=`mktemp -d` | |||
| tmpf="$tmpd/a.c" | |||
| code='"vsetvli zero, zero, e8, m1\n"' | |||
| printf "int main(void){ __asm__ volatile(%s); }\n" "$code" >> "$tmpf" | |||
| args=" -march=rv64gv -c -o $tmpf.o $tmpf" | |||
| no_rv64gv=0 | |||
| { | |||
| $compiler_name $flags $args >/dev/null 2>&1 | |||
| } || { | |||
| no_rv64gv=1 | |||
| } | |||
| rm -rf "$tmpd" | |||
| fi | |||
| c11_atomics=0 | |||
| case "$data" in | |||
| *HAVE_C11*) | |||
| tmpd=`mktemp -d` | |||
| tmpf="$tmpd/a.c" | |||
| printf "#include <stdatomic.h>\nint main(void){}\n" >> "$tmpf" | |||
| args=' -c -o $tmpf.o $tmpf' | |||
| c11_atomics=1 | |||
| { | |||
| $compiler_name $flags $args >/dev/null 2>&1 | |||
| } || { | |||
| c11_atomics=0 | |||
| } | |||
| rm -rf "$tmpd" | |||
| ;; | |||
| esac | |||
| oldgcc=0 | |||
| no_avx2=0 | |||
| if [ "$compiler" = "GCC" ]; then | |||
| case "$architecture" in x86|x86_64) | |||
| no_avx2=0 | |||
| oldgcc=0 | |||
| data=`$compiler_name -dumpversion` | |||
| case "$data" in *.*.*) | |||
| data="${data%.*}" | |||
| esac | |||
| if awk -v n1=$data -v n2=4.6 'BEGIN { exit !(n1 <= n2) }'; then | |||
| no_avx2=1 | |||
| oldgcc=1 | |||
| fi | |||
| esac | |||
| fi | |||
| data=`$compiler_name $flags -S ctest1.c && grep globl ctest1.s | head -n 1 && rm -f ctest1.s` | |||
| need_fu='' | |||
| if echo "$data" | grep 'globl[[:space:]][_\.]'; then | |||
| need_fu="${data##*globl[[:space:]]}" | |||
| need_fu="${need_fu%%[!_\.]*}" | |||
| fi | |||
| cross=0 | |||
| if [ "$architecture" != "$hostarch" ]; then | |||
| cross=1 | |||
| [ "$hostarch" = "x86_64" ] && [ "$architecture" = "x86" ] && cross=0 | |||
| [ "$hostarch" = "mips64" ] && [ "$architecture" = "mips" ] && cross=0 | |||
| fi | |||
| [ "$os" != "$hostos" ] && cross=1 | |||
| [ "$os" = "Android" ] && [ "$hostos" = "Linux" ] && [ -n "$TERMUX_APP_PID" ] \ | |||
| && cross=0 | |||
| [ "$USE_OPENMP" != 1 ] && openmp='' | |||
| linker_L="" | |||
| linker_l="" | |||
| linker_a="" | |||
| link=`$compiler_name $flags -c ctest2.c -o ctest2.o 2>&1 && $compiler_name $flags $openmp -v ctest2.o -o ctest2 2>&1 && rm -f ctest2.o ctest2 ctest2.exe` | |||
| link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'` | |||
| flags=`echo $link | tr '[[:space:]],\n' ' '` | |||
| # Strip trailing quotes | |||
| old_flags="$flags" | |||
| flags='' | |||
| for flag in $old_flags; do | |||
| f=`echo "$flag" | tr '"' ' '` | |||
| flags="$flags $f" | |||
| done | |||
| 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*) | |||
| linker_L="$linker_L -Wl,$flag" ;; | |||
| esac | |||
| case "$flag" in --exclude-libs*) | |||
| linker_L="$linker_L -Wl,$flag" | |||
| flags="" | |||
| ;; | |||
| esac | |||
| case "$flag" in -l*) | |||
| case "$flag" in | |||
| *gfortranbegin*|*frtbegin*|*pathfstart*|*numa*|*crt[0-9]*|\ | |||
| *gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|*omp*|\ | |||
| *[0-9]*) ;; | |||
| *) linker_l="$linker_l $flag" ;; | |||
| esac | |||
| esac | |||
| case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac | |||
| done | |||
| [ "$makefile" = "-" ] && { | |||
| [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n" | |||
| [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" | |||
| [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" | |||
| [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n" | |||
| exit 0 | |||
| } | |||
| if ($compiler eq "GCC" &&( ($architecture eq "x86") || ($architecture eq "x86_64"))) { | |||
| $no_avx2 = 0; | |||
| $oldgcc = 0; | |||
| $data = `$compiler_name -dumpversion`; | |||
| if ($data <= 4.6) { | |||
| $no_avx2 = 1; | |||
| $oldgcc = 1; | |||
| } | |||
| } | |||
| $data = `$compiler_name $flags -S ctest1.c && grep globl ctest1.s | head -n 1 && rm -f ctest1.s`; | |||
| $data =~ /globl\s([_\.]*)(.*)/; | |||
| $need_fu = $1; | |||
| $cross = 0; | |||
| if ($architecture ne $hostarch) { | |||
| $cross = 1; | |||
| $cross = 0 if (($hostarch eq "x86_64") && ($architecture eq "x86")); | |||
| $cross = 0 if (($hostarch eq "mips64") && ($architecture eq "mips")); | |||
| } | |||
| $cross = 1 if ($os ne $hostos); | |||
| $cross = 0 if (($os eq "Android") && ($hostos eq "Linux") && ($ENV{TERMUX_APP_PID} != "")); | |||
| :> "$makefile" || exit 1 | |||
| :> "$config" || exit 1 | |||
| $openmp = "" if $ENV{USE_OPENMP} != 1; | |||
| $linker_L = ""; | |||
| $linker_l = ""; | |||
| $linker_a = ""; | |||
| # print $data, "\n"; | |||
| { | |||
| $link = `$compiler_name $flags -c ctest2.c -o ctest2.o 2>&1 && $compiler_name $flags $openmp -v ctest2.o -o ctest2 2>&1 && rm -f ctest2.o ctest2 ctest2.exe`; | |||
| $link =~ s/\-Y\sP\,/\-Y/g; | |||
| @flags = split(/[\s\,\n]/, $link); | |||
| # remove leading and trailing quotes from each flag. | |||
| @flags = map {s/^['"]|['"]$//g; $_} @flags; | |||
| foreach $flags (@flags) { | |||
| if ( | |||
| ($flags =~ /^\-L/) | |||
| && ($flags !~ /^-LIST:/) | |||
| && ($flags !~ /^-LANG:/) | |||
| ) { | |||
| $linker_L .= $flags . " " | |||
| } | |||
| if ($flags =~ /^\-Y/) { | |||
| $linker_L .= "-Wl,". $flags . " " | |||
| } | |||
| if ($flags =~ /^\--exclude-libs/) { | |||
| $linker_L .= "-Wl,". $flags . " "; | |||
| $flags=""; | |||
| } | |||
| if ( | |||
| ($flags =~ /^\-l/) | |||
| && ($flags !~ /gfortranbegin/) | |||
| && ($flags !~ /frtbegin/) | |||
| && ($flags !~ /pathfstart/) | |||
| && ($flags !~ /numa/) | |||
| && ($flags !~ /crt[0-9]/) | |||
| && ($flags !~ /gcc/) | |||
| && ($flags !~ /user32/) | |||
| && ($flags !~ /kernel32/) | |||
| && ($flags !~ /advapi32/) | |||
| && ($flags !~ /shell32/) | |||
| && ($flags !~ /omp/) | |||
| && ($flags !~ /[0-9]+/) | |||
| ) { | |||
| $linker_l .= $flags . " " | |||
| } | |||
| $linker_a .= $flags . " " if $flags =~ /\.a$/; | |||
| printf "OSNAME=%s\n" "$os" | |||
| printf "ARCH=%s\n" "$architecture" | |||
| printf "C_COMPILER=%s\n" "$compiler" | |||
| [ $binformat != 'bin32' ] && printf "BINARY32=\n" | |||
| [ $binformat != 'bin64' ] && printf "BINARY64=\n" | |||
| [ "$binformat" = "bin32" ] && printf "BINARY32=1\n" | |||
| [ "$binformat" = "bin64" ] && printf "BINARY64=1\n" | |||
| [ -n "$need_fu" ] && printf 'FU=%s\n' "$need_fu" | |||
| [ "$cross" -ne 0 ] && [ -n "$cross_suffix" ] && \ | |||
| printf "CROSS_SUFFIX=%s\n" "$cross_suffix" | |||
| [ "$cross" -ne 0 ] && printf "CROSS=1\n" | |||
| printf "CEXTRALIB=%s %s %s\n" "$linker_L" "$linker_l" "$linker_a" | |||
| [ "$have_msa" -eq 1 ] && { | |||
| printf "HAVE_MSA=1\n" | |||
| printf "MSA_FLAGS=%s\n" "$msa_flags" | |||
| } | |||
| [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n" | |||
| [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" | |||
| [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" | |||
| [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n" | |||
| } >> "$makefile" | |||
| } | |||
| os=`echo "$os" | tr '[[:lower:]]' '[[:upper:]]'/ ` | |||
| architecture=`echo "$architecture" | tr '[[:lower:]]' '[[:upper:]]' ` | |||
| compiler=`echo "$compiler" | tr '[[:lower:]]' '[[:upper:]]' ` | |||
| open(MAKEFILE, "> $makefile") || die "Can't create $makefile"; | |||
| open(CONFFILE, "> $config" ) || die "Can't create $config"; | |||
| { | |||
| printf "#define OS_%s\t1\n" "$os" | |||
| printf "#define ARCH_%s\t1\n" "$architecture" | |||
| printf "#define C_%s\t1\n" "$compiler" | |||
| [ "$binformat" = "bin32" ] && printf "#define __32BIT__\t1\n" | |||
| [ "$binformat" = "bin64" ] && printf "#define __64BIT__\t1\n" | |||
| [ -n "$need_fu" ] && printf "#define FUNDERSCORE\t%s\n" "$need_fu" | |||
| [ "$have_msa" -eq 1 ] && printf "#define HAVE_MSA\t1\n" | |||
| [ "$c11_atomics" -eq 1 ] && printf "#define HAVE_C11\t1\n" | |||
| } >> "$config" | |||
| # print $data, "\n"; | |||
| print MAKEFILE "OSNAME=$os\n"; | |||
| print MAKEFILE "ARCH=$architecture\n"; | |||
| print MAKEFILE "C_COMPILER=$compiler\n"; | |||
| print MAKEFILE "BINARY32=\n" if $binformat ne bin32; | |||
| print MAKEFILE "BINARY64=\n" if $binformat ne bin64; | |||
| print MAKEFILE "BINARY32=1\n" if $binformat eq bin32; | |||
| print MAKEFILE "BINARY64=1\n" if $binformat eq bin64; | |||
| print MAKEFILE "FU=$need_fu\n" if $need_fu ne ""; | |||
| print MAKEFILE "CROSS_SUFFIX=$cross_suffix\n" if $cross != 0 && $cross_suffix ne ""; | |||
| print MAKEFILE "CROSS=1\n" if $cross != 0; | |||
| print MAKEFILE "CEXTRALIB=$linker_L $linker_l $linker_a\n"; | |||
| print MAKEFILE "HAVE_MSA=1\n" if $have_msa eq 1; | |||
| print MAKEFILE "MSA_FLAGS=$msa_flags\n" if $have_msa eq 1; | |||
| print MAKEFILE "NO_RV64GV=1\n" if $no_rv64gv eq 1; | |||
| print MAKEFILE "NO_AVX512=1\n" if $no_avx512 eq 1; | |||
| print MAKEFILE "NO_AVX2=1\n" if $no_avx2 eq 1; | |||
| print MAKEFILE "OLDGCC=1\n" if $oldgcc eq 1; | |||
| $os =~ tr/[a-z]/[A-Z]/; | |||
| $architecture =~ tr/[a-z]/[A-Z]/; | |||
| $compiler =~ tr/[a-z]/[A-Z]/; | |||
| print CONFFILE "#define OS_$os\t1\n"; | |||
| print CONFFILE "#define ARCH_$architecture\t1\n"; | |||
| print CONFFILE "#define C_$compiler\t1\n"; | |||
| print CONFFILE "#define __32BIT__\t1\n" if $binformat eq bin32; | |||
| print CONFFILE "#define __64BIT__\t1\n" if $binformat eq bin64; | |||
| print CONFFILE "#define FUNDERSCORE\t$need_fu\n" if $need_fu ne ""; | |||
| print CONFFILE "#define HAVE_MSA\t1\n" if $have_msa eq 1; | |||
| print CONFFILE "#define HAVE_C11\t1\n" if $c11_atomics eq 1; | |||
| if ($os eq "LINUX") { | |||
| if [ "$os" = "LINUX" ]; then | |||
| # @pthread = split(/\s+/, `nm /lib/libpthread.so* | grep _pthread_create`); | |||
| # if ($pthread[2] ne "") { | |||
| # print CONFFILE "#define PTHREAD_CREATE_FUNC $pthread[2]\n"; | |||
| # } else { | |||
| print CONFFILE "#define PTHREAD_CREATE_FUNC pthread_create\n"; | |||
| printf "#define PTHREAD_CREATE_FUNC pthread_create\n" >> "$config" | |||
| # } | |||
| } else { | |||
| print CONFFILE "#define PTHREAD_CREATE_FUNC pthread_create\n"; | |||
| } | |||
| close(MAKEFILE); | |||
| close(CONFFILE); | |||
| else | |||
| printf "#define PTHREAD_CREATE_FUNC pthread_create\n" >> "$config" | |||
| fi | |||
| @@ -53,8 +53,8 @@ endif() | |||
| add_custom_command( | |||
| OUTPUT ${PROJECT_BINARY_DIR}/openblas.def | |||
| #TARGET ${OpenBLAS_LIBNAME} PRE_LINK | |||
| COMMAND perl | |||
| ARGS "${PROJECT_SOURCE_DIR}/exports/gensymbol" "win2k" "${ARCH_IN}" "dummy" "${EXPRECISION_IN}" "${NO_CBLAS_IN}" "${NO_LAPACK_IN}" "${NO_LAPACKE_IN}" "${NEED2UNDERSCORES_IN}" "${ONLY_CBLAS_IN}" "${SYMBOLPREFIX}" "${SYMBOLSUFFIX}" > "${PROJECT_BINARY_DIR}/openblas.def" | |||
| COMMAND "${PROJECT_SOURCE_DIR}/exports/gensymbol" | |||
| ARGS "win2k" "${ARCH_IN}" "dummy" "${EXPRECISION_IN}" "${NO_CBLAS_IN}" "${NO_LAPACK_IN}" "${NO_LAPACKE_IN}" "${NEED2UNDERSCORES_IN}" "${ONLY_CBLAS_IN}" "${SYMBOLPREFIX}" "${SYMBOLSUFFIX}" > "${PROJECT_BINARY_DIR}/openblas.def" | |||
| COMMENT "Create openblas.def file" | |||
| VERBATIM) | |||
| @@ -199,12 +199,12 @@ if (DEFINED CORE AND CMAKE_CROSSCOMPILING AND NOT (${HOST_OS} STREQUAL "WINDOWSS | |||
| "#define HAVE_VFP\n" | |||
| "#define HAVE_NEON\n" | |||
| "#define ARMV8\n") | |||
| if ("${TCORE}" STREQUAL "CORTEXA57") | |||
| if ("${TCORE}" STREQUAL "CORTEXA57") | |||
| set(SGEMM_UNROLL_M 16) | |||
| set(SGEMM_UNROLL_N 4) | |||
| else () | |||
| set(SGEMM_UNROLL_M 8) | |||
| set(SGEMM_UNROLL_N 8) | |||
| set(SGEMM_UNROLL_N 8) | |||
| endif () | |||
| set(DGEMM_UNROLL_M 8) | |||
| set(DGEMM_UNROLL_N 4) | |||
| @@ -603,7 +603,7 @@ endif () | |||
| "#define GEMM_MULTITHREAD_THRESHOLD\t${GEMM_MULTITHREAD_THRESHOLD}\n") | |||
| # Move to where gen_config_h would place it | |||
| file(MAKE_DIRECTORY ${TARGET_CONF_DIR}) | |||
| file(RENAME ${TARGET_CONF_TEMP} "${TARGET_CONF_DIR}/${TARGET_CONF}") | |||
| file(RENAME ${TARGET_CONF_TEMP} "${TARGET_CONF_DIR}/${TARGET_CONF}") | |||
| else(NOT CMAKE_CROSSCOMPILING) | |||
| # compile getarch | |||
| @@ -639,7 +639,7 @@ else(NOT CMAKE_CROSSCOMPILING) | |||
| OUTPUT_VARIABLE GETARCH_LOG | |||
| COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH_BIN} | |||
| ) | |||
| if (NOT ${GETARCH_RESULT}) | |||
| MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}") | |||
| endif () | |||
| @@ -120,10 +120,10 @@ dll : ../$(LIBDLLNAME) | |||
| -Wl,--whole-archive ../$(LIBNAME) -Wl,--no-whole-archive $(FEXTRALIB) $(EXTRALIB) | |||
| $(LIBPREFIX).def : gensymbol | |||
| perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| libgoto_hpl.def : gensymbol | |||
| perl ./gensymbol win2khpl $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| ./gensymbol win2khpl $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| ifeq ($(OSNAME), Darwin) | |||
| INTERNALNAME = $(LIBPREFIX).$(MAJOR_VERSION).dylib | |||
| @@ -266,23 +266,23 @@ static : ../$(LIBNAME) | |||
| rm -f goto.$(SUFFIX) | |||
| osx.def : gensymbol ../Makefile.system ../getarch.c | |||
| perl ./gensymbol osx $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| ./gensymbol osx $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| aix.def : gensymbol ../Makefile.system ../getarch.c | |||
| perl ./gensymbol aix $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| ./gensymbol aix $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| objcopy.def : gensymbol ../Makefile.system ../getarch.c | |||
| perl ./gensymbol objcopy $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| ./gensymbol objcopy $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| objconv.def : gensymbol ../Makefile.system ../getarch.c | |||
| perl ./gensymbol objconv $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| ./gensymbol objconv $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > $(@F) | |||
| test : linktest.c | |||
| $(CC) $(CFLAGS) $(LDFLAGS) -w -o linktest linktest.c ../$(LIBSONAME) -lm && echo OK. | |||
| rm -f linktest | |||
| linktest.c : gensymbol ../Makefile.system ../getarch.c | |||
| perl ./gensymbol linktest $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > linktest.c | |||
| ./gensymbol linktest $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) $(ONLY_CBLAS) "$(SYMBOLPREFIX)" "$(SYMBOLSUFFIX)" $(BUILD_LAPACK_DEPRECATED) $(BUILD_BFLOAT16) $(BUILD_SINGLE) $(BUILD_DOUBLE) $(BUILD_COMPLEX) $(BUILD_COMPLEX16) > linktest.c | |||
| clean :: | |||
| @rm -f *.def *.dylib __.SYMDEF* *.renamed | |||
| @@ -1,6 +1,16 @@ | |||
| #!/usr/bin/env perl | |||
| #!/bin/sh | |||
| split() { | |||
| set -f | |||
| old_ifs=$IFS | |||
| IFS=$2 | |||
| set -- $1 | |||
| printf '%s ' "$@" | |||
| IFS=$old_ifs | |||
| set +f | |||
| } | |||
| $hostos = `uname -s | sed -e s/\-.*//`; chop($hostos); | |||
| hostos="$(uname -s | sed 's/\-.*//')" | |||
| # | |||
| # 1. Not specified | |||
| @@ -12,407 +22,386 @@ $hostos = `uname -s | sed -e s/\-.*//`; chop($hostos); | |||
| # 2.2.2 Path is not correct, invalid compiler name, then gfortran is default with NOFORTRAN definition | |||
| # | |||
| $makefile = shift(@ARGV); | |||
| $config = shift(@ARGV); | |||
| makefile="$1" | |||
| config="$2" | |||
| nofortran=0 | |||
| $nofortran = 0; | |||
| shift 2 | |||
| compiler="$*" | |||
| compiler_bin="$1" | |||
| $compiler = join(" ", @ARGV); | |||
| $compiler_bin = shift(@ARGV); | |||
| # f77 is too ambiguous | |||
| $compiler = "" if $compiler eq "f77"; | |||
| @path = split(/:/, $ENV{"PATH"}); | |||
| if ($compiler eq "") { | |||
| @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"); | |||
| OUTER: | |||
| foreach $lists (@lists) { | |||
| foreach $path (@path) { | |||
| if (-x $path . "/" . $lists) { | |||
| $compiler = $lists; | |||
| $compiler_bin = $lists; | |||
| last OUTER; | |||
| [ "$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='' | |||
| } | |||
| } | |||
| } | |||
| } | |||
| if ($compiler eq "") { | |||
| $nofortran = 1; | |||
| $compiler = "gfortran"; | |||
| $vendor = GFORTRAN; | |||
| $bu = "_"; | |||
| } else { | |||
| $data = `which $compiler_bin > /dev/null 2> /dev/null`; | |||
| $vendor = ""; | |||
| if (!$?) { | |||
| $data = `$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.s && rm -f ftest.s`; | |||
| if ($data eq "") { | |||
| $data = `$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.c && rm -f ftest.c`; | |||
| } | |||
| if ($data =~ /zhoge_/) { | |||
| $bu = "_"; | |||
| } | |||
| if ($data =~ /Fujitsu/) { | |||
| $vendor = FUJITSU; | |||
| $openmp = "-Kopenmp"; | |||
| } elsif ($data =~ /GNU/ || $data =~ /GCC/ ) { | |||
| $data =~ s/\(+.*?\)+//g; | |||
| $data =~ /(\d+)\.(\d+).(\d+)/; | |||
| $major = $1; | |||
| $minor = $2; | |||
| if ($major >= 4) { | |||
| $vendor = GFORTRAN; | |||
| $openmp = "-fopenmp"; | |||
| } else { | |||
| if ($compiler =~ /flang/) { | |||
| $vendor = FLANG; | |||
| $openmp = "-fopenmp"; | |||
| } elsif ($compiler =~ /pgf/ || $compiler =~ /nvf/) { | |||
| $vendor = PGI; | |||
| $openmp = "-mp"; | |||
| } else { | |||
| $vendor = G77; | |||
| $openmp = ""; | |||
| } | |||
| } | |||
| } | |||
| if ($data =~ /g95/) { | |||
| $vendor = G95; | |||
| $openmp = ""; | |||
| } | |||
| if ($data =~ /Intel/) { | |||
| $vendor = INTEL; | |||
| $openmp = "-fopenmp"; | |||
| } | |||
| if ($data =~ /Sun Fortran/) { | |||
| $vendor = SUN; | |||
| $openmp = "-xopenmp=parallel"; | |||
| } | |||
| if ($data =~ /PathScale/) { | |||
| $vendor = PATHSCALE; | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($data =~ /Open64/) { | |||
| $vendor = OPEN64; | |||
| $openmp = "-mp"; | |||
| } | |||
| if ($data =~ /PGF/ || $data =~ /NVF/) { | |||
| $vendor = PGI; | |||
| $openmp = "-mp"; | |||
| } | |||
| if ($data =~ /IBM XL/) { | |||
| $vendor = IBM; | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($data =~ /NAG/) { | |||
| $vendor = NAG; | |||
| $openmp = "-openmp"; | |||
| } | |||
| # 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`; | |||
| if ($data eq "") { | |||
| $data = `$compiler -O2 -S ftest3.f > /dev/null 2>&1 && cat ftest3.c && rm -f ftest3.c`; | |||
| } | |||
| if ($data =~ / zho_ge__/) { | |||
| $need2bu = 1; | |||
| } | |||
| if ($vendor =~ /G95/) { | |||
| if ($ENV{NO_LAPACKE} != 1) { | |||
| $need2bu = ""; | |||
| } | |||
| } | |||
| } | |||
| if ($vendor eq "") { | |||
| if ($compiler =~ /g77/) { | |||
| $vendor = G77; | |||
| $bu = "_"; | |||
| $openmp = ""; | |||
| } | |||
| if ($compiler =~ /g95/) { | |||
| $vendor = G95; | |||
| $bu = "_"; | |||
| $openmp = ""; | |||
| } | |||
| if ($compiler =~ /gfortran/) { | |||
| $vendor = GFORTRAN; | |||
| $bu = "_"; | |||
| $openmp = "-fopenmp"; | |||
| } | |||
| if ($compiler =~ /ifort/) { | |||
| $vendor = INTEL; | |||
| $bu = "_"; | |||
| $openmp = "-fopenmp"; | |||
| } | |||
| if ($compiler =~ /pathf/) { | |||
| $vendor = PATHSCALE; | |||
| $bu = "_"; | |||
| $openmp = "-mp"; | |||
| } | |||
| if ($compiler =~ /pgf/ || $compiler =~ /nvf/) { | |||
| $vendor = PGI; | |||
| $bu = "_"; | |||
| $openmp = "-mp"; | |||
| } | |||
| if ($compiler =~ /ftn/) { | |||
| $vendor = PGI; | |||
| $bu = "_"; | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($compiler =~ /frt/) { | |||
| $vendor = FUJITSU; | |||
| $bu = "_"; | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($compiler =~ /sunf77|sunf90|sunf95/) { | |||
| $vendor = SUN; | |||
| $bu = "_"; | |||
| $openmp = "-xopenmp=parallel"; | |||
| } | |||
| if ($compiler =~ /ppuf/) { | |||
| $vendor = IBM; | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($compiler =~ /xlf/) { | |||
| $vendor = IBM; | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($compiler =~ /open64/) { | |||
| $vendor = OPEN64; | |||
| $openmp = "-mp"; | |||
| } | |||
| if ($compiler =~ /flang/) { | |||
| $vendor = FLANG; | |||
| $bu = "_"; | |||
| $openmp = "-fopenmp"; | |||
| } | |||
| if ($compiler =~ /nagfor/) { | |||
| $vendor = NAG; | |||
| $bu = "_"; | |||
| $openmp = "-openmp"; | |||
| } | |||
| if ($vendor eq "") { | |||
| $nofortran = 1; | |||
| $compiler = "gfortran"; | |||
| $vendor = GFORTRAN; | |||
| $bu = "_"; | |||
| $openmp = ""; | |||
| } | |||
| ;; | |||
| 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 | |||
| } | |||
| $data = `which $compiler_bin > /dev/null 2> /dev/null`; | |||
| 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 (!$?) { | |||
| if [ -n "$link" ]; then | |||
| $binary = $ENV{"BINARY"}; | |||
| link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'` | |||
| $openmp = "" if $ENV{USE_OPENMP} != 1; | |||
| link=`echo "$link" | sed 's/\-R[[:space:]]*/\-rpath\%/g'` | |||
| if ($binary == 32) { | |||
| $link = `$compiler $openmp -m32 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| if ($?) { | |||
| $link = `$compiler $openmp -q32 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| # for AIX | |||
| if ($?) { | |||
| $link = `$compiler $openmp -maix32 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| #For gfortran MIPS | |||
| if ($?) { | |||
| $mips_data = `$compiler_bin -E -dM - < /dev/null`; | |||
| if ($mips_data =~ /_MIPS_ISA_MIPS64/) { | |||
| $link = `$compiler $openmp -mabi=n32 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } else { | |||
| $link = `$compiler $openmp -mabi=32 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| } | |||
| $binary = "" if ($?); | |||
| } | |||
| link=`echo "$link" | sed 's/\-rpath[[:space:]]+/\-rpath\%/g'` | |||
| if ($binary == 64) { | |||
| $link = `$compiler $openmp -m64 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| if ($?) { | |||
| $link = `$compiler $openmp -q64 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| # for AIX | |||
| if ($?) { | |||
| $link = `$compiler $openmp -maix64 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| #For gfortran MIPS | |||
| if ($?) { | |||
| $link = `$compiler $openmp -mabi=64 -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| #For nagfor | |||
| if ($?) { | |||
| $link = `$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| $binary = "" if ($?); | |||
| } | |||
| if ($binary eq "") { | |||
| $link = `$compiler $openmp -v ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| } | |||
| link=`echo "$link" | sed 's/\-rpath-link[[:space:]]+/\-rpath-link\%/g'` | |||
| if ( $vendor eq "NAG") { | |||
| $link = `$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`; | |||
| } | |||
| $linker_L = ""; | |||
| $linker_l = ""; | |||
| $linker_a = ""; | |||
| if ($link ne "") { | |||
| $link =~ s/\-Y\sP\,/\-Y/g; | |||
| $link =~ s/\-R\s*/\-rpath\%/g; | |||
| $link =~ s/\-rpath\s+/\-rpath\%/g; | |||
| $link =~ s/\-rpath-link\s+/\-rpath-link\%/g; | |||
| @flags = split(/[\s\,\n]/, $link); | |||
| flags=`echo "$link" | tr ',\n' ' '` | |||
| # remove leading and trailing quotes from each flag. | |||
| @flags = map {s/^['"]|['"]$//g; $_} @flags; | |||
| foreach $flags (@flags) { | |||
| if ( | |||
| ($flags =~ /^\-L/) | |||
| && ($flags !~ /^-LIST:/) | |||
| && ($flags !~ /^-LANG:/) | |||
| ) { | |||
| $linker_L .= $flags . " "; | |||
| } | |||
| if ($flags =~ /^\-Y/) { | |||
| next if ($hostos eq 'SunOS'); | |||
| $linker_L .= "-Wl,". $flags . " "; | |||
| } | |||
| if ($flags =~ /^\--exclude-libs/) { | |||
| $linker_L .= "-Wl,". $flags . " "; | |||
| $flags=""; | |||
| } | |||
| if ($flags =~ /^\-rpath\%/) { | |||
| $flags =~ s/\%/\,/g; | |||
| $linker_L .= "-Wl,". $flags . " " ; | |||
| } | |||
| if ($flags =~ /^\-rpath-link\%/) { | |||
| $flags =~ s/\%/\,/g; | |||
| $linker_L .= "-Wl,". $flags . " " ; | |||
| } | |||
| if ($flags =~ /-lgomp/ && $ENV{"CC"} =~ /clang/) { | |||
| $flags = "-lomp"; | |||
| } | |||
| if ( | |||
| ($flags =~ /^\-l/) | |||
| && ($flags !~ /ibrary/) | |||
| && ($flags !~ /gfortranbegin/) | |||
| && ($flags !~ /flangmain/) | |||
| && ($flags !~ /frtbegin/) | |||
| && ($flags !~ /pathfstart/) | |||
| && ($flags !~ /crt[0-9]/) | |||
| && ($flags !~ /gcc/) | |||
| && ($flags !~ /user32/) | |||
| && ($flags !~ /kernel32/) | |||
| && ($flags !~ /advapi32/) | |||
| && ($flags !~ /shell32/) | |||
| && ($flags !~ /omp/ || ($vendor !~ /PGI/ && $vendor !~ /FUJITSU/ && $flags =~ /omp/)) | |||
| && ($flags !~ /[0-9]+/ || ($vendor == FUJITSU && $flags =~ /^-lfj90/)) | |||
| && ($flags !~ /^\-l$/) | |||
| ) { | |||
| $linker_l .= $flags . " "; | |||
| } | |||
| if ( $flags =~ /quickfit.o/ && $vendor == NAG) { | |||
| $linker_l .= $flags . " "; | |||
| } | |||
| if ( $flags =~ /safefit.o/ && $vendor == NAG) { | |||
| $linker_l .= $flags . " "; | |||
| } | |||
| if ( $flags =~ /thsafe.o/ && $vendor == NAG) { | |||
| $linker_l .= $flags . " "; | |||
| } | |||
| $linker_a .= $flags . " " if $flags =~ /\.a$/; | |||
| } | |||
| } | |||
| if ($vendor eq "FLANG"){ | |||
| $linker_a .= "-lflang" | |||
| } | |||
| open(MAKEFILE, ">> $makefile") || die "Can't append $makefile"; | |||
| open(CONFFILE, ">> $config" ) || die "Can't append $config"; | |||
| print MAKEFILE "F_COMPILER=$vendor\n"; | |||
| print MAKEFILE "FC=$compiler\n"; | |||
| print MAKEFILE "BU=$bu\n" if $bu ne ""; | |||
| print MAKEFILE "NOFORTRAN=1\n" if $nofortran == 1; | |||
| print CONFFILE "#define BUNDERSCORE\t$bu\n" if $bu ne ""; | |||
| print CONFFILE "#define NEEDBUNDERSCORE\t1\n" if $bu ne ""; | |||
| print CONFFILE "#define NEED2UNDERSCORES\t1\n" if $need2bu ne ""; | |||
| print MAKEFILE "NEED2UNDERSCORES=1\n" if $need2bu ne ""; | |||
| if (($linker_l ne "") || ($linker_a ne "")) { | |||
| print MAKEFILE "FEXTRALIB=$linker_L $linker_l $linker_a\n"; | |||
| } | |||
| #@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 | |||
| close(MAKEFILE); | |||
| close(CONFFILE); | |||
| @@ -1,22 +1,22 @@ | |||
| #!/usr/bin/env perl | |||
| #!/bin/sh | |||
| $count = 0; | |||
| count=0 | |||
| foreach (@ARGV) { | |||
| print "#define\tinterface_", $_, "\t\t", $count, "\n"; | |||
| $count ++; | |||
| } | |||
| for arg in "$@"; do | |||
| printf "#define\tinterface_%s\t\t%d\n" "$arg" "$count" | |||
| count=`expr $count + 1` | |||
| done | |||
| print "#ifdef USE_FUNCTABLE\n"; | |||
| printf "#ifdef USE_FUNCTABLE\n" | |||
| print "#define MAX_PROF_TABLE ", $count, "\n"; | |||
| printf "#define MAX_PROF_TABLE %d\n" "$count" | |||
| print "static char *func_table[] = {\n"; | |||
| printf "static char *func_table[] = {\n" | |||
| foreach (@ARGV) { | |||
| print "\"", $_, "\",\n"; | |||
| } | |||
| for arg in "$@"; do | |||
| printf "\"%s\",\n" "$arg" | |||
| done | |||
| print "};\n"; | |||
| print "#endif\n"; | |||
| printf "};\n" | |||
| printf "#endif\n" | |||