[Cmake-commits] CMake branch, next, updated. v2.8.4-1804-ge355a12
Todd Gamblin
tgamblin at llnl.gov
Tue Jun 21 13:15:56 EDT 2011
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".
The branch, next has been updated
via e355a1263163b201bbeeafe9c974b8f914075cf2 (commit)
via e00d2c4d51da6d9c641af7e4537bfa97e22ce1fc (commit)
from 9a296ab5bc6c7031acb55031ee34376785233838 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e355a1263163b201bbeeafe9c974b8f914075cf2
commit e355a1263163b201bbeeafe9c974b8f914075cf2
Merge: 9a296ab e00d2c4
Author: Todd Gamblin <tgamblin at llnl.gov>
AuthorDate: Tue Jun 21 13:15:39 2011 -0400
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Tue Jun 21 13:15:39 2011 -0400
Merge topic 'FindMPI-try-regular-compiler' into next
e00d2c4 Try regular compiler when no MPI compiler.
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e00d2c4d51da6d9c641af7e4537bfa97e22ce1fc
commit e00d2c4d51da6d9c641af7e4537bfa97e22ce1fc
Author: Todd Gamblin <tgamblin at llnl.gov>
AuthorDate: Mon Jun 20 19:55:08 2011 -0700
Commit: Todd Gamblin <tgamblin at llnl.gov>
CommitDate: Tue Jun 21 10:14:01 2011 -0700
Try regular compiler when no MPI compiler.
If FindMPI can't interrogate any of the available compilers, it attempts to compile simple MPI
programs with CMAKE_${lang}_COMPILER. If this works, it uses that as MPI_${lang}_COMPILER.
This allows MPI to be discovered on Cray XT/XE systems, where modules are used and cc, CC, and ftn
compilers *are* MPI compilers.
diff --git a/Modules/FindMPI.cmake b/Modules/FindMPI.cmake
index 1d42a91..d251088 100644
--- a/Modules/FindMPI.cmake
+++ b/Modules/FindMPI.cmake
@@ -184,8 +184,15 @@ endforeach()
# (Windows implementations) do not have compiler wrappers, so this approach must be used.
#
function (interrogate_mpi_compiler lang try_libs)
- # if it's already in the cache, don't bother with any of this stuff
- if ((NOT MPI_${lang}_INCLUDE_PATH) OR (NOT MPI_${lang}_LIBRARIES))
+ # MPI_${lang}_NO_INTERROGATE will be set to a compiler name when the *regular* compiler was
+ # discovered to be the MPI compiler. This happens on machines like the Cray XE6 that use
+ # modules to set cc, CC, and ftn to the MPI compilers. If the user force-sets another MPI
+ # compiler, MPI_${lang}_COMPILER won't be equal to MPI_${lang}_NO_INTERROGATE, and we'll
+ # inspect that compiler anew. This allows users to set new compilers w/o rm'ing cache.
+ string(COMPARE NOTEQUAL "${MPI_${lang}_NO_INTERROGATE}" "${MPI_${lang}_COMPILER}" interrogate)
+
+ # If MPI is set already in the cache, don't bother with interrogating the compiler.
+ if (interrogate AND ((NOT MPI_${lang}_INCLUDE_PATH) OR (NOT MPI_${lang}_LIBRARIES)))
if (MPI_${lang}_COMPILER)
# Check whether the -showme:compile option works. This indicates that we have either OpenMPI
# or a newer version of LAM-MPI, and implies that -showme:link will also work.
@@ -436,6 +443,43 @@ function (interrogate_mpi_compiler lang try_libs)
endfunction()
+function(try_regular_compiler lang success)
+ # last ditch attempt: just try to compile something with the regular compiler
+ if (${lang} STREQUAL Fortran)
+ set(test_file ${CMAKE_CURRENT_BINARY_DIR}/cmake_mpi_test.f90)
+ file(WRITE ${test_file}
+ "program hello\n"
+ "include 'mpif.h'\n"
+ "integer ierror\n"
+ "call MPI_INIT(ierror)\n"
+ "call MPI_FINALIZE(ierror)\n"
+ "end\n")
+ else()
+ if (${lang} STREQUAL CXX)
+ set(test_file ${CMAKE_CURRENT_BINARY_DIR}/cmake_mpi_test.cpp)
+ else()
+ set(test_file ${CMAKE_CURRENT_BINARY_DIR}/cmake_mpi_test.c)
+ endif()
+ file(WRITE ${test_file}
+ "#include <mpi.h>\n"
+ "int main(int argc, char **argv) {\n"
+ " MPI_Init(&argc, &argv);\n"
+ " MPI_Finalize();\n"
+ "}\n")
+ endif()
+ try_compile(worked ${CMAKE_CURRENT_BINARY_DIR} ${test_file})
+ if (worked)
+ set(MPI_${lang}_NO_INTERROGATE ${CMAKE_${lang}_COMPILER} CACHE STRING "Whether to interrogate MPI ${lang} compiler" FORCE)
+ set(MPI_${lang}_COMPILER ${CMAKE_${lang}_COMPILER} CACHE STRING "MPI ${lang} compiler" FORCE)
+ set(MPI_${lang}_COMPILE_FLAGS "" CACHE STRING "MPI ${lang} compilation flags" FORCE)
+ set(MPI_${lang}_INCLUDE_PATH "" CACHE STRING "MPI ${lang} include path" FORCE)
+ set(MPI_${lang}_LINK_FLAGS "" CACHE STRING "MPI ${lang} linking flags" FORCE)
+ set(MPI_${lang}_LIBRARIES "" CACHE STRING "MPI ${lang} libraries to link against" FORCE)
+ endif()
+ set(${success} ${worked} PARENT_SCOPE)
+ file(REMOVE ${test_file})
+endfunction()
+
# End definitions, commence real work here.
# Most mpi distros have some form of mpiexec which gives us something we can reliably look for.
@@ -507,8 +551,18 @@ foreach (lang C CXX Fortran)
interrogate_mpi_compiler(${lang} ${try_libs})
mark_as_advanced(MPI_${lang}_COMPILER)
- # Treat each language separately as far as outputting whether we found support for it and setting MPI_<lang>_FOUND.
- find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_LIBRARIES MPI_${lang}_INCLUDE_PATH)
+ # last ditch try -- if nothing works so far, just try running the regular compiler and
+ # see if we can create an MPI executable.
+ set(regular_compiler_worked 0)
+ if (NOT MPI_${lang}_LIBRARIES OR NOT MPI_${lang}_INCLUDE_PATH)
+ try_regular_compiler(${lang} regular_compiler_worked)
+ endif()
+
+ if (regular_compiler_worked)
+ find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_COMPILER)
+ else()
+ find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_LIBRARIES MPI_${lang}_INCLUDE_PATH)
+ endif()
endif()
endforeach()
-----------------------------------------------------------------------
Summary of changes:
Modules/FindMPI.cmake | 62 +++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 58 insertions(+), 4 deletions(-)
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list