1
1
openmpi/config/f77_check.m4
Jeff Squyres f28095e632 Bunches of fixes for Fortran support:
- Fully support REAL*N, INTEGER*N, and COMPLEX*N in the MPI_Op
  reduction operations.
- Update ddt to fully support these types as well, to include using
  the results of sizes and alignments determined by configure
- Discover the goodness of m4 and consolidate a LOT of configure code
  (i.e., remove a lot of essentially duplicated code and
  m4-subroutine-ize it).  The big kicker was figuring out how to
  parameterize AC_DEFINE_UNQUOTED, which you can do if you use m4
  properly.
- If we don't support a given INTEGER*N, REAL*N, or COMPLEX*N, don't
  error.  Just set the right flags so that we don't support them in
  the MPI layer.

This commit was SVN r5788.
2005-05-19 23:56:02 +00:00

117 строки
4.0 KiB
Bash

dnl -*- shell-script -*-
dnl
dnl Copyright (c) 2004-2005 The Trustees of Indiana University.
dnl All rights reserved.
dnl Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
dnl All rights reserved.
dnl Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
dnl University of Stuttgart. All rights reserved.
dnl Copyright (c) 2004-2005 The Regents of the University of California.
dnl All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
dnl
dnl $HEADER$
dnl
AC_DEFUN([OMPI_F77_CHECK],[
# Determine a bunch of things about each Fortran datatype:
# - whether the compiler supports it or not (sometimes an error if it
# does not exist, sometimes not)
# - what the size of it is
# - if it equals the expected size (if there is an expected size)
# - what its alignment is
# - what the C type corresponding to it is (sometimes an error if one
# cannot be found, sometimes not)
#
# Arguments
# 1. Fortran type name
# 2. All-caps version of #define name
# 3. All-lower version of #define name
# 4. Required to have a corresponding C type or not (yes or no)
# 5. Space-delineated list of C types to search (:'s are replaced with
# spaces, e.g., "long:long" is changed to a single type, "long
# long")
# 6. What the expected size is (or -1 if no expected size)
ofc_c_required="$4"
ofc_c_search_types="$5"
ofc_expected_size="$6"
# Some defaults
ofc_have_type=0
ofc_type_size=$ac_cv_sizeof_int
ofc_type_alignment=$ac_cv_sizeof_int
ofc_c_type=ompi_fortran_bogus_type_t
# Only check if we actually want the F77 bindings / have a F77
# compiler. This allows us to call this macro, even if there is no
# F77 compiler. If we have no f77 compiler, then just set a bunch of
# defaults.
if test "$OMPI_WANT_F77_BINDINGS" = "1"; then
OMPI_F77_CHECK_TYPE([$1], [ofc_have_type])
else
AC_MSG_CHECKING([if FORTRAN compiler supports $1])
AC_MSG_RESULT([skipped])
fi
if test "$ofc_have_type" = "1"; then
# What is the size of this type?
OMPI_F77_GET_SIZEOF([$1], [ofc_type_size])
if test "$ofc_expected_size" != "-1" -a "$ofc_type_size" != "$ofc_expected_size"; then
AC_MSG_WARN([*** Fortran $1 does not have expected size!])
AC_MSG_WARN([*** Expected $ofc_expected_size, got $ofc_type_size])
AC_MSG_WARN([*** Disabling MPI support for Fortran $1])
ofc_have_type=0
else
# Look for a corresponding C type (will abort by itself if the
# type isn't found and we need it)
if test "$ofc_c_search_types" != ""; then
OMPI_FIND_TYPE([Fortran $1], [$ofc_c_search_types],
[$ofc_c_required], [$ofc_type_size], [ofc_c_type])
if test -z "$ofc_c_type"; then
ofc_have_type=0
fi
fi
# Get the alignment of the type
if test "$ofc_have_type" = "1"; then
OMPI_F77_GET_ALIGNMENT([$1], [ofc_type_alignment])
fi
fi
fi
# We always need these defines -- even if we don't have a given type,
# there are some places in the code where we have to have *something*.
AC_DEFINE_UNQUOTED([OMPI_HAVE_FORTRAN_$2], [$ofc_have_type],
[Whether we have FORTRAN $1 or not])
AC_DEFINE_UNQUOTED([OMPI_SIZEOF_FORTRAN_$2], [$ofc_type_size],
[Size of FORTRAN $1])
AC_DEFINE_UNQUOTED([OMPI_ALIGNMENT_FORTRAN_$2], [$ofc_type_alignment],
[Alignment of FORTRAN $1])
if test "$ofc_c_search_types" != ""; then
AC_DEFINE_UNQUOTED([ompi_fortran_$3_t], [$ofc_c_type],
[C type corresponding to FORTRAN $1])
fi
# Save some in shell variables for later use (e.g., need
# OMPI_SIZEOF_FORTRAN_INTEGER in OMPI_F77_GET_FORTRAN_HANDLE_MAX)
OMPI_FORTRAN_$2_C_TYPE=$ofc_c_type
OMPI_SIZEOF_FORTRAN_$2=$ofc_type_size
# Clean up
unset ofc_have_type ofc_type_size ofc_type_alignment ofc_c_type ofc_bogus
unset ofc_fortran_required ofc_c_required ofc_c_search_types ofc_expected_size
])dnl