Skip to content

Commit ce68d3e

Browse files
committed
Fix Intel MPI handling on Windows.
1 parent ee00b23 commit ce68d3e

File tree

3 files changed

+209
-166
lines changed

3 files changed

+209
-166
lines changed

CMakeLists.txt

Lines changed: 5 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -283,43 +283,11 @@ if (C_COMPILER_NAME MATCHES "^[mM][pP][iI]")
283283
endif()
284284

285285
if(WIN32) # Only support building with GCC & GFortran using Intel MPI (OneAPI)
286-
# Here we assume Intel ONEAPI and the environment is loaded
287-
set( MPI_ASSUME_NO_BUILTIN_MPI TRUE )
288-
set( MPI_CXX_SKIP_MPICXX TRUE )
289-
cmake_path(SET MPI_ROOT NORMALIZE "$ENV{I_MPI_ROOT}")
290-
set (IMPI_LIB_DIR "${MPI_ROOT}/lib")
291-
set (IMPI_DLL_DIR "${MPI_ROOT}/bin")
292-
293-
message(STATUS "Looking in IMPI_LIB_DIR=${IMPI_LIB_DIR}")
294-
message(STATUS "Looking in IMPI_DLL_DIR=${IMPI_DLL_DIR}")
295-
find_library(IMPI_LIB
296-
"impi.lib"
297-
HINTS "${IMPI_LIB_DIR}"
298-
PATH_SUFFIXES "${IMPI_BUILD}"
299-
DOC "Location of the Intel MPI impi.lib file"
300-
REQUIRED
301-
NO_DEFAULT_PATH)
302-
303-
find_file(IMPI_DLL
304-
"impi.dll"
305-
HINTS "${IMPI_DLL_DIR}"
306-
PATH_SUFFIXES "${IMPI_BUILD}"
307-
DOC "Location of the Intel MPI impi.dll file"
308-
REQUIRED
309-
NO_DEFAULT_PATH)
310-
311-
312-
set( MPI_C_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI C libs to link" )
313-
set( MPI_C_LIB_NAMES impi CACHE FILEPATH "MPI lib names" )
314-
set( MPI_Fortran_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI Fortran libs to link" )
315-
set( MPI_Fortran_LIB_NAMES impi CACHE FILEPATH "MPI Fortran lib names" )
316-
set( MPI_impi_LIBRARY ${IMPI_LIB} CACHE FILEPATH "MPI lib to link" )
317-
318-
set(MPI_Fortran_HAVE_F90_MODULE FALSE)
319-
set(MPI_Fortran_HAVE_F08_MODULE FALSE)
320-
286+
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH})
287+
find_package( Win32IntelMPI)
288+
else()
289+
find_package( MPI )
321290
endif()
322-
find_package( MPI )
323291

324292
if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) OR (NOT MPIEXEC_EXECUTABLE))
325293
# Get default install location of MPICH from install.sh
@@ -339,7 +307,6 @@ MPIEXEC_EXECUTABLE = ${MPIEXEC_EXECUTABLE}
339307
HINTS "${FTN_COMPILER_DIR}" "${C_COMPILER_DIR}"
340308
PATH_SUFFIXES bin)
341309
set ( MPI_HOME "${MPI_HOME}" "${MY_MPI_EXEC}" "${MY_MPI_EXEC}/.." )
342-
find_package( MPI REQUIRED )
343310
endif()
344311
list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_DIRS)
345312

@@ -408,130 +375,6 @@ https://github.com/sourceryinstitute/OpenCoarrays/issues/317.
408375
endif()
409376
endif()
410377

