[cmake-developers] FindMPI take 2
Thompson, KT
kgt at lanl.gov
Tue Dec 9 19:03:06 EST 2014
Brad King wrote:
>> 0002-first-try-to-see-if-what-user-provided-produces-an-m.patch
> The check for whether the CMAKE_<LANG>_COMPILER is already a
> MPI compiler requires a try_compile. Is there some other way
> to check to see if there is any chance before the full test?
I have been looking into this. For my setup, I found it useful to compare the CMAKE_<LANG>_COMPILER to the list of known mpi wrapper names and prepend _MPI_${lang}_COMPILER_NAMES with CMAKE_<LANG>_COMPILER so that the remaining logic in FindMPI.cmake chooses the user supplied compiler/mpi-wrapper over any of the other choices. Something like this:
# append vendor-specific compilers to the list if we either don't know the compiler id,
# or if we know it matches the regular compiler.
foreach (lang C CXX Fortran)
foreach (id GNU Intel PGI XL)
if (NOT CMAKE_${lang}_COMPILER_ID OR CMAKE_${lang}_COMPILER_ID STREQUAL id)
list(APPEND _MPI_${lang}_COMPILER_NAMES ${_MPI_${id}_${lang}_COMPILER_NAMES})
endif()
unset(_MPI_${id}_${lang}_COMPILER_NAMES) # clean up the namespace here
endforeach()
+ # If cmake_$lang_compiler matches a known mpi compiler wrapper name,
+ # prefer the provided value.
+ get_filename_component( compiler_wo_path "${CMAKE_${lang}_COMPILER}" NAME )
+ set( ${lang}_compiler_is_mpiwrapper false )
+ foreach( mpiwrapper ${_MPI_${lang}_COMPILER_NAMES} )
+ if( "${mpiwrapper}" STREQUAL "${compiler_wo_path}" )
+ set( ${lang}_compiler_is_mpiwrapper true )
+ endif()
+ endforeach()
+ if( ${lang}_compiler_is_mpiwrapper )
+ list( REMOVE_ITEM _MPI_${lang}_COMPILER_NAMES ${compiler_wo_path} )
+ list( INSERT _MPI_${lang}_COMPILER_NAMES 0 ${compiler_wo_path} )
+ endif()
endforeach()
There is probably a better way to do this, but you get the idea. In my setup, I'm trying to get FindMPI.cmake to select mpiicpc over mpicc without manually setting the MPI_${lang}_COMPILER manually.
> Also I'm not sure we fully support using a MPI compiler
> as the main compiler. I can't think of anything that
> definitely won't work, but we don't have nightly testing
> for the case.
My project does nightly regressions with and without the use of MPI compiler wrappers. I have never had a problem using the compiler wrappers (e.g.: mpicc, mpiicpc, Cray's CC). Additionally, I think Trilinos (trilinos.org) requires the use of compiler wrappers to build their code (cmake build system).
-kt
More information about the cmake-developers
mailing list