Bug-fix: free all created portals.
[mpich.git] / confdb / aclocal_mpi.m4
1 dnl
2 dnl/*D 
3 dnl PAC_LIB_MPI - Check for MPI library
4 dnl
5 dnl Synopsis:
6 dnl PAC_LIB_MPI([action if found],[action if not found])
7 dnl
8 dnl Output Effect:
9 dnl
10 dnl Notes:
11 dnl Currently, only checks for lib mpi and mpi.h.  Later, we will add
12 dnl MPI_Pcontrol prototype (const int or not?).  
13 dnl
14 dnl Prerequisites:
15 dnl autoconf version 2.13 (for AC_SEARCH_LIBS)
16 dnl D*/
17 dnl Other tests to add:
18 dnl Version of MPI
19 dnl MPI-2 I/O?
20 dnl MPI-2 Spawn?
21 dnl MPI-2 RMA?
22 dnl PAC_LIB_MPI([found text],[not found text])
23 AC_DEFUN([PAC_LIB_MPI],[
24 dnl Set the prereq to 2.50 to avoid having 
25 AC_PREREQ(2.50)
26 if test "X$pac_lib_mpi_is_building" != "Xyes" ; then
27   # Use CC if TESTCC is defined
28   if test "X$pac_save_level" != "X" ; then
29      pac_save_TESTCC="${TESTCC}"
30      pac_save_TESTCPP="${TESTCPP}"
31      CC="$pac_save_CC"
32      if test "X$pac_save_CPP" != "X" ; then
33          CPP="$pac_save_CPP"
34      fi
35   fi
36   # Look for MPILIB first if it is defined
37   AC_SEARCH_LIBS(MPI_Init,$MPILIB mpi mpich)
38   if test "$ac_cv_search_MPI_Init" = "no" ; then
39     ifelse($2,,
40     AC_MSG_ERROR([Could not find MPI library]),[$2])
41   fi
42   AC_CHECK_HEADER(mpi.h,pac_have_mpi_h="yes",pac_have_mpi_h="no")
43   if test $pac_have_mpi_h = "no" ; then
44     ifelse($2,,
45     AC_MSG_ERROR([Could not find mpi.h include file]),[$2])
46   fi
47   if test "X$pac_save_level" != "X" ; then
48      CC="$pac_save_TESTCC"
49      CPP="$pac_save_TESTCPP"
50   fi
51 fi
52 ifelse($1,,,[$1])
53 ])
54
55 dnl This should also set MPIRUN.
56 dnl
57 dnl/*D
58 dnl PAC_ARG_MPI_TYPES - Add command-line switches for different MPI 
59 dnl environments
60 dnl
61 dnl Synopsis:
62 dnl PAC_ARG_MPI_TYPES([default])
63 dnl
64 dnl Output Effects:
65 dnl Adds the following command line options to configure
66 dnl+ \-\-with\-mpich[=path] - MPICH.  'path' is the location of MPICH commands
67 dnl. \-\-with\-ibmmpi - IBM MPI
68 dnl. \-\-with\-lammpi[=path] - LAM/MPI
69 dnl. \-\-with\-mpichnt - MPICH NT
70 dnl- \-\-with\-sgimpi - SGI MPI
71 dnl If no type is selected, and a default ("mpich", "ibmmpi", or "sgimpi")
72 dnl is given, that type is used as if '--with-<default>' was given.
73 dnl
74 dnl Sets 'CC', 'F77', 'TESTCC', 'TESTF77', and 'MPILIBNAME'.  Does `not`
75 dnl perform an AC_SUBST for these values.
76 dnl Also sets 'MPIBOOT' and 'MPIUNBOOT'.  These are used to specify 
77 dnl programs that may need to be run before and after running MPI programs.
78 dnl For example, 'MPIBOOT' may start demons necessary to run MPI programs and
79 dnl 'MPIUNBOOT' will stop those demons.
80 dnl 
81 dnl The two forms of the compilers are to allow for tests of the compiler
82 dnl when the MPI version of the compiler creates executables that cannot
83 dnl be run on the local system (for example, the IBM SP, where executables
84 dnl created with mpcc will not run locally, but executables created
85 dnl with xlc may be used to discover properties of the compiler, such as
86 dnl the size of data types).
87 dnl
88 dnl Historical note:
89 dnl Some common autoconf tests, such as AC_CHECK_SIZEOF, used to require
90 dnl running a program.  But some MPI compilers (often really compilation 
91 dnl scripts) produced programs that could only be run with special commands,
92 dnl such as a batch submission system.  To allow these test programs to be
93 dnl run, a separate set of compiler variables, TESTCC, TESTF77, etc., 
94 dnl were defined.  However, in later versions of autoconf, it both became
95 dnl unnecessary to run programs for tests such as AC_CHECK_SIZEOF and 
96 dnl it became necessary to define CC etc. before invoking AC_PROG_CC (and
97 dnl the othe language compilers), because those commands now do much, much
98 dnl more than just determining the compiler.
99 dnl
100 dnl To address the change, we still define the TESTCC etc. compilers where
101 dnl possible to allow the use of AC_TRY_RUN when required, but we define
102 dnl the CC etc variables and do not define ac_cv_prog_CC etc., as these 
103 dnl cause autoconf to skip all of the other initialization code that 
104 dnl AC_PROG_CC etc. runs.  Note also that this command must occur before 
105 dnl AC_PROG_CC (or anything that might cause AC_PROG_CC to be invoked).
106 dnl
107 dnl See also:
108 dnl PAC_LANG_PUSH_COMPILERS, PAC_LIB_MPI
109 dnl D*/
110 AC_DEFUN([PAC_ARG_MPI_TYPES],[
111 # known types
112 PAC_ARG_MPI_KNOWN_TYPES
113 # find compilers
114 PAC_MPI_FIND_COMPILER_SCRIPTS
115 PAC_MPI_FIND_COMPILERS
116 # check for MPI library
117 PAC_MPI_CHECK_MPI_LIB
118 ])
119 dnl
120 dnl To keep autoconf from prematurely invoking the compiler check scripts,
121 dnl we need a command that first sets the compilers and a separate one
122 dnl that makes any necessary checks for libraries
123 dnl
124 AC_DEFUN([PAC_ARG_MPI_KNOWN_TYPES],[
125 AC_ARG_WITH(mpich,
126 [--with-mpich=path  - Assume that we are building with MPICH],
127 ac_mpi_type=mpich)
128 # Allow MPICH as well as MPICH
129 AC_ARG_WITH(mpich,
130 [--with-mpich=path  - Assume that we are building with MPICH],
131 ac_mpi_type=mpich)
132 AC_ARG_WITH(lammpi,
133 [--with-lammpi=path  - Assume that we are building with LAM/MPI],
134 ac_mpi_type=lammpi)
135 AC_ARG_WITH(ibmmpi,
136 [--with-ibmmpi    - Use the IBM SP implementation of MPI],
137 ac_mpi_type=ibmmpi)
138 AC_ARG_WITH(sgimpi,
139 [--with-sgimpi    - Use the SGI implementation of MPI],
140 ac_mpi_type=sgimpi)
141 AC_ARG_WITH(mpichnt,
142 [--with-mpichnt - Use MPICH for Windows NT ],
143 ac_mpi_type=mpichnt)
144 AC_ARG_WITH(mpi,
145 [--with-mpi=path    - Use an MPI implementation with compile scripts mpicc
146                      and mpif77 in path/bin],ac_mpi_type=generic)
147
148 if test "X$ac_mpi_type" = "X" ; then
149     if test "X$1" != "X" ; then
150         ac_mpi_type=$1
151     else
152         ac_mpi_type=unknown
153     fi
154 fi
155 if test "$ac_mpi_type" = "unknown" -a "$pac_lib_mpi_is_building" = "yes" ; then
156     ac_mpi_type="mpich"
157 fi
158 ])
159 dnl
160 dnl Because autoconf insists on moving code to the beginning of
161 dnl certain definitions, it is *not possible* to define a single command
162 dnl that selects compilation scripts and also check for other options.
163 dnl Thus, this needs to be divided into 
164 dnl   MPI_FIND_COMPILER_SCRIPTS
165 dnl which can fail (i.e., not find a script), and
166 dnl   MPI_FIND_COMPILERS
167 dnl which runs the various PROC_xx for the compilers.
168 dnl WARNING: this function ignores --program-suffix and --program-prefix.
169 dnl However, this function is not currently used at all.
170 AC_DEFUN([PAC_MPI_FIND_COMPILER_SCRIPTS],[
171 # Set defaults
172 MPIRUN_NP="-np "
173 MPIEXEC_N="-n "
174 AC_SUBST(MPIRUN_NP)
175 AC_SUBST(MPIEXEC_N)
176 dnl
177 AC_ARG_VAR([MPIEXEC],[Name and path of mpiexec program])
178 AC_ARG_VAR([MPIRUN],[Name and path of mpirun program])
179 AC_ARG_VAR([MPIBOOT],[Name and path of program to run before mpirun])
180 AC_ARG_VAR([MPIUNBOOT],[Name and path of program to run after all mpirun])
181 AC_ARG_VAR([MPICC],[Name and absolute path of program used to compile MPI programs in C])
182 AC_ARG_VAR([MPIF77],[Name and absolute path of program used to compile MPI programs in F77])
183 AC_ARG_VAR([MPICXX],[Name and absolute path of program used to compile MPI programs in C++])
184 AC_ARG_VAR([MPIF90],[Name and absolute path of program used to compile MPI programs in F90])
185 #
186 # Check for things that will cause trouble.  For example, 
187 # if MPICC is defined but does not contain a / or \, then PATH_PROG will
188 # ignore the value
189 if test -n "$MPICC" ; then
190    case $MPICC in
191 changequote(<<,>>)
192     [\\/]* | ?:[\\/]*)
193 changequote([,])
194     # Ok, PATH_PROG will figure it out
195     ;;  
196   *)
197     AC_MSG_ERROR([MPICC must be set to an absolute path if it is set])
198   esac
199 fi
200 if test -n "$MPICXX" ; then
201    case $MPICXX in
202 changequote(<<,>>)
203     [\\/]* | ?:[\\/]*)
204 changequote([,])
205     # Ok, PATH_PROG will figure it out
206     ;;  
207   *)
208     AC_MSG_ERROR([MPICXX must be set to an absolute path if it is set])
209   esac
210 fi
211 if test -n "$MPIF77" ; then
212    case $MPIF77 in
213 changequote(<<,>>)
214     [\\/]* | ?:[\\/]*)
215 changequote([,])
216     # Ok, PATH_PROG will figure it out
217     ;;  
218   *)
219     AC_MSG_ERROR([MPIF77 must be set to an absolute path if it is set])
220   esac
221 fi
222 if test -n "$MPIF90" ; then
223    case $MPIF90 in
224 changequote(<<,>>)
225     [\\/]* | ?:[\\/]*)
226 changequote([,])
227     # Ok, PATH_PROG will figure it out
228     ;;  
229   *)
230     AC_MSG_ERROR([MPIF90 must be set to an absolute path if it is set])
231   esac
232 fi
233
234 case $ac_mpi_type in
235         mpich)
236         dnl 
237         dnl This isn't correct.  It should try to get the underlying compiler
238         dnl from the mpicc and mpif77 scripts or mpireconfig
239         if test "X$pac_lib_mpi_is_building" != "Xyes" ; then
240             PAC_PUSH_FLAG([PATH])
241             if test "$with_mpich" != "yes" -a "$with_mpich" != "no" ; then 
242                 # Look for commands; if not found, try adding bin to the
243                 # path
244                 if test ! -x $with_mpich/mpicc -a -x $with_mpich/bin/mpicc ; then
245                         with_mpich="$with_mpich/bin"
246                 fi
247                 PATH=$with_mpich:${PATH}
248             fi
249             AC_PATH_PROG(MPICC,mpicc)
250             if test -z "$TESTCC" ; then TESTCC=${CC-cc} ; fi
251             CC="$MPICC"
252             # Note that autoconf may unconditionally change the value of 
253             # CC (!) in some other command. Thus, we define CCMASTER
254             CCMASTER=$CC
255             # Force autoconf to respect this choice
256             ac_ct_CC=$CC
257             # to permit configure codes to recover the correct CC.  This
258             # is an ugly not-quite-correct workaround for the fact that 
259             # does not want you to change the C compiler once you have set it
260             # (But since it does so unconditionally, it silently creates 
261             # bogus output files.)
262             AC_PATH_PROG(MPIF77,mpif77)
263             if test -z "$TESTF77" ; then TESTF77=${F77-f77} ; fi
264             F77="$MPIF77"
265             AC_PATH_PROG(MPIFC,mpif90)
266             if test -z "$TESTFC" ; then TESTFC=${FC-f90} ; fi 
267             FC="$MPIFC"
268             AC_PATH_PROG(MPICXX,mpiCC)
269             if test -z "$TESTCXX" ; then TESTCXX=${CXX-CC} ; fi
270             CXX="$MPICXX"
271             # We may want to restrict this to the path containing mpirun
272             AC_PATH_PROG(MPIEXEC,mpiexec)
273             AC_PATH_PROG(MPIRUN,mpirun)
274             AC_PATH_PROG(MPIBOOT,mpichboot)
275             AC_PATH_PROG(MPIUNBOOT,mpichstop)
276             PAC_POP_FLAG([PATH])
277             MPILIBNAME="mpich"
278         else 
279             # All of the above should have been passed in the environment!
280             :
281         fi
282         ;;
283
284         mpichnt)
285         ;;
286
287         lammpi)
288         dnl
289         dnl This isn't correct.  It should try to get the underlying compiler
290         dnl from the mpicc and mpif77 scripts or mpireconfig
291         PAC_PUSH_FLAG([PATH])
292         if test "$with_mpich" != "yes" -a "$with_mpich" != "no" ; then 
293             # Look for commands; if not found, try adding bin to the path
294                 if test ! -x $with_lammpi/mpicc -a -x $with_lammpi/bin/mpicc ; then
295                         with_lammpi="$with_lammpi/bin"
296                 fi
297                 PATH=$with_lammpi:${PATH}
298         fi
299         AC_PATH_PROG(MPICC,mpicc)
300         if test -z "$TESTCC" ; then TESTCC=${CC-cc} ; fi
301         CC="$MPICC"
302         AC_PATH_PROG(MPIF77,mpif77)
303         if test -z "$TESTCC" ; then TESTF77=${F77-f77} ; fi
304         F77="$MPIF77"
305         AC_PATH_PROG(MPIFC,mpif90)
306         TESTFC=${FC-f90}
307         if test -z "$TESTFC" ; then TESTFC=${FC-f90} ; fi
308         FC="$MPIFC"
309         AC_PATH_PROG(MPICXX,mpiCC)
310         if test -z "$TESTCXX" ; then TESTCXX=${CXX-CC} ; fi
311         CXX="$MPICXX"
312         PAC_POP_FLAG([PATH])
313         MPILIBNAME="lammpi"
314         MPIBOOT="lamboot"
315         MPIUNBOOT="wipe"
316         MPIRUN="mpirun"
317         ;;
318
319         ibmmpi)
320         AC_CHECK_PROGS(MPCC,mpcc)
321         AC_CHECK_PROGS(MPXLF,mpxlf mpfort)
322         if test -z "$MPCC" -o -z "$MPXLF" ; then
323             AC_MSG_ERROR([Could not find IBM MPI compilation scripts.  Either mpcc or mpxlf/mpfort is missing])
324         fi
325         if test -z "$TESTCC" ; then TESTCC=${CC-xlC} ; fi
326         if test -z "$TESTF77" ; then TESTF77=${F77-xlf}; fi
327         CC=mpcc; F77=$MPXLF
328         # There is no mpxlf90, but the options langlvl and free can
329         # select the Fortran 90 version of xlf
330         if test "$enable_f90" != no ; then
331             AC_CHECK_PROGS(MPIXLF90,mpxlf90 mpfort)
332             if test -z "$TESTFC" ; then TESTFC=${FC-xlf90}; fi
333             if test "X$MPIXLF90" != "X" ; then 
334                 FC="$MPIXLF90"
335             else
336                 FC="$MPXLF -qlanglvl=90ext -qfree=f90"
337             fi
338         fi
339         MPILIBNAME=""
340         cross_compiling=yes
341         # Turn off the autoconf version 3 warning message
342         ac_tool_warned=yes
343         ;;
344
345         sgimpi)
346         if test -z "$TESTCC" ; then TESTCC=${CC:=cc} ; fi
347         if test -z "$TESTF77" ; then TESTF77=${F77:=f77} ; fi
348         if test -z "$TESTCXX" ; then TESTCXX=${CXX:=CC} ; fi
349         if test -z "$TESTFC" ; then TESTFC=${FC:=f90} ; fi
350         # Must check for the MPI library in a separate macro - adding
351         # a test here will cause autoconf to prematurely define the
352         # C compiler
353         MPIRUN=mpirun
354         MPIBOOT=""
355         MPIUNBOOT=""
356         ;;
357
358         generic)
359         # in $with_mpi/bin or $with_mpi
360         if test "X$MPICC" = "X" ; then
361             if test -x "$with_mpi/bin/mpicc" ; then
362                 MPICC=$with_mpi/bin/mpicc
363             elif test -x "$with_mpi/mpicc" ; then
364                 MPICC=$with_mpi/mpicc
365             fi
366         fi
367         if test "X$MPICXX" = "X" ; then
368             if test -x "$with_mpi/bin/mpicxx" ; then
369                 MPICXX=$with_mpi/bin/mpicxx
370             elif test -x "$with_mpi/mpicxx" ; then
371                 MPICXX=$with_mpi/mpicxx
372             fi
373         fi
374         if test "X$MPIF77" = "X" ; then
375             if test -x "$with_mpi/bin/mpif77" ; then
376                 MPIF77=$with_mpi/bin/mpif77
377             elif test -x "$with_mpi/mpif77" ; then
378                 MPIF77=$with_mpi/mpif77
379             fi
380         fi
381         if test "X$MPIF90" = "X" ; then
382             if test -x "$with_mpi/bin/mpif90" ; then
383                 MPIF90=$with_mpi/bin/mpif90
384             elif test -x "$with_mpi/mpif90" ; then
385                 MPIF90=$with_mpi/mpif90
386             fi
387         fi
388         if test "X$MPIEXEC" = "X" ; then
389             if test -x "$with_mpi/bin/mpiexec" ; then
390                 MPIEXEC=$with_mpi/bin/mpiexec
391             elif test -x "$with_mpi/mpiexec" ; then
392                 MPIEXEC=$with_mpi/mpiexec
393             fi
394         fi
395         CC=$MPICC
396         F77=$MPIF77
397         if test "X$MPICXX" != "X" ; then CXX=$MPICXX ; fi
398         if test "X$MPIF90" != "X" ; then F90=$MPIF90 ; fi
399         ;;
400
401         *)
402         # Use the default choices for the compilers
403         ;;
404 esac
405 ])
406
407 AC_DEFUN([PAC_MPI_FIND_COMPILERS],[
408 # Tell autoconf to determine properties of the compilers (these are the 
409 # compilers for MPI programs)
410 PAC_PROG_CC
411 if test "$enable_f77" != no -a "$enable_fortran" != no ; then
412     AC_PROG_F77
413 fi
414 if test "$enable_cxx" != no ; then
415     AC_PROG_CXX
416 fi
417 if test "$enable_f90" != no ; then
418     PAC_PROG_FC
419 fi
420 ])
421
422 dnl
423 dnl This uses the selected CC etc to check for include paths and libraries
424 AC_DEFUN([PAC_MPI_CHECK_MPI_LIB],[
425 AC_REQUIRE([AC_PROG_CC])
426 case $ac_mpi_type in
427     mpich)
428         ;;
429
430     mpichnt)
431         dnl
432         dnl This isn't adequate, but it helps with using MPICH-NT/SDK.gcc
433         PAC_PUSH_FLAG([CFLAGS])
434         CFLAGS="$CFLAGS -I$with_mpichnt/include"
435         PAC_PUSH_FLAG([CPPFLAGS])
436         CPPFLAGS="$CPPFLAGS -I$with_mpichnt/include"
437         PAC_PUSH_FLAG([LDFLAGS])
438         LDFLAGS="$LDFLAGS -L$with_mpichnt/lib"
439         AC_CHECK_LIB(mpich,MPI_Init,found="yes",found="no")
440         if test "$found" = "no" ; then
441           AC_CHECK_LIB(mpich,MPI_Init,found="yes",found="no")
442         fi
443         if test "$enable_cxx" != no ; then
444             AC_PROG_CXX
445         fi
446         if test "$enable_f90" != no ; then
447             PAC_PROG_FC
448         fi
449         # Set defaults for the TEST versions if not already set
450         if test -z "$TESTCC" ; then TESTCC=${CC:=cc} ; fi
451         if test -z "$TESTF77" ; then TESTF77=${F77:=f77} ; fi
452         if test -z "$TESTCXX" ; then TESTCXX=${CXX:=CC} ; fi
453         if test -z "$TESTFC" ; then TESTFC=${FC:=f90} ; fi
454         if test "$found" = "no" ; then
455           PAC_POP_FLAG([CFLAGS])
456           PAC_POP_FLAG([CPPFLAGS])
457           PAC_POP_FLAG([LDFLAGS])
458         fi
459         ;;
460
461     lammpi)
462         ;;
463
464     ibmmpi)
465         ;;
466
467     sgimpi)
468         AC_CHECK_LIB(mpi,MPI_Init)
469         if test "$ac_cv_lib_mpi_MPI_Init" = "yes" ; then
470             MPILIBNAME="mpi"
471         fi      
472         ;;
473
474     generic)
475         AC_SEARCH_LIBS(MPI_Init,mpi mpich mpich)
476         if test "$ac_cv_lib_mpi_MPI_Init" = "yes" ; then
477             MPILIBNAME="mpi"
478         fi      
479         ;;
480
481     *)
482         ;;
483 esac
484 ])
485
486 dnl
487 dnl/*D
488 dnl PAC_MPI_F2C - Determine if MPI has the MPI-2 functions MPI_xxx_f2c and
489 dnl   MPI_xxx_c2f
490 dnl
491 dnl Output Effect:
492 dnl Define 'HAVE_MPI_F2C' if the routines are found.
493 dnl
494 dnl Notes:
495 dnl Looks only for 'MPI_Request_c2f'.
496 dnl D*/
497 AC_DEFUN([PAC_MPI_F2C],[
498 AC_CACHE_CHECK([for MPI F2C and C2F routines],
499 pac_cv_mpi_f2c,
500 [
501 AC_TRY_LINK([#include "mpi.h"],
502 [MPI_Request request;MPI_Fint a;a = MPI_Request_c2f(request);],
503 pac_cv_mpi_f2c="yes",pac_cv_mpi_f2c="no")
504 ])
505 if test "$pac_cv_mpi_f2c" = "yes" ; then 
506     AC_DEFINE(HAVE_MPI_F2C,1,[Define if MPI has F2C]) 
507 fi
508 ])
509 dnl
510 dnl/*D
511 dnl PAC_HAVE_ROMIO - make mpi.h include mpio.h if romio enabled
512 dnl
513 dnl Output Effect:
514 dnl expands @HAVE_ROMIO@ in mpi.h into #include "mpio.h"
515 dnl D*/
516 AC_DEFUN([PAC_HAVE_ROMIO],[
517 if test "$enable_romio" = "yes" ; then HAVE_ROMIO='#include "mpio.h"'; fi
518 AC_SUBST(HAVE_ROMIO)
519 ])