411-
#--------------------------------------------------------
412-
# Make sure a simple "hello world" C mpi program compiles
413-
#--------------------------------------------------------
414-
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
415-
set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_OPTIONS} ${MPI_C_LINK_FLAGS})
416-
set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
417-
set(CMAKE_REQUIRED_DEFINITIONS ${MPI_C_COMPILE_DEFINITIONS})
418-
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
419-
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_DIRS})
420-
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
421-
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES})
422-
include (CheckCSourceCompiles)
423-
CHECK_C_SOURCE_COMPILES("
424-
#include <mpi.h>
425-
#include <stdio.h>
426-
int main(int argc, char** argv) {
427-
MPI_Init(NULL, NULL);
428-
int world_size;
429-
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
430-
int world_rank;
431-
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
432-
char processor_name[MPI_MAX_PROCESSOR_NAME];
433-
int name_len;
434-
MPI_Get_processor_name(processor_name, &name_len);
435-
printf(\"Hello world from processor %s, rank %d out of %d processors\",
436-
processor_name, world_rank, world_size);
437-
MPI_Finalize();
438-
}"
439-
MPI_C_COMPILES)
440-
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
441-
set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
442-
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
443-
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
444-
unset(OLD_REQUIRED_FLAGS)
445-
unset(OLD_INCLUDES)
446-
unset(OLD_LIBRARIES)
447-
448-
if (NOT MPI_C_COMPILES)
449-
message(FATAL_ERROR "MPI_C is missing! "
450-
"Try setting MPI_C_COMPILER to the appropriate C compiler wrapper script and reconfigure. "
451-
"i.e., `cmake -DMPI_C_COMPILER=/path/to/mpicc ..` or set it by editing the cache using "
452-
"cmake-gui or ccmake."
453-
)
454-
endif()
455-
456-
#--------------------------------------------------------------
457-
# Make sure a simple "hello world" Fortran mpi program compiles
458-
# Try using mpi.mod first then fall back on includ 'mpif.h'
459-
#--------------------------------------------------------------
460-
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
461-
set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_OPTIONS} ${MPI_Fortran_LINK_FLAGS})
462-
set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
463-
set(CMAKE_REQUIRED_DEFINITIONS ${MPI_Fortran_COMPILE_DEFINITIONS})
464-
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
465-
set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_INCLUDE_DIRS})
466-
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
467-
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
468-
include (CheckFortranSourceCompiles)
469-
CHECK_Fortran_SOURCE_COMPILES("
470-
program mpi_hello
471-
use mpi
472-
implicit none
473-
integer :: ierr, mpi_world_size, mpi_world_rank, res_len
474-
character*(MPI_MAX_PROCESSOR_NAME) :: proc
475-
call mpi_init(ierr)
476-
call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
477-
call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
478-
call mpi_get_processor_name(proc,res_len,ierr)
479-
write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
480-
call mpi_finalize(ierr)
481-
end program
482-
"
483-
MPI_Fortran_MODULE_COMPILES)
484-
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
485-
set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
486-
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
487-
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
488-
unset(OLD_REQUIRED_FLAGS)
489-
unset(OLD_INCLUDES)
490-
unset(OLD_LIBRARIES)
491-
492-
#--------------------------------
493-
# If that failed try using mpif.h
494-
#--------------------------------
495-
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
496-
set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_OPTIONS} ${MPI_Fortran_LINK_FLAGS})
497-
set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
498-
set(CMAKE_REQUIRED_DEFINITIONS ${MPI_Fortra_COMPILE_DEFINITIONS})
499-
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
500-
set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_INCLUDE_DIRS})
501-
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
502-
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
503-
include (CheckFortranSourceCompiles)
504-
CHECK_Fortran_SOURCE_COMPILES("
505-
program mpi_hello
506-
implicit none
507-
include 'mpif.h'
508-
integer :: ierr, mpi_world_size, mpi_world_rank, res_len
509-
character*(MPI_MAX_PROCESSOR_NAME) :: proc
510-
call mpi_init(ierr)
511-
call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
512-
call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
513-
call mpi_get_processor_name(proc,res_len,ierr)
514-
write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
515-
call mpi_finalize(ierr)
516-
end program
517-
"
518-
MPI_Fortran_INCLUDE_COMPILES)
519-
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
520-
set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
521-
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
522-
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
523-
unset(OLD_REQUIRED_FLAGS)
524-
unset(OLD_INCLUDES)
525-
unset(OLD_LIBRARIES)
526-
527-
if ( (NOT MPI_Fortran_MODULE_COMPILES) AND (NOT MPI_Fortran_INCLUDE_COMPILES) )
528-
message ( WARNING "It appears that the Fortran MPI compiler is not working. "
529-
"For OpenCoarrays Aware compilers, this may be irrelavent: "
530-
" The src/extensions/opencoarrays.F90 module will be disabled, but it is "
531-
" possible that the build will succeed, despite this fishy circumstance."
532-
)
533-
endif()
534-
535378
if ( MPI_Fortran_MODULE_COMPILES )
536379
add_definitions(-DMPI_WORKING_MODULE)
537380
else()
@@ -572,7 +415,7 @@ find_program(BASH_EXECUTABLE bash
572415
REQUIRED)
573416
function(caf_compile_executable target main_depend)
574417
set(includes "")
575-
foreach(includedir ${MPI_Fortran_INCLUDE_DIRS})
418+
foreach(includedir ${MPI_Fortran_COMPILER_INCLUDE_DIRS})
576419
list(APPEND includes "-I${includedir}")
577420
endforeach()
578421
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)

