1# ===========================================================================
2#      http://www.gnu.org/software/autoconf-archive/ax_prog_cxx_mpi.html
3# ===========================================================================
4#
5# SYNOPSIS
6#
7#   AX_PROG_CXX_MPI([MPI-WANTED-TEST[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]])
8#
9# DESCRIPTION
10#
11#   This macro tries to find out how to compile C++ programs that use MPI
12#   (Message Passing Interface), a standard API for parallel process
13#   communication (see http://www-unix.mcs.anl.gov/mpi/).  The macro has to
14#   be used instead of the standard macro AC_PROG_CXX and will replace the
15#   standard variable CXX with the found compiler.
16#
17#   MPI-WANTED-TEST is used to test whether MPI is actually wanted by the
18#   user. If MPI-WANTED_TEST is omitted or if it succeeds, the macro will
19#   try to find out how to use MPI, if it fails, the macro will call
20#   AC_PROG_CC to find a standard C compiler instead.
21#
22#   When MPI is found, ACTION-IF-FOUND will be executed, if MPI is not found
23#   (or MPI-WANTED-TEST fails) ACTION-IF-NOT-FOUND is executed. If
24#   ACTION-IF-FOUND is not set, the macro will define HAVE_MPI.
25#
26#   The following example demonstrates usage of the macro:
27#
28#     # If --with-mpi=auto is used, try to find MPI, but use standard C compiler if it is not found.
29#     # If --with-mpi=yes is used, try to find MPI and fail if it isn't found.
30#     # If --with-mpi=no is used, use a standard C compiler instead.
31#     AC_ARG_WITH(mpi, [AS_HELP_STRING([--with-mpi],
32#         [compile with MPI (parallelization) support. If none is found,
33#         MPI is not used. Default: auto])
34#     ],,[with_mpi=auto])
35#
36#     AX_PROG_CXX_MPI([test x"$with_mpi" != xno],[use_mpi=yes],[
37#       use_mpi=no
38#       if test x"$with_mpi" = xyes; then
39#         AC_MSG_FAILURE([MPI compiler requested, but couldn't use MPI.])
40#       else
41#         AC_MSG_WARN([No MPI compiler found, won't use MPI.])
42#       fi
43#     ])
44#
45# LICENSE
46#
47#   Copyright (c) 2010,2011 Olaf Lenz <olenz@icp.uni-stuttgart.de>
48#
49#   This program is free software: you can redistribute it and/or modify it
50#   under the terms of the GNU General Public License as published by the
51#   Free Software Foundation, either version 3 of the License, or (at your
52#   option) any later version.
53#
54#   This program is distributed in the hope that it will be useful, but
55#   WITHOUT ANY WARRANTY; without even the implied warranty of
56#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
57#   Public License for more details.
58#
59#   You should have received a copy of the GNU General Public License along
60#   with this program. If not, see <http://www.gnu.org/licenses/>.
61#
62#   As a special exception, the respective Autoconf Macro's copyright owner
63#   gives unlimited permission to copy, distribute and modify the configure
64#   scripts that are the output of Autoconf when processing the Macro. You
65#   need not follow the terms of the GNU General Public License when using
66#   or distributing such scripts, even though portions of the text of the
67#   Macro appear in them. The GNU General Public License (GPL) does govern
68#   all other use of the material that constitutes the Autoconf Macro.
69#
70#   This special exception to the GPL applies to versions of the Autoconf
71#   Macro released by the Autoconf Archive. When you make and distribute a
72#   modified version of the Autoconf Macro, you may extend this special
73#   exception to the GPL to apply to your modified version as well.
74
75#serial 1
76
77AC_DEFUN([AX_PROG_CXX_MPI], [
78AC_PREREQ(2.50)
79AC_BEFORE([$0],[AC_PROG_CXX])
80
81# Check for compiler
82# Needs to be split off into an extra macro to ensure right expansion
83# order.
84AC_REQUIRE([_AX_PROG_CXX_MPI],[_AX_PROG_CXX_MPI([$1])])
85
86AS_IF([test x"$_ax_prog_cxx_mpi_mpi_wanted" = xno],
87  [ _ax_prog_cxx_mpi_mpi_found=no ],
88  [
89    AC_LANG_PUSH([C++])
90
91    # test whether MPI::Init is available
92    # We do not use AC_SEARCH_LIBS here, as it caches its outcome and
93    # thus disallows corresponding calls in the other AX_PROG_*_MPI
94    # macros.
95    for lib in NONE mpi mpich; do
96      save_LIBS=$LIBS
97      if test x"$lib" = xNONE; then
98        AC_MSG_CHECKING([for function MPI::Init])
99      else
100        AC_MSG_CHECKING([for function MPI::Init in -l$lib])
101        LIBS="-l$lib $LIBS"
102      fi
103      AC_LINK_IFELSE([
104        AC_LANG_PROGRAM([
105namespace MPI {
106char Init();
107};
108using MPI::Init;],[MPI::Init;])],
109        [ _ax_prog_cxx_mpi_mpi_found=yes ],
110        [ _ax_prog_cxx_mpi_mpi_found=no ])
111      AC_MSG_RESULT($_ax_prog_cxx_mpi_mpi_found)
112      if test "x$_ax_prog_cxx_mpi_mpi_found" = "xyes"; then
113        break;
114      fi
115      LIBS=$save_LIBS
116    done
117
118    # Check for header
119    AS_IF([test x"$_ax_prog_cxx_mpi_mpi_found" = xyes], [
120      AC_MSG_CHECKING([for mpi.h])
121      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <mpi.h>])],
122        [ AC_MSG_RESULT(yes)],
123        [ AC_MSG_RESULT(no)
124         _ax_prog_cxx_mpi_mpi_found=no
125      ])
126    ])
127    AC_LANG_POP([C++])
128])
129
130# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
131AS_IF([test x"$_ax_prog_cxx_mpi_mpi_found" = xyes], [
132        ifelse([$2],,[AC_DEFINE(HAVE_MPI,1,[Define if you have the MPI library.])],[$2])
133        :
134],[
135        $3
136        :
137])
138
139])dnl AX_PROG_CXX_MPI
140
141dnl _AX_PROG_CXX_MPI is an internal macro required by AX_PROG_CXX_MPI.
142dnl To ensure the right expansion order, the main function AX_PROG_CXX_MPI
143dnl has to be split into two parts.
144dnl
145dnl Known MPI C++ compilers:
146dnl  mpic++
147dnl  mpicxx
148dnl  mpiCC
149dnl  sxmpic++     NEC SX
150dnl  hcp
151dnl  mpxlC_r
152dnl  mpxlC
153dnl  mpixlcxx_r
154dnl  mpixlcxx
155dnl  mpg++
156dnl  mpc++
157dnl  mpCC
158dnl  cmpic++
159dnl  mpiFCC       Fujitsu
160dnl  CC
161dnl
162AC_DEFUN([__AX_PROG_CXX_MPI], [
163  AC_ARG_VAR(MPICXX,[MPI C++ compiler command])
164  ifelse([$1],,[_ax_prog_cxx_mpi_mpi_wanted=yes],[
165    AC_MSG_CHECKING([whether to compile using MPI])
166    if $1; then
167      _ax_prog_cxx_mpi_mpi_wanted=yes
168    else
169      _ax_prog_cxx_mpi_mpi_wanted=no
170    fi
171    AC_MSG_RESULT($_ax_prog_cxx_mpi_mpi_wanted)
172  ])
173  if test x"$_ax_prog_cxx_mpi_mpi_wanted" = xyes; then
174    if test -z "$CXX" && test -n "$MPICXX"; then
175      CXX="$MPICXX"
176    elif  test -z "$CXX"; then
177      AC_CHECK_TOOLS([CXX], [mpic++ mpicxx mpiCC sxmpic++ hcp mpxlC_r mpxlC mpixlcxx_r mpixlcxx mpg++ mpc++ mpCC cmpic++ mpiFCC CCicpc pgCC pathCC sxc++ xlC_r xlC bgxlC_r bgxlC openCC sunCC crayCC g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC])
178    fi
179  fi
180])dnl _AX_PROG_CXX_MPI
181
182AC_DEFUN([_AX_PROG_CXX_MPI], [
183  AC_REQUIRE([__AX_PROG_CXX_MPI],[__AX_PROG_CXX_MPI([$1])])
184dnl   echo "---------CXX 3-----------------------"
185  AC_PROG_CXX
186
187
188dnl   echo "---------CXX 4-----------------------"
189])
190