dnl -*- shell-script -*-
dnl
dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
dnl                         University Research and Technology
dnl                         Corporation.  All rights reserved.
dnl Copyright (c) 2004-2005 The University of Tennessee and The University
dnl                         of Tennessee Research Foundation.  All rights
dnl                         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 (c) 2006-2010 Oracle and/or its affiliates.  All rights reserved.
dnl Copyright (c) 2009-2012 Cisco Systems, Inc.  All rights reserved.
dnl $COPYRIGHT$
dnl 
dnl Additional copyrights may follow
dnl 
dnl $HEADER$
dnl


# OMPI_SETUP_WRAPPER_INIT()
# -------------------------
# Setup wrapper compiler configuration information - should be called
# before the bulk of the tests that can affect the wrapper compilers
#
# Note that we keep the user-specified flags seperately because we
# don't want them to go through OPAL_UNIQ because that has resulted in
# unexpected behavior for the user in the past.
AC_DEFUN([OMPI_SETUP_WRAPPER_INIT],[
    WRAPPER_EXTRA_FCFLAGS=
    WRAPPER_EXTRA_FCFLAGS_PREFIX=
    USER_WRAPPER_EXTRA_FCFLAGS=
    USER_WRAPPER_EXTRA_FCLAGS_PREFIX=

    AC_ARG_WITH([wrapper-fcflags], 
        [AC_HELP_STRING([--with-wrapper-fcflags],
             [Extra flags to add to FCFLAGS when using mpifort])])
    if test "$with_wrapper_fcflags" = "yes" -o "$with_wrapper_fcflags" = "no"; then
        AC_MSG_ERROR([--with-wrapper-fcflags must have an argument.  Aborting])
    elif test ! -z "$with_wrapper_fcflags" ; then
        USER_WRAPPER_EXTRA_FCFLAGS="$with_wrapper_fcflags"
    fi

    AC_ARG_WITH([wrapper-fcflags-prefix], 
        [AC_HELP_STRING([--with-wrapper-fcflags-prefix],
             [Extra flags (before user flags) to add to FCFLAGS when using mpifort])])
    if test "$with_wrapper_fcflags_prefix" = "yes" -o "$with_wrapper_fcflags_prefix" = "no"; then
        AC_MSG_ERROR([--with-wrapper-fcflags-prefix must have an argument.  Aborting])
    elif test ! -z "$with_wrapper_fcflags_prefix" ; then
        USER_WRAPPER_EXTRA_FCFLAGS_PREFIX="$with_wrapper_fcflags_prefix"
    fi

])

AC_DEFUN([_OMPI_SETUP_ORTE_WRAPPERS],[
    AC_MSG_CHECKING([for OMPI CPPFLAGS])
    OMPI_WRAPPER_EXTRA_CPPFLAGS="$ORTE_WRAPPER_EXTRA_CPPFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CPPFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CPPFLAGS])

    AC_MSG_CHECKING([for OMPI CFLAGS])
    OMPI_WRAPPER_EXTRA_CFLAGS="$ORTE_WRAPPER_EXTRA_CFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CFLAGS])

    AC_MSG_CHECKING([for OMPI CFLAGS_PREFIX])
    OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX="$ORTE_WRAPPER_EXTRA_CFLAGS_PREFIX"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX])

    AC_MSG_CHECKING([for OMPI CXXFLAGS])
    OMPI_WRAPPER_EXTRA_CXXFLAGS="$ORTE_WRAPPER_EXTRA_CXXFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CXXFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CXXFLAGS])

    AC_MSG_CHECKING([for OMPI CXXFLAGS_PREFIX])
    OMPI_WRAPPER_EXTRA_CXXFLAGS_PREFIX="$ORTE_WRAPPER_EXTRA_CXXFLAGS_PREFIX"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CXXFLAGS_PREFIX])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CXXFLAGS_PREFIX])

    AC_MSG_CHECKING([for OMPI FCFLAGS])
    OMPI_WRAPPER_EXTRA_FCFLAGS="$WRAPPER_EXTRA_FCFLAGS $USER_WRAPPER_EXTRA_FCFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_FCFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_FCFLAGS])

    AC_MSG_CHECKING([for OMPI FCFLAGS_PREFIX])
    OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX="$WRAPPER_EXTRA_FCFLAGS_PREFIX $USER_WRAPPER_EXTRA_FCFLAGS_PREFIX"
    AC_SUBST([OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX])

    AC_MSG_CHECKING([for OMPI LDFLAGS])
    OMPI_WRAPPER_EXTRA_LDFLAGS="$ompi_WRAPPER_EXTRA_LDFLAGS $ORTE_WRAPPER_EXTRA_LDFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_LDFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_LDFLAGS])

    AC_MSG_CHECKING([for OMPI LIBS])
    OMPI_WRAPPER_EXTRA_LIBS="$ompi_WRAPPER_EXTRA_LIBS $ORTE_WRAPPER_EXTRA_LIBS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_LIBS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_LIBS])

    AC_MSG_CHECKING([for OMPI extra include dirs])
    OMPI_WRAPPER_EXTRA_INCLUDES="$ORTE_WRAPPER_EXTRA_INCLUDES"
    AC_SUBST([OMPI_WRAPPER_EXTRA_INCLUDES])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_INCLUDES])
])

