mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
14234fc01a
Attempted Bug Fix Description: Some machines (Cray T3E, need you ask?) use the ``-p'' flag for enabling double precision. This breaks our Fortran interface. Solution: Put this test last. However, the T3E apparently doesn't need modules, so we may have to resort to a better "fix" than this in the future. Platforms tested: T3E
378 lines
9.6 KiB
Plaintext
378 lines
9.6 KiB
Plaintext
dnl -------------------------------------------------------------------------
|
|
dnl -------------------------------------------------------------------------
|
|
dnl
|
|
dnl Macros for HDF5 Fortran
|
|
dnl
|
|
dnl Copyright (C) 2000 National Center for Supercomputing Applications.
|
|
dnl All rights reserved.
|
|
dnl -------------------------------------------------------------------------
|
|
dnl -------------------------------------------------------------------------
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_PROG_F9X
|
|
dnl
|
|
dnl Check for a Fortran 9X compiler.
|
|
dnl
|
|
AC_DEFUN(AC_PROG_F9X,
|
|
[AC_CHECK_PROGS(F9X, f90 pgf90 f95 g95)
|
|
test -z "$CC" && AC_MSG_ERROR([no acceptable f9X compiler found in \$PATH])
|
|
|
|
AC_PROG_F9X_WORKS
|
|
AC_PROG_F9X_GNU
|
|
|
|
if test $ac_cv_prog_g9x = yes; then
|
|
G9X=yes
|
|
dnl Check whether -g works, even if FFLAGS is set, in case the package
|
|
dnl plays around with FFLAGS (such as to build both debugging and
|
|
dnl normal versions of a library), tasteless as that idea is.
|
|
ac_test_FFLAGS="${FFLAGS+set}"
|
|
ac_save_FFLAGS="$FFLAGS"
|
|
FFLAGS=
|
|
AC_PROG_F9X_G
|
|
if test "$ac_test_FFLAGS" = set; then
|
|
FFLAGS="$ac_save_FFLAGS"
|
|
elif test $ac_cv_prog_f9x_g = yes; then
|
|
FFLAGS="-g -O2"
|
|
else
|
|
FFLAGS="-O2"
|
|
fi
|
|
else
|
|
G9X=
|
|
test "${FFLAGS+set}" = set || FFLAGS="-g"
|
|
fi
|
|
])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_TRY_F9X_COMPILER()
|
|
dnl
|
|
dnl It would be nice if the compiler actually works.
|
|
dnl
|
|
AC_DEFUN(AC_TRY_F9X_COMPILER, [
|
|
cat > conftest.$ac_ext << EOF
|
|
[$1]
|
|
EOF
|
|
if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
|
|
[$2]=yes
|
|
# If we can't run a trivial program, we are probably using a cross compiler.
|
|
if (./conftest; exit) 2>/dev/null; then
|
|
[$3]=no
|
|
else
|
|
[$3]=yes
|
|
fi
|
|
else
|
|
echo "configure: failed program was:" >&AC_FD_CC
|
|
cat conftest.$ac_ext >&AC_FD_CC
|
|
[$2]=no
|
|
fi
|
|
rm -fr conftest*
|
|
])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_LANG_F9X_WORKS()
|
|
dnl
|
|
dnl It would be nice if the compiler actually works.
|
|
dnl
|
|
AC_DEFUN(AC_PROG_F9X_WORKS, [
|
|
AC_MSG_CHECKING([whether the Fortran 9X compiler ($F9X $FFLAGS $LDFLAGS) works])
|
|
AC_LANG_SAVE
|
|
AC_LANG_FORTRAN9X
|
|
AC_TRY_F9X_COMPILER([
|
|
program conftest
|
|
end
|
|
], ac_cv_prog_f9x_works, ac_cv_prog_f9x_cross)
|
|
AC_LANG_RESTORE
|
|
AC_MSG_RESULT($ac_cv_prog_f9x_works)
|
|
if test $ac_cv_prog_f9x_works = no; then
|
|
AC_MSG_ERROR([installation or configuration problem: Fortran 9X compiler cannot create executables.])
|
|
fi
|
|
AC_MSG_CHECKING([whether the Fortran 9X compiler ($F9X $FFLAGS $LDFLAGS) is a cross-compiler])
|
|
AC_MSG_RESULT($ac_cv_prog_f9x_cross)
|
|
cross_compiling=$ac_cv_prog_f9x_cross
|
|
])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_LANG_FORTRAN9X()
|
|
dnl
|
|
dnl Generic macro to setup the Fortran 9X specific env variables.
|
|
dnl
|
|
AC_DEFUN(AC_LANG_FORTRAN9X, [
|
|
define([AC_LANG], [FORTRAN9X])
|
|
ac_ext=f90
|
|
ac_compile='${F9X-f90} -c $FFLAGS conftest.$ac_ext 1>&AC_FD_CC'
|
|
ac_link='${F9X-f90} -o conftest${ac_exeext} $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC'
|
|
cross_compiling=$ac_cv_prog_f9x_cross
|
|
])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_PROG_F9X_GNU
|
|
dnl
|
|
dnl Test whether for Fortran 9X compiler is `g95' (the GNU Fortran 95
|
|
dnl Compiler). This test depends on whether the Fortran 9X compiler
|
|
dnl can do CPP pre-processing.
|
|
dnl
|
|
AC_DEFUN(AC_PROG_F9X_GNU,
|
|
[AC_CACHE_CHECK(whether we are using GNU Fortran 95, ac_cv_prog_g9x,
|
|
[cat > conftest.fpp <<EOF
|
|
#ifdef __GNUC__
|
|
yes
|
|
#endif
|
|
EOF
|
|
if AC_TRY_COMMAND($F9X -E conftest.fpp) | egrep yes >/dev/null 2>&1; then
|
|
ac_cv_prog_g9x=yes
|
|
else
|
|
ac_cv_prog_g9x=no
|
|
fi])])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_PROG_F9X_G
|
|
dnl
|
|
dnl Test whether the Fortran 9X compiler can accept the `-g' option
|
|
dnl to enable debugging.
|
|
dnl
|
|
AC_DEFUN(AC_PROG_F9X_G,
|
|
[AC_CACHE_CHECK(whether $F9X accepts -g, ac_cv_prog_f9x_g,
|
|
[cat > conftest.f << EOF
|
|
program conftest
|
|
end
|
|
EOF
|
|
if test -z "`$F9X -g -c conftest.f 2>&1`"; then
|
|
ac_cv_prog_f9x_g=yes
|
|
else
|
|
ac_cv_prog_f9x_g=no
|
|
fi
|
|
rm -f conftest*
|
|
])])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_F9X_OPT_FLAGS()
|
|
dnl
|
|
dnl Check for optimizer flags the Fortran compiler can use.
|
|
dnl
|
|
AC_DEFUN(AC_F9X_OPT_FLAGS,
|
|
[AC_MSG_CHECKING([for $F9X optimizer flags])
|
|
AC_LANG_SAVE
|
|
AC_LANG_FORTRAN9X
|
|
|
|
for flags in "-fast" "-O3" "-O" "";do
|
|
cat > conftest.$ac_ext <<EOF
|
|
program main
|
|
end
|
|
EOF
|
|
ac_compile='${F9X-f90} -c $flag $FFLAGS conftest.$ac_ext 1>&AC_FD_CC'
|
|
if AC_TRY_EVAL(ac_compile); then
|
|
if grep 'passed to ld' conftest.out > /dev/null 2>&1; then :; else
|
|
FFLAGS="$FFLAGS $flags"
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if test -n "$flags"; then
|
|
echo "$flags" 1>&6
|
|
else
|
|
echo "none" 1>&6
|
|
fi
|
|
rm -f conftest*])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl AC_F9X_MODS()
|
|
dnl
|
|
dnl Check how F9X handles modules. This macro also checks which
|
|
dnl command-line option to use to include the module once it's built.
|
|
dnl
|
|
AC_DEFUN(AC_F9X_MODS,
|
|
[AC_MSG_CHECKING(what $F9X does with modules)
|
|
AC_LANG_SAVE
|
|
AC_LANG_FORTRAN9X
|
|
|
|
test -d conftestdir || mkdir conftestdir
|
|
cd conftestdir
|
|
rm -rf *
|
|
|
|
cat >conftest.$ac_ext <<EOF
|
|
module module
|
|
integer foo
|
|
end module module
|
|
EOF
|
|
|
|
eval $ac_compile
|
|
modfiles=""
|
|
|
|
for f in conftest.o module.mod MODULE.mod; do
|
|
test -f $f && modfiles="$f"
|
|
done
|
|
|
|
echo $modfiles 6>&1
|
|
if test "$modfiles" = file.o; then
|
|
echo $ac_n "checking whether $F9X -em is saner""... $ac_c" 1>&6
|
|
OLD_FFLAGS=$FFLAGS
|
|
FFLAGS="$FFLAGS -em"
|
|
eval $ac_compile
|
|
modfiles=""
|
|
for f in file.o module.mod MODULE.mod; do
|
|
test -f $f && modfiles="$f"
|
|
done
|
|
if test "$modfiles" = file.o;then
|
|
FFLAGS=$OLD_FFLAGS
|
|
echo no 6>&1
|
|
else
|
|
echo yes 6>&1
|
|
fi
|
|
fi
|
|
cd ..
|
|
|
|
AC_MSG_CHECKING(how $F9X finds modules)
|
|
|
|
for flag in "-M" "-I" "-p"; do
|
|
cat >conftest.$ac_ext <<EOF
|
|
program conftest
|
|
use module
|
|
end program conftest
|
|
EOF
|
|
|
|
ac_compile='${F9X-f90} $FFLAGS ${flag}conftestdir -c conftest.$ac_ext 1>&AC_FD_CC'
|
|
|
|
if AC_TRY_EVAL(ac_compile); then
|
|
F9XMODFLAG=$flag
|
|
break
|
|
fi
|
|
done
|
|
|
|
if test -n "$F9XMODFLAG"; then
|
|
echo $F9XMODFLAG 1>&6
|
|
else
|
|
echo unknown 1>&6
|
|
fi
|
|
AC_SUBST(F9XMODFLAG)
|
|
rm -rf conftest*])
|
|
|
|
dnl -------------------------------------------------------------------------
|
|
dnl -------------------------------------------------------------------------
|
|
dnl
|
|
dnl Possible future tests for the Fortran stuff...
|
|
dnl
|
|
dnl -------------------------------------------------------------------------
|
|
dnl -------------------------------------------------------------------------
|
|
dnl
|
|
dnl echo $ac_n "checking whether f90 real type has 12 digits of precision""... $ac_c" 1>&6
|
|
dnl cat >conftest.f90 <<'EOF'
|
|
dnl program conftest
|
|
dnl if (selected_real_kind(12) .eq. kind(0.0)) then
|
|
dnl print '(a)','YES'
|
|
dnl else
|
|
dnl print '(a)','NO'
|
|
dnl end if
|
|
dnl end program conftest
|
|
dnl EOF
|
|
dnl $ac_cv_prog_F90 $FFLAGS -o conftest conftest.f90 > /dev/null 2>&1
|
|
dnl if test "`./conftest | head -1`" = YES; then
|
|
dnl echo "yes" 1>&6
|
|
dnl AC_DEFINE(HIPREC)
|
|
dnl else
|
|
dnl echo "no" 1>&6
|
|
dnl fi
|
|
|
|
dnl echo $ac_n "checking whether f90 precision of default real type""... $ac_c" 1>&6
|
|
dnl cat >conftest.f90 <<'EOF'
|
|
dnl program conftest
|
|
dnl if (kind(0.0) .eq. selected_real_kind(12) .or.&
|
|
dnl &kind(0.0) .eq. selected_real_kind(6) ) then
|
|
dnl print '(a)','YES'
|
|
dnl else
|
|
dnl print '(a)','NO'
|
|
dnl end if
|
|
dnl end program conftest
|
|
dnl EOF
|
|
dnl $ac_cv_prog_F90 $FFLAGS -o conftest conftest.f90 > /dev/null 2>&1
|
|
dnl if test "`./conftest | head -1`" = YES; then
|
|
dnl echo "OK" 1>&6
|
|
dnl AC_DEFINE(REALOK)
|
|
dnl else
|
|
dnl echo "no" 1>&6
|
|
dnl fi
|
|
|
|
dnl echo $ac_n "checking accuracy of arithmetic""... $ac_c" 1>&6
|
|
dnl cat >conftest.f90 <<'EOF'
|
|
dnl program conftest
|
|
dnl integer, parameter :: double=selected_real_kind(12)
|
|
dnl real(double), parameter :: ulp=2.0_double**(-47)
|
|
dnl real(double), parameter :: ans=0.92699498904359955986_double
|
|
dnl real(double) :: x,y,z
|
|
dnl integer i
|
|
dnl x=0.0_double
|
|
dnl y=ulp
|
|
dnl do i=2,100
|
|
dnl z=x+y
|
|
dnl x=y
|
|
dnl y=z-int(z)
|
|
dnl end do
|
|
dnl if (y-ans .lt. ulp/2.0_double) then
|
|
dnl print '(a)','YES'
|
|
dnl else
|
|
dnl print '(a)','NO'
|
|
dnl end if
|
|
dnl end program conftest
|
|
dnl EOF
|
|
dnl $ac_cv_prog_F90 $FFLAGS -o conftest conftest.f90 > /dev/null 2>&1
|
|
dnl if test "`./conftest | head -1`" = YES; then
|
|
dnl echo "OK" 1>&6
|
|
dnl AC_DEFINE(ARITHOK)
|
|
dnl else
|
|
dnl echo "no" 1>&6
|
|
dnl fi
|
|
|
|
dnl echo $ac_n "checking whether int is the fastest way to truncate""... $ac_c" 1>&6
|
|
dnl cat >conftest.f90 <<'EOF'
|
|
dnl program conftest
|
|
dnl integer, parameter :: double=selected_real_kind(12)
|
|
dnl real(double), parameter :: ulp=2.0_double**(-47)
|
|
dnl real(double) :: x,y,z,ya,yb
|
|
dnl integer :: t0,t1,i,timea,timeb
|
|
dnl
|
|
dnl x=0.0_double
|
|
dnl y=ulp
|
|
dnl call system_clock(t0)
|
|
dnl do i=2,1000000
|
|
dnl z=x+y
|
|
dnl x=y
|
|
dnl y=z-int(z)
|
|
dnl end do
|
|
dnl ya=y
|
|
dnl call system_clock(t1)
|
|
dnl timea=t1-t0
|
|
dnl
|
|
dnl x=0.0_double
|
|
dnl y=ulp
|
|
dnl call system_clock(t0)
|
|
dnl do i=2,1000000
|
|
dnl z=x+y
|
|
dnl x=y
|
|
dnl if (z.ge.1.0_double) then
|
|
dnl y=z-1.0_double
|
|
dnl else
|
|
dnl y=z
|
|
dnl end if
|
|
dnl end do
|
|
dnl yb=y
|
|
dnl call system_clock(t1)
|
|
dnl timeb=t1-t0
|
|
dnl
|
|
dnl if (timea.lt.timeb) then
|
|
dnl print '(a)','YES'
|
|
dnl else
|
|
dnl print '(a)','NO'
|
|
dnl end if
|
|
dnl print *,ya,yb
|
|
dnl end program conftest
|
|
dnl EOF
|
|
dnl $ac_cv_prog_F90 $FFLAGS -o conftest conftest.f90 > /dev/null 2>&1
|
|
dnl if test "`./conftest | head -1`" = YES; then
|
|
dnl echo "yes" 1>&6
|
|
dnl AC_DEFINE(USEINT)
|
|
dnl else
|
|
dnl echo "no" 1>&6
|
|
dnl fi
|
|
dnl
|
|
dnl -------------------------------------------------------------------------
|
|
dnl -------------------------------------------------------------------------
|