[cmake-developers] Proposed patch for FindMPI.cmake (Intel MPI)

Thompson, KT kgt at lanl.gov
Thu Oct 30 10:41:31 EDT 2014


Please find below a proposed patch that addresses this bug: http://public.kitware.com/Bug/view.php?id=15182 (FindMPI.cmake fails to properly detect Intel MPI 5.0.1).  Because the return code is unreliable for the Intel MPI compile wrappers (e.g.: 'mpiicpc -showme:compile'), the output text must be interrogated for possible issues.  My choice of "undefined reference" may not be the best choice, but it works for all of my test cases.

I have tested this patch with OpenMPI, MPICH2 and Intel MPI on RHEL 6.4 and RHEL 6.4.  I have also tested it on Win7 with VS2013 using Microsoft HPC Pack 2008 R2 MPI.

Would anyone like to provide feedback or test this modification?  What do I need to do to get this into release code?

-kt
Kelly Thompson


======================================================================================
--- a/Modules/FindMPI.cmake
+++ b/Modules/FindMPI.cmake
@@ -226,6 +226,13 @@ function (interrogate_mpi_compiler lang try_libs)
         ERROR_VARIABLE   MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
         RESULT_VARIABLE  MPI_COMPILER_RETURN)
+      # Intel MPI will return a zero return code even when the
+      # argument to the MPI compiler wrapper is unknown.  Attempt to
+      # catch this case.
+      if( "${MPI_COMPILE_CMDLINE}" MATCHES "undefined reference" )
+        set( MPI_COMPILER_RETURN 255 )
+      endif()
+
       if (MPI_COMPILER_RETURN EQUAL 0)
         # If we appear to have -showme:compile, then we should
         # also have -showme:link. Try it.
@@ -264,7 +271,15 @@ function (interrogate_mpi_compiler lang try_libs)
           RESULT_VARIABLE  MPI_COMPILER_RETURN)
       endif()
+      # Intel MPI will return a zero return code even when the
+      # argument to the MPI compiler wrapper is unknown.  Attempt to
+      # catch this case.
+      if( "${MPI_COMPILE_CMDLINE}" MATCHES "undefined reference" )
+        set( MPI_COMPILER_RETURN 255 )
+      endif()
+
       # MVAPICH uses -compile-info and -link-info.  Try them.
+      # Intel and Cray MPICH2 flavors will likely follow this path.
       if (NOT MPI_COMPILER_RETURN EQUAL 0)
         execute_process(
           COMMAND ${MPI_${lang}_COMPILER} -compile-info
@@ -378,7 +393,6 @@ function (interrogate_mpi_compiler lang try_libs)
         # Extract the set of libraries to link against from the link command
         # line
         string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}")
-
         # add the compiler implicit directories because some compilers
         # such as the intel compiler have libraries that show up
         # in the showme list that can only be found in the implicit
@@ -588,6 +602,7 @@ foreach (lang C CXX Fortran)
       HINTS  ${_MPI_BASE_DIR}/bin
       PATHS  ${_MPI_PREFIX_PATH}
       )
+
     interrogate_mpi_compiler(${lang} ${try_libs})
     mark_as_advanced(MPI_${lang}_COMPILER)



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20141030/88e937b1/attachment.html>


More information about the cmake-developers mailing list