AC_DEFUN([_OMPI_SETUP_OPAL_WRAPPERS],[
    AC_MSG_CHECKING([for OMPI CPPFLAGS])
    OMPI_WRAPPER_EXTRA_CPPFLAGS="$OPAL_WRAPPER_EXTRA_CPPFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CPPFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CPPFLAGS])

    AC_MSG_CHECKING([for OMPI CFLAGS])
    OMPI_WRAPPER_EXTRA_CFLAGS="$OPAL_WRAPPER_EXTRA_CFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CFLAGS])

    AC_MSG_CHECKING([for OMPI CFLAGS_PREFIX])
    OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX="$OPAL_WRAPPER_EXTRA_CFLAGS_PREFIX"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX])

    AC_MSG_CHECKING([for OMPI CXXFLAGS])
    OMPI_WRAPPER_EXTRA_CXXFLAGS="$OPAL_WRAPPER_EXTRA_CXXFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CXXFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CXXFLAGS])

    AC_MSG_CHECKING([for OMPI CXXFLAGS_PREFIX])
    OMPI_WRAPPER_EXTRA_CXXFLAGS_PREFIX="$OPAL_WRAPPER_EXTRA_CXXFLAGS_PREFIX"
    AC_SUBST([OMPI_WRAPPER_EXTRA_CXXFLAGS_PREFIX])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_CXXFLAGS])

    AC_MSG_CHECKING([for OMPI FCFLAGS])
    OMPI_WRAPPER_EXTRA_FCFLAGS="$WRAPPER_EXTRA_FCFLAGS $USER_WRAPPER_EXTRA_FCFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_FCFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_FCFLAGS])

    AC_MSG_CHECKING([for OMPI FCFLAGS_PREFIX])
    OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX="$WRAPPER_EXTRA_FCFLAGS_PREFIX $USER_WRAPPER_EXTRA_FCFLAGS_PREFIX"
    AC_SUBST([OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX])

    AC_MSG_CHECKING([for OMPI LDFLAGS])
    OMPI_WRAPPER_EXTRA_LDFLAGS="$ompi_WRAPPER_EXTRA_LDFLAGS $OPAL_WRAPPER_EXTRA_LDFLAGS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_LDFLAGS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_LDFLAGS])

    AC_MSG_CHECKING([for OMPI LIBS])
    OMPI_WRAPPER_EXTRA_LIBS="$ompi_WRAPPER_EXTRA_LIBS $OPAL_WRAPPER_EXTRA_LIBS"
    AC_SUBST([OMPI_WRAPPER_EXTRA_LIBS])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_LIBS])

    AC_MSG_CHECKING([for OMPI extra include dirs])
    OMPI_WRAPPER_EXTRA_INCLUDES="$OPAL_WRAPPER_EXTRA_INCLUDES"
    AC_SUBST([OMPI_WRAPPER_EXTRA_INCLUDES])
    AC_MSG_RESULT([$OMPI_WRAPPER_EXTRA_INCLUDES])
])

