| [8a8c8c] | 1 | ################################################################################################# | 
|---|
|  | 2 | # Copyright (c) 2010, Lawrence Livermore National Security, LLC. | 
|---|
|  | 3 | # Produced at the Lawrence Livermore National Laboratory | 
|---|
|  | 4 | # Written by Todd Gamblin, tgamblin@llnl.gov. | 
|---|
|  | 5 | # LLNL-CODE-417602 | 
|---|
|  | 6 | # All rights reserved. | 
|---|
|  | 7 | # | 
|---|
|  | 8 | # This file is part of Libra. For details, see http://github.com/tgamblin/libra. | 
|---|
|  | 9 | # Please also read the LICENSE file for further information. | 
|---|
|  | 10 | # | 
|---|
|  | 11 | # Redistribution and use in source and binary forms, with or without modification, are | 
|---|
|  | 12 | # permitted provided that the following conditions are met: | 
|---|
|  | 13 | # | 
|---|
|  | 14 | #  * Redistributions of source code must retain the above copyright notice, this list of | 
|---|
|  | 15 | #    conditions and the disclaimer below. | 
|---|
|  | 16 | #  * Redistributions in binary form must reproduce the above copyright notice, this list of | 
|---|
|  | 17 | #    conditions and the disclaimer (as noted below) in the documentation and/or other materials | 
|---|
|  | 18 | #    provided with the distribution. | 
|---|
|  | 19 | #  * Neither the name of the LLNS/LLNL nor the names of its contributors may be used to endorse | 
|---|
|  | 20 | #    or promote products derived from this software without specific prior written permission. | 
|---|
|  | 21 | # | 
|---|
|  | 22 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS | 
|---|
|  | 23 | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | 
|---|
|  | 24 | # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | 
|---|
|  | 25 | # LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE | 
|---|
|  | 26 | # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 
|---|
|  | 27 | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|---|
|  | 28 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 
|---|
|  | 29 | # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | 
|---|
|  | 30 | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|---|
|  | 31 | ################################################################################################# | 
|---|
|  | 32 |  | 
|---|
|  | 33 | # | 
|---|
|  | 34 | # LX_FIND_MPI() | 
|---|
|  | 35 | #  ------------------------------------------------------------------------ | 
|---|
|  | 36 | # This macro finds an MPI compiler and extracts includes and libraries from | 
|---|
|  | 37 | # it for use in automake projects.  The script exports the following variables: | 
|---|
|  | 38 | # | 
|---|
|  | 39 | # AC_DEFINE variables: | 
|---|
|  | 40 | #     HAVE_MPI         AC_DEFINE'd to 1 if we found MPI | 
|---|
|  | 41 | # | 
|---|
|  | 42 | # AC_SUBST variables: | 
|---|
|  | 43 | #     MPICC            Name of MPI compiler | 
|---|
|  | 44 | #     MPI_CFLAGS       Includes and defines for MPI C compilation | 
|---|
|  | 45 | #     MPI_CLDFLAGS     Libraries and library paths for linking MPI C programs | 
|---|
|  | 46 | # | 
|---|
|  | 47 | #     MPICXX           Name of MPI C++ compiler | 
|---|
|  | 48 | #     MPI_CXXFLAGS     Includes and defines for MPI C++ compilation | 
|---|
|  | 49 | #     MPI_CXXLDFLAGS   Libraries and library paths for linking MPI C++ programs | 
|---|
|  | 50 | # | 
|---|
|  | 51 | #     MPIF77           Name of MPI Fortran 77 compiler | 
|---|
|  | 52 | #     MPI_F77FLAGS     Includes and defines for MPI Fortran 77 compilation | 
|---|
|  | 53 | #     MPI_F77LDFLAGS   Libraries and library paths for linking MPI Fortran 77 programs | 
|---|
|  | 54 | # | 
|---|
|  | 55 | #     MPIFC            Name of MPI Fortran compiler | 
|---|
|  | 56 | #     MPI_FFLAGS       Includes and defines for MPI Fortran compilation | 
|---|
|  | 57 | #     MPI_FLDFLAGS     Libraries and library paths for linking MPI Fortran programs | 
|---|
|  | 58 | # | 
|---|
|  | 59 | # Shell variables output by this macro: | 
|---|
|  | 60 | #     have_C_mpi       'yes' if we found MPI for C, 'no' otherwise | 
|---|
|  | 61 | #     have_CXX_mpi     'yes' if we found MPI for C++, 'no' otherwise | 
|---|
|  | 62 | #     have_F77_mpi     'yes' if we found MPI for F77, 'no' otherwise | 
|---|
|  | 63 | #     have_F_mpi       'yes' if we found MPI for Fortran, 'no' otherwise | 
|---|
|  | 64 | # | 
|---|
|  | 65 | AC_DEFUN([LX_FIND_MPI], | 
|---|
|  | 66 | [ | 
|---|
|  | 67 | AC_LANG_CASE( | 
|---|
|  | 68 | [C], [ | 
|---|
|  | 69 | AC_REQUIRE([AC_PROG_CC]) | 
|---|
|  | 70 | if [[ ! -z "$MPICC" ]]; then | 
|---|
|  | 71 | LX_QUERY_MPI_COMPILER(MPICC, [$MPICC], C) | 
|---|
|  | 72 | else | 
|---|
|  | 73 | LX_QUERY_MPI_COMPILER(MPICC, [mpicc mpiicc mpixlc mpipgcc], C) | 
|---|
|  | 74 | fi | 
|---|
|  | 75 | ], | 
|---|
|  | 76 | [C++], [ | 
|---|
|  | 77 | AC_REQUIRE([AC_PROG_CXX]) | 
|---|
|  | 78 | if [[ ! -z "$MPICXX" ]]; then | 
|---|
|  | 79 | LX_QUERY_MPI_COMPILER(MPICXX, [$MPICXX], CXX) | 
|---|
|  | 80 | else | 
|---|
|  | 81 | LX_QUERY_MPI_COMPILER(MPICXX, [mpicxx mpiCC mpic++ mpig++ mpiicpc mpipgCC mpixlC], CXX) | 
|---|
|  | 82 | fi | 
|---|
|  | 83 | ], | 
|---|
|  | 84 | [F77], [ | 
|---|
|  | 85 | AC_REQUIRE([AC_PROG_F77]) | 
|---|
|  | 86 | if [[ ! -z "$MPIF77" ]]; then | 
|---|
|  | 87 | LX_QUERY_MPI_COMPILER(MPIF77, [$MPIF77], F77) | 
|---|
|  | 88 | else | 
|---|
|  | 89 | LX_QUERY_MPI_COMPILER(MPIF77, [mpif77 mpiifort mpixlf77 mpixlf77_r], F77) | 
|---|
|  | 90 | fi | 
|---|
|  | 91 | ], | 
|---|
|  | 92 | [Fortran], [ | 
|---|
|  | 93 | AC_REQUIRE([AC_PROG_FC]) | 
|---|
|  | 94 | if [[ ! -z "$MPIFC" ]]; then | 
|---|
|  | 95 | LX_QUERY_MPI_COMPILER(MPIFC, [$MPIFC], F) | 
|---|
|  | 96 | else | 
|---|
|  | 97 | mpi_default_fc="mpif95 mpif90 mpigfortran mpif2003" | 
|---|
|  | 98 | mpi_intel_fc="mpiifort" | 
|---|
|  | 99 | mpi_xl_fc="mpixlf95 mpixlf95_r mpixlf90 mpixlf90_r mpixlf2003 mpixlf2003_r" | 
|---|
|  | 100 | mpi_pg_fc="mpipgf95 mpipgf90" | 
|---|
|  | 101 | LX_QUERY_MPI_COMPILER(MPIFC, [$mpi_default_fc $mpi_intel_fc $mpi_xl_fc $mpi_pg_fc], F) | 
|---|
|  | 102 | fi | 
|---|
|  | 103 | ]) | 
|---|
|  | 104 | ]) | 
|---|
|  | 105 |  | 
|---|
|  | 106 |  | 
|---|
|  | 107 | # | 
|---|
|  | 108 | # LX_QUERY_MPI_COMPILER([compiler-var-name], [compiler-names], [output-var-prefix]) | 
|---|
|  | 109 | #  ------------------------------------------------------------------------ | 
|---|
|  | 110 | # AC_SUBST variables: | 
|---|
|  | 111 | #     MPI_<prefix>FLAGS       Includes and defines for MPI compilation | 
|---|
|  | 112 | #     MPI_<prefix>LDFLAGS     Libraries and library paths for linking MPI C programs | 
|---|
|  | 113 | # | 
|---|
|  | 114 | # Shell variables output by this macro: | 
|---|
|  | 115 | #     found_mpi_flags         'yes' if we were able to get flags, 'no' otherwise | 
|---|
|  | 116 | # | 
|---|
|  | 117 | AC_DEFUN([LX_QUERY_MPI_COMPILER], | 
|---|
|  | 118 | [ | 
|---|
|  | 119 | # Try to find a working MPI compiler from the supplied names | 
|---|
|  | 120 | AC_PATH_PROGS($1, [$2], [not-found]) | 
|---|
|  | 121 |  | 
|---|
|  | 122 | # Figure out what the compiler responds to to get it to show us the compile | 
|---|
|  | 123 | # and link lines.  After this part of the macro, we'll have a valid | 
|---|
|  | 124 | # lx_mpi_command_line | 
|---|
|  | 125 | echo -n "Checking whether $$1 responds to '-showme:compile'... " | 
|---|
|  | 126 | lx_mpi_compile_line=`$$1 -showme:compile 2>/dev/null` | 
|---|
|  | 127 | if [[ "$?" -eq 0 ]]; then | 
|---|
|  | 128 | echo yes | 
|---|
|  | 129 | lx_mpi_link_line=`$$1 -showme:link 2>/dev/null` | 
|---|
|  | 130 | else | 
|---|
|  | 131 | echo no | 
|---|
|  | 132 | echo -n "Checking whether $$1 responds to '-showme'... " | 
|---|
|  | 133 | lx_mpi_command_line=`$$1 -showme 2>/dev/null` | 
|---|
|  | 134 | if [[ "$?" -ne 0 ]]; then | 
|---|
|  | 135 | echo no | 
|---|
|  | 136 | echo -n "Checking whether $$1 responds to '-compile-info'... " | 
|---|
|  | 137 | lx_mpi_compile_line=`$$1 -compile-info 2>/dev/null` | 
|---|
|  | 138 | if [[ "$?" -eq 0 ]]; then | 
|---|
|  | 139 | echo yes | 
|---|
|  | 140 | lx_mpi_link_line=`$$1 -link-info 2>/dev/null` | 
|---|
|  | 141 | else | 
|---|
|  | 142 | echo no | 
|---|
|  | 143 | echo -n "Checking whether $$1 responds to '-show'... " | 
|---|
|  | 144 | lx_mpi_command_line=`$$1 -show 2>/dev/null` | 
|---|
|  | 145 | if [[ "$?" -eq 0 ]]; then | 
|---|
|  | 146 | echo yes | 
|---|
|  | 147 | else | 
|---|
|  | 148 | echo no | 
|---|
|  | 149 | fi | 
|---|
|  | 150 | fi | 
|---|
|  | 151 | else | 
|---|
|  | 152 | echo yes | 
|---|
|  | 153 | fi | 
|---|
|  | 154 | fi | 
|---|
|  | 155 |  | 
|---|
|  | 156 | if [[ ! -z "$lx_mpi_compile_line" -a ! -z "$lx_mpi_link_line" ]]; then | 
|---|
|  | 157 | lx_mpi_command_line="$lx_mpi_compile_line $lx_mpi_link_line" | 
|---|
|  | 158 | fi | 
|---|
|  | 159 |  | 
|---|
|  | 160 | if [[ ! -z "$lx_mpi_command_line" ]]; then | 
|---|
|  | 161 | # Now extract the different parts of the MPI command line.  Do these separately in case we need to | 
|---|
|  | 162 | # parse them all out in future versions of this macro. | 
|---|
|  | 163 | lx_mpi_defines=`    echo "$lx_mpi_command_line" | grep -o -- '\(^\| \)-D\([[^\"[:space:]]]\+\|\"[[^\"[:space:]]]\+\"\)'` | 
|---|
|  | 164 | lx_mpi_includes=`   echo "$lx_mpi_command_line" | grep -o -- '\(^\| \)-I\([[^\"[:space:]]]\+\|\"[[^\"[:space:]]]\+\"\)'` | 
|---|
|  | 165 | lx_mpi_link_paths=` echo "$lx_mpi_command_line" | grep -o -- '\(^\| \)-L\([[^\"[:space:]]]\+\|\"[[^\"[:space:]]]\+\"\)'` | 
|---|
|  | 166 | lx_mpi_libs=`       echo "$lx_mpi_command_line" | grep -o -- '\(^\| \)-l\([[^\"[:space:]]]\+\|\"[[^\"[:space:]]]\+\"\)'` | 
|---|
|  | 167 | lx_mpi_link_args=`  echo "$lx_mpi_command_line" | grep -o -- '\(^\| \)-Wl,\([[^\"[:space:]]]\+\|\"[[^\"[:space:]]]\+\"\)'` | 
|---|
|  | 168 |  | 
|---|
|  | 169 | # Create variables and clean up newlines and multiple spaces | 
|---|
|  | 170 | MPI_$3FLAGS="$lx_mpi_defines $lx_mpi_includes" | 
|---|
|  | 171 | MPI_$3LDFLAGS="$lx_mpi_link_paths $lx_mpi_libs $lx_mpi_link_args" | 
|---|
|  | 172 | MPI_$3FLAGS=`  echo "$MPI_$3FLAGS"   | tr '\n' ' ' | sed 's/^[[ \t]]*//;s/[[ \t]]*$//' | sed 's/  +/ /g'` | 
|---|
|  | 173 | MPI_$3LDFLAGS=`echo "$MPI_$3LDFLAGS" | tr '\n' ' ' | sed 's/^[[ \t]]*//;s/[[ \t]]*$//' | sed 's/  +/ /g'` | 
|---|
|  | 174 |  | 
|---|
|  | 175 | OLD_CPPFLAGS=$CPPFLAGS | 
|---|
|  | 176 | OLD_LIBS=$LIBS | 
|---|
|  | 177 | CPPFLAGS=$MPI_$3FLAGS | 
|---|
|  | 178 | LIBS=$MPI_$3LDFLAGS | 
|---|
|  | 179 |  | 
|---|
|  | 180 | AC_TRY_LINK([#include <mpi.h>], | 
|---|
|  | 181 | [int rank, size; | 
|---|
|  | 182 | MPI_Comm_rank(MPI_COMM_WORLD, &rank); | 
|---|
|  | 183 | MPI_Comm_size(MPI_COMM_WORLD, &size);], | 
|---|
|  | 184 | [# Add a define for testing at compile time. | 
|---|
|  | 185 | AC_DEFINE([HAVE_MPI], [1], [Define to 1 if you have MPI libs and headers.]) | 
|---|
|  | 186 | have_$3_mpi='yes'], | 
|---|
|  | 187 | [# zero out mpi flags so we don't link against the faulty library. | 
|---|
|  | 188 | MPI_$3FLAGS="" | 
|---|
|  | 189 | MPI_$3LDFLAGS="" | 
|---|
|  | 190 | have_$3_mpi='no']) | 
|---|
|  | 191 |  | 
|---|
|  | 192 | # AC_SUBST everything. | 
|---|
|  | 193 | AC_SUBST($1) | 
|---|
|  | 194 | AC_SUBST(MPI_$3FLAGS) | 
|---|
|  | 195 | AC_SUBST(MPI_$3LDFLAGS) | 
|---|
|  | 196 |  | 
|---|
|  | 197 | LIBS=$OLD_LIBS | 
|---|
|  | 198 | CPPFLAGS=$OLD_CPPFLAGS | 
|---|
|  | 199 | else | 
|---|
|  | 200 | Echo Unable to find suitable MPI Compiler. Try setting $1. | 
|---|
|  | 201 | have_$3_mpi='no' | 
|---|
|  | 202 | fi | 
|---|
|  | 203 | ]) | 
|---|
|  | 204 |  | 
|---|