cmake/FindWin32IntelMPI.cmake

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
# FindWin32IntelMPI: Find Intel oneAPI MPI for Win32
2+
3+
# Here we assume Intel ONEAPI and the environment is loaded
4+
set( MPI_ASSUME_NO_BUILTIN_MPI TRUE )
5+
set( MPI_CXX_SKIP_MPICXX TRUE )
6+
cmake_path(SET MPI_ROOT NORMALIZE "$ENV{I_MPI_ROOT}")
7+
set (IMPI_LIB_DIR "${MPI_ROOT}/lib")
8+
set (IMPI_DLL_DIR "${MPI_ROOT}/bin")
9+
10+
message(STATUS "Looking in IMPI_LIB_DIR=${IMPI_LIB_DIR}")
11+
message(STATUS "Looking in IMPI_DLL_DIR=${IMPI_DLL_DIR}")
12+
find_library(IMPI_LIB
13+
"impi.lib"
14+
HINTS "${IMPI_LIB_DIR}"
15+
PATH_SUFFIXES "${IMPI_BUILD}"
16+
DOC "Location of the Intel MPI impi.lib file"
17+
REQUIRED
18+
NO_DEFAULT_PATH)
19+
20+
find_file(IMPI_DLL
21+
"impi.dll"
22+
HINTS "${IMPI_DLL_DIR}"
23+
PATH_SUFFIXES "${IMPI_BUILD}"
24+
DOC "Location of the Intel MPI impi.dll file"
25+
REQUIRED
26+
NO_DEFAULT_PATH)
27+
28+
set( MPI_C_COMPILER ${CMAKE_C_COMPILER} CACHE FILEPATH "MPI C compiler" FORCE)
29+
set( MPI_C_COMPILER_INCLUDE_DIRS "${MPI_ROOT}/include" CACHE FILEPATH "MPI C include dir")
30+
set( MPI_C_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI C libs to link" )
31+
set( MPI_C_LIB_PATHS "${MPI_ROOT}" CACHE FILEPATH "MPI C lib's paths to link" )
32+
33+
set( MPI_Fortran_COMPILER ${CMAKE_Fortran_COMPILER} CACHE FILEPATH "MPI Fortran compiler" FORCE)
34+
set( MPI_Fortran_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI Fortran libs to link" FORCE)
35+
set( MPI_Fortran_COMPILER_INCLUDE_DIRS "${MPI_ROOT}/include" CACHE FILEPATH "MPI Fortran include dir")
36+
set( MPI_Fortran_MODULE_DIRS "${MPI_ROOT}/include/mpi" CACHE FILEPATH "MPI Fortran module dir")
37+
set( MPI_Fortran_LIB_PATHS "${MPI_ROOT}" CACHE FILEPATH "MPI libraries paths for Fortran")
38+
39+
set( MPIEXEC_EXECUTABLE "${MPI_ROOT}/bin/mpiexec.exe" CACHE FILEPATH "Path to mpiexec")
40+
set( MPI_impi_LIBRARY "${IMPI_LIB}" CACHE FILEPATH "MPI lib to link" )
41+
42+
set(MPI_Fortran_HAVE_F90_MODULE FALSE)
43+
set(MPI_Fortran_HAVE_F08_MODULE FALSE)
44+
45+
#--------------------------------------------------------
46+
# Make sure a simple "hello world" C mpi program compiles
47+
#--------------------------------------------------------
48+
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
49+
set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_OPTIONS} ${MPI_C_LINK_FLAGS})
50+
set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
51+
set(CMAKE_REQUIRED_DEFINITIONS ${MPI_C_COMPILE_DEFINITIONS})
52+
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
53+
set(CMAKE_REQUIRED_INCLUDES ${MPI_C_COMPILER_INCLUDE_DIRS})
54+
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
55+
if(WIN32)
56+
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES})
57+
else()
58+
set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES})
59+
endif()
60+
set(OLD_LINK_DIRECTORIES ${CMAKE_REQUIRED_LINK_DIRECTORIES})
61+
set(CMAKE_REQUIRED_LINK_DIRECTORIES ${MPI_C_LIB_PATHS})
62+
include (CheckCSourceCompiles)
63+
CHECK_C_SOURCE_COMPILES("
64+
#include <mpi.h>
65+
#include <stdio.h>
66+
int main(int argc, char** argv) {
67+
MPI_Init(NULL, NULL);
68+
int world_size;
69+
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
70+
int world_rank;
71+
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
72+
char processor_name[MPI_MAX_PROCESSOR_NAME];
73+
int name_len;
74+
MPI_Get_processor_name(processor_name, &name_len);
75+
printf(\"Hello world from processor %s, rank %d out of %d processors\",
76+
processor_name, world_rank, world_size);
77+
MPI_Finalize();
78+
}"
79+
MPI_C_COMPILES)
80+
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
81+
set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
82+
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
83+
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
84+
set(CMAKE_REQUIRED_LINK_DIRECTORIES ${OLD_LINK_DIRECTORIES})
85+
unset(OLD_REQUIRED_FLAGS)
86+
unset(OLD_INCLUDES)
87+
unset(OLD_LIBRARIES)
88+
unset(OLD_LINK_LIBRARIES)
89+
unset(OLD_LINK_DIRECTORIES)
90+
91+
if (NOT MPI_C_COMPILES)
92+
message(FATAL_ERROR "MPI_C is missing! "
93+
"Try setting MPI_C_COMPILER to the appropriate C compiler wrapper script and reconfigure. "
94+
"i.e., `cmake -DMPI_C_COMPILER=/path/to/mpicc ..` or set it by editing the cache using "
95+
"cmake-gui or ccmake."
96+
)
97+
endif()
98+
99+
#--------------------------------------------------------------
100+
# Make sure a simple "hello world" Fortran mpi program compiles
101+
# Try using mpi.mod first then fall back on includ 'mpif.h'
102+
#--------------------------------------------------------------
103+
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
104+
set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_OPTIONS} ${MPI_Fortran_LINK_FLAGS})
105+
set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
106+
set(CMAKE_REQUIRED_DEFINITIONS ${MPI_Fortran_COMPILE_DEFINITIONS})
107+
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
108+
set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_COMPILER_INCLUDE_DIRS};${MPI_Fortran_MODULE_DIRS})
109+
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
110+
if(WIN32)
111+
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
112+
else()
113+
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
114+
endif()
115+
set(OLD_LINK_DIRECTORIES ${CMAKE_REQUIRED_LINK_DIRECTORIES})
116+
set(CMAKE_REQUIRED_LINK_DIRECTORIES ${MPI_Fortran_LIB_PATHS})
117+
include (CheckFortranSourceCompiles)
118+
CHECK_Fortran_SOURCE_COMPILES("
119+
program mpi_hello
120+
use mpi
121+
implicit none
122+
integer :: ierr, mpi_world_size, mpi_world_rank, res_len
123+
character*(MPI_MAX_PROCESSOR_NAME) :: proc
124+
call mpi_init(ierr)
125+
call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
126+
call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
127+
call mpi_get_processor_name(proc,res_len,ierr)
128+
write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
129+
call mpi_finalize(ierr)
130+
end program
131+
"
132+
MPI_Fortran_MODULE_COMPILES)
133+
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
134+
set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
135+
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
136+
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
137+
set(CMAKE_REQUIRED_LINK_DIRECTORIES ${OLD_LINK_DIRECTORIES})
138+
unset(OLD_REQUIRED_FLAGS)
139+
unset(OLD_INCLUDES)
140+
unset(OLD_LIBRARIES)
141+
unset(OLD_LINK_LIBRARIES)
142+
unset(OLD_LINK_DIRECTORIES)
143+
144+
#--------------------------------
145+
# If that failed try using mpif.h
146+
#--------------------------------
147+
set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
148+
set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_OPTIONS} ${MPI_Fortran_LINK_FLAGS})
149+
set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
150+
set(CMAKE_REQUIRED_DEFINITIONS ${MPI_Fortran_COMPILE_DEFINITIONS})
151+
set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
152+
set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_COMPILER_INCLUDE_DIRS};${MPI_Fortran_MODULE_DIRS})
153+
set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
154+
if(WIN32)
155+
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
156+
else()
157+
set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
158+
endif()
159+
set(OLD_LINK_DIRECTORIES ${CMAKE_REQUIRED_LINK_DIRECTORIES})
160+
set(CMAKE_REQUIRED_LINK_DIRECTORIES ${MPI_Fortran_LIB_PATHS})
161+
include (CheckFortranSourceCompiles)
162+
CHECK_Fortran_SOURCE_COMPILES("
163+
program mpi_hello
164+
implicit none
165+
include 'mpif.h'
166+
integer :: ierr, mpi_world_size, mpi_world_rank, res_len
167+
character*(MPI_MAX_PROCESSOR_NAME) :: proc
168+
call mpi_init(ierr)
169+
call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
170+
call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
171+
call mpi_get_processor_name(proc,res_len,ierr)
172+
write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
173+
call mpi_finalize(ierr)
174+
end program
175+
"
176+
MPI_Fortran_INCLUDE_COMPILES)
177+
set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
178+
set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
179+
set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES})
180+
set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES})
181+
set(CMAKE_REQUIRED_LINK_DIRECTORIES ${OLD_LINK_DIRECTORIES})
182+
unset(OLD_REQUIRED_FLAGS)
183+
unset(OLD_INCLUDES)
184+
unset(OLD_LIBRARIES)
185+
unset(OLD_LINK_LIBRARIES)
186+
unset(OLD_LINK_DIRECTORIES)
187+
188+
if ( (NOT MPI_Fortran_MODULE_COMPILES) AND (NOT MPI_Fortran_INCLUDE_COMPILES) )
189+
message ( WARNING "It appears that the Fortran MPI compiler is not working. "
190+
"For OpenCoarrays Aware compilers, this may be irrelavent: "
191+
" The src/extensions/opencoarrays.F90 module will be disabled, but it is "
192+
" possible that the build will succeed, despite this fishy circumstance."
193+
)
194+
else()
195+
set(MPI_C_FOUND TRUE)
196+
set(MPI_Fortran_FOUND TRUE)
197+
endif()

0 commit comments

Comments
 (0)