AC_DEFUN([OMPI_SETUP_WRAPPER_FINAL],[
    OPAL_UNIQ([WRAPPER_EXTRA_FCFLAGS])
    OPAL_UNIQ([WRAPPER_EXTRA_FCFLAGS_PREFIX])

    OPAL_UNIQ([ompi_WRAPPER_EXTRA_LDFLAGS])
    OPAL_UNIQ([ompi_WRAPPER_EXTRA_LIBS])

    m4_ifdef([project_orte], [_OMPI_SETUP_ORTE_WRAPPERS], [_OMPI_SETUP_OPAL_WRAPPERS])

    # language binding support.  C++ is a bit different, as the
    # compiler should work even if there is no MPI C++ bindings
    # support.  However, we do want it to fail if there is no C++
    # compiler.
    if test "$WANT_MPI_CXX_SUPPORT" = "1" ; then
        OMPI_WRAPPER_CXX_LIB="-lmpi_cxx"
        OMPI_WRAPPER_CXX_REQUIRED_FILE=""
    elif test "$CXX" = "none"; then
        OMPI_WRAPPER_CXX_LIB=""
        OMPI_WRAPPER_CXX_REQUIRED_FILE="not supported"
    else
        OMPI_WRAPPER_CXX_LIB=""
        OMPI_WRAPPER_CXX_REQUIRED_FILE=""
    fi
    AC_SUBST([OMPI_WRAPPER_CXX_LIB])
    AC_SUBST([OMPI_WRAPPER_CXX_REQUIRED_FILE])

    if test "$OMPI_WANT_FORTRAN_BINDINGS" = "1" ; then
        OMPI_WRAPPER_FORTRAN_REQUIRED_FILE=""
    else
        OMPI_WRAPPER_FORTRAN_REQUIRED_FILE="not supported"
    fi
    AC_SUBST([OMPI_WRAPPER_FORTRAN_REQUIRED_FILE])

    # For script-based wrappers that don't do relocatable binaries.
    # Don't use if you don't have to.
    exec_prefix_save="${exec_prefix}"
    test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
    eval "OMPI_WRAPPER_INCLUDEDIR=\"${includedir}\""
    eval "OMPI_WRAPPER_LIBDIR=\"${libdir}\""
    exec_prefix="${exec_prefix_save}"
    AC_SUBST([OMPI_WRAPPER_INCLUDEDIR])
    AC_SUBST([OMPI_WRAPPER_LIBDIR])

    # compatibility defines that will eventually go away
    WRAPPER_EXTRA_FCFLAGS="$OMPI_WRAPPER_EXTRA_FCFLAGS"
    WRAPPER_EXTRA_FCFLAGS_PREFIX="$OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX"
    AC_SUBST([WRAPPER_EXTRA_FCFLAGS])
    AC_SUBST([WRAPPER_EXTRA_FCFLAGS_PREFIX])

    AC_DEFINE_UNQUOTED(WRAPPER_EXTRA_FCFLAGS, "$WRAPPER_EXTRA_FCFLAGS",
        [Additional FCFLAGS to pass through the wrapper compilers])
    AC_DEFINE_UNQUOTED(WRAPPER_EXTRA_FCFLAGS_PREFIX, "$WRAPPER_EXTRA_FCFLAGS_PREFIX",
        [Additional FCFLAGS to pass through the wrapper compilers])


    # if wrapper compilers were requested, set the ompi one up
    if test "$WANT_SCRIPT_WRAPPER_COMPILERS" = "1" ; then
        AC_CONFIG_FILES([ompi/tools/wrappers/ompi_wrapper_script],
                        [chmod +x ompi/tools/wrappers/ompi_wrapper_script])
    fi

])