Skip to content

Commit 95f9355

Browse files
committed
Use FindMPI on Windows
The intrinsic FindMPI module seems like it has some bugs or documentation bugs. I got this working, but it is a bit of black magic as to how/why it works. It simplifies the code, however, and should offload some maintanence upstream, so it's worth doing.
1 parent f873d11 commit 95f9355

File tree

1 file changed

+49
-81
lines changed

1 file changed

+49
-81
lines changed

CMakeLists.txt

Lines changed: 49 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -278,91 +278,59 @@ if (C_COMPILER_NAME MATCHES "^[mM][pP][iI]")
278278
endif()
279279

280280
if(WIN32) # Only support building with GCC & GFortran using Intel MPI (OneAPI)
281-
# Here we assume Intel ONEAPI and the environment is loaded
282-
cmake_path(SET MPI_ROOT NORMALIZE "$ENV{I_MPI_ROOT}")
283-
set (IMPI_INCLUDES "${MPI_ROOT}/include")
284-
set (IMPI_LIB_DIR "${MPI_ROOT}/lib/${IMPI_BUILD}")
285-
set (IMPI_DLL_DIR "${MPI_ROOT}/bin/${IMPI_BUILD}")
286-
set (IMPI_BIN_DIR "${MPI_ROOT}/bin")
287-
288-
find_library(IMPI_LIB
289-
"impi.lib"
290-
HINTS "${IMPI_LIB_DIR}"
291-
DOC "Location of the Intel MPI impi.lib file"
292-
REQUIRED
293-
NO_DEFAULT_PATH)
294-
295-
set(MPI_impi_LIBRARY "${IMPI_LIB}")
296-
set(MPI_impicxx_LIBRARY "${IMPI_LIB_DIR}/impicxx.lib")
297-
298-
find_file(IMPI_DLL
299-
"impi.dll"
300-
HINTS "${IMPI_DLL_DIR}"
301-
DOC "Location of the Intel MPI impi.dll file"
302-
REQUIRED
303-
NO_DEFAULT_PATH)
304-
305-
306-
add_library(IMPI::MPI SHARED IMPORTED)
307-
set_target_properties(IMPI::MPI
308-
PROPERTIES
309-
IMPORTED_IMPLIB "${IMPI_LIB}"
310-
IMPORTED_LOCATION "${IMPI_DLL}")
311-
target_include_directories(IMPI::MPI
312-
INTERFACE "${IMPI_INCLUDES}")
313-
314-
set(MPI_C_INCLUDE_DIRS "${IMPI_INCLUDES}")
315-
set(MPI_C_INCLUDE_PATH "${IMPI_INCLUDES}")
316-
set(MPI_C_HEADER_DIR "${IMPI_INCLUDES}")
317-
set(MPI_Fortran_COMPILER_INCLUDE_DIRS "${IMPI_INCLUDES}")
318-
set(MPI_Fortran_F77_HEADER_DIR "${IMPI_INCLUDES}")
319-
set(MPI_Fortran_INCLUDE_PATH "${IMPI_INCLUDES}")
320-
321-
set(MPI_C_LIB_NAMES impi;impicxx)
322-
set(MPI_C_LIBRARIES "${IMPI_LIB}")
323-
set(MPI_Fortran_LIB_NAMES impi)
324-
set(MPI_Fortran_LIBRARIES "${IMPI_LIB}")
325-
326-
set(MPI_Fortran_HAVE_F90_MODULE FALSE)
327-
set(MPI_Fortran_HAVE_F08_MODULE FALSE)
328-
329-
find_program(MPIEXEC_EXECUTABLE
330-
mpiexec
331-
HINTS "${IMPI_BIN_DIR}"
332-
DOC "Location of Intel MPI implementations mpiexec launcher program"
333-
REQUIRED
334-
NO_DEFAULT_PATH)
335-
set(MPIEXEC "${MPIEXEC_EXECUTABLE}")
336-
set(MPI_EXEC_NUMPROC_FLAG -n)
337-
set(MPI_EXEC_PREFLAGS -print-all-exitcodes)
338-
339-
set(MPI_C_FOUND TRUE)
340-
set(MPI_Fortran_FOUND TRUE)
341-
342-
else()
343-
find_package( MPI )
344-
345-
if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) OR (NOT MPIEXEC_EXECUTABLE))
346-
# Get default install location of MPICH from install.sh
347-
message(WARNING "Could not find all MPI components!")
348-
message(WARNING "
281+
# Here we assume Intel ONEAPI and the environment is loaded
282+
set( MPI_ASSUME_NO_BUILTIN_MPI TRUE )
283+
set( MPI_CXX_SKIP_MPICXX TRUE )
284+
cmake_path(SET MPI_ROOT NORMALIZE "$ENV{I_MPI_ROOT}")
285+
set (IMPI_LIB_DIR "${MPI_ROOT}/lib/${IMPI_BUILD}")
286+
set (IMPI_DLL_DIR "${MPI_ROOT}/bin/${IMPI_BUILD}")
287+
288+
find_library(IMPI_LIB
289+
"impi.lib"
290+
HINTS "${IMPI_LIB_DIR}"
291+
DOC "Location of the Intel MPI impi.lib file"
292+
REQUIRED
293+
NO_DEFAULT_PATH)
294+
295+
find_file(IMPI_DLL
296+
"impi.dll"
297+
HINTS "${IMPI_DLL_DIR}"
298+
DOC "Location of the Intel MPI impi.dll file"
299+
REQUIRED
300+
NO_DEFAULT_PATH)
301+
302+
303+
set( MPI_C_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI C libs to link" )
304+
set( MPI_C_LIB_NAMES impi CACHE FILEPATH "MPI lib names" )
305+
set( MPI_Fortran_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI Fortran libs to link" )
306+
set( MPI_Fortran_LIB_NAMES impi CACHE FILEPATH "MPI Fortran lib names" )
307+
set( MPI_impi_LIBRARY ${IMPI_LIB} CACHE FILEPATH "MPI lib to link" )
308+
309+
set(MPI_Fortran_HAVE_F90_MODULE FALSE)
310+
set(MPI_Fortran_HAVE_F08_MODULE FALSE)
311+
312+
endif()
313+
find_package( MPI )
314+
315+
if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) OR (NOT MPIEXEC_EXECUTABLE))
316+
# Get default install location of MPICH from install.sh
317+
message(WARNING "Could not find all MPI components!")
318+
message(WARNING "
349319
MPI_C_FOUND = ${MPI_C_FOUND}
350320
MPI_Fortran_FOUND = ${MPI_Fortran_FOUND}
351321
MPIEXEC = ${MPIEXEC_EXECUTABLE}
352322
")
353-
execute_process( COMMAND "./install.sh" -P mpich
354-
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
355-
OUTPUT_VARIABLE DEFAULT_MPICH_INSTALL_LOC
356-
OUTPUT_QUIET
357-
OUTPUT_STRIP_TRAILING_WHITESPACE
358-
)
359-
find_program (MY_MPI_EXEC NAMES mpirun mpiexec lamexec srun
360-
PATHS "${DEFAULT_MPICH_INSTALL_LOC}" ENV PATH
361-
HINTS "${FTN_COMPILER_DIR}" "${C_COMPILER_DIR}"
362-
PATH_SUFFIXES bin)
363-
set ( MPI_HOME "${MPI_HOME}" "${MY_MPI_EXEC}" "${MY_MPI_EXEC}/.." )
364-
find_package( MPI REQUIRED )
365-
endif()
323+
execute_process( COMMAND "./install.sh" -P mpich
324+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
325+
OUTPUT_VARIABLE DEFAULT_MPICH_INSTALL_LOC
326+
OUTPUT_QUIET
327+
OUTPUT_STRIP_TRAILING_WHITESPACE)
328+
find_program (MY_MPI_EXEC NAMES mpirun mpiexec lamexec srun
329+
PATHS "${DEFAULT_MPICH_INSTALL_LOC}" ENV PATH
330+
HINTS "${FTN_COMPILER_DIR}" "${C_COMPILER_DIR}"
331+
PATH_SUFFIXES bin)
332+
set ( MPI_HOME "${MPI_HOME}" "${MY_MPI_EXEC}" "${MY_MPI_EXEC}/.." )
333+
find_package( MPI REQUIRED )
366334
endif()
367335
list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_PATH)
368336

0 commit comments

Comments
 (0)