@@ -137,6 +137,128 @@ if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) )
137137 find_package ( MPI REQUIRED )
138138endif ()
139139
140+ #--------------------------------------------------------
141+ # Make sure a simple "hello world" C mpi program compiles
142+ #--------------------------------------------------------
143+ set (OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
144+ set (CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_FLAGS} ${MPI_C_LINK_FLAGS} )
145+ set (OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES} )
146+ set (CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_PATH} )
147+ set (OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} )
148+ set (CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES} )
149+ include (CheckCSourceCompiles)
150+ CHECK_C_SOURCE_COMPILES("
151+ #include <mpi.h>
152+ #include <stdio.h>
153+ int main(int argc, char** argv) {
154+ MPI_Init(NULL, NULL);
155+ int world_size;
156+ MPI_Comm_size(MPI_COMM_WORLD, &world_size);
157+ int world_rank;
158+ MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
159+ char processor_name[MPI_MAX_PROCESSOR_NAME];
160+ int name_len;
161+ MPI_Get_processor_name(processor_name, &name_len);
162+ printf('Hello world from processor %s, rank %d out of %d processors',
163+ processor_name, world_rank, world_size);
164+ MPI_Finalize();
165+ }"
166+ MPI_C_COMPILES)
167+ set (CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS} )
168+ set (CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES} )
169+ set (CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES} )
170+ unset (OLD_REQUIRED_FLAGS)
171+ unset (OLD_INCLUDES)
172+ unset (OLD_LIBRARIES)
173+
174+ if (NOT MPI_C_COMPILES)
175+ message (FATAL_ERROR "MPI_C is missing!"
176+ "Try setting MPI_C_COMPILER to the appropriate C compiler wrapper script and reconfigure."
177+ "i.e., `cmake -DMPI_C_COMPILER=/path/to/mpicc ..` or set it by editing the cache using"
178+ "cmake-gui or ccmake."
179+ )
180+ endif ()
181+
182+ #--------------------------------------------------------------
183+ # Make sure a simple "hello world" Fortran mpi program compiles
184+ # Try using mpi.mod first then fall back on includ 'mpif.h'
185+ #--------------------------------------------------------------
186+ set (OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
187+ set (CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_FLAGS} ${MPI_Fortran_LINK_FLAGS} )
188+ set (OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES} )
189+ set (CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_INCLUDE_PATH} )
190+ set (OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} )
191+ set (CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES} )
192+ include (CheckCSourceCompiles)
193+ CHECK_Fortran_SOURCE_COMPILES("
194+ program mpi_hello
195+ use mpi
196+ implicit none
197+ integer :: ierr, mpi_world_size, mpi_world_rank, res_len
198+ character*(MPI_MAX_PROCESSOR_NAME) :: proc
199+ call mpi_init(ierr)
200+ call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
201+ call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
202+ call mpi_get_processor_name(proc,res_len,ierr)
203+ write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
204+ call mpi_finalize(ierr)
205+ end program
206+ "
207+ MPI_Fortran_MODULE_COMPILES)
208+ set (CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS} )
209+ set (CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES} )
210+ set (CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES} )
211+ unset (OLD_REQUIRED_FLAGS)
212+ unset (OLD_INCLUDES)
213+ unset (OLD_LIBRARIES)
214+
215+ #--------------------------------
216+ # If that failed try using mpif.h
217+ #--------------------------------
218+ set (OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
219+ set (CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_FLAGS} ${MPI_Fortran_LINK_FLAGS} )
220+ set (OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES} )
221+ set (CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_INCLUDE_PATH} )
222+ set (OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} )
223+ set (CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES} )
224+ include (CheckCSourceCompiles)
225+ CHECK_Fortran_SOURCE_COMPILES("
226+ program mpi_hello
227+ implicit none
228+ include 'mpif.h'
229+ integer :: ierr, mpi_world_size, mpi_world_rank, res_len
230+ character*(MPI_MAX_PROCESSOR_NAME) :: proc
231+ call mpi_init(ierr)
232+ call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr)
233+ call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr)
234+ call mpi_get_processor_name(proc,res_len,ierr)
235+ write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.'
236+ call mpi_finalize(ierr)
237+ end program
238+ "
239+ MPI_Fortran_INCLUDE_COMPILES)
240+ set (CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS} )
241+ set (CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES} )
242+ set (CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES} )
243+ unset (OLD_REQUIRED_FLAGS)
244+ unset (OLD_INCLUDES)
245+ unset (OLD_LIBRARIES)
246+
247+ if ( (NOT MPI_Fortran_MODULE_COMPILES) AND (NOT MPI_Fortran_INCLUDE_COMPILES) )
248+ message ( WARNING "It appears that the Fortran MPI compiler is not working."
249+ "For OpenCoarrays Aware compilers, this may be irrelavent:"
250+ " The src/extensions/opencoarrays.F90 module will be disabled, but it is"
251+ " possible that the build will succeed, despite this fishy circumstance."
252+ )
253+ endif ()
254+
255+ if ( NOT MPI_Fortran_MODULE_COMPILES )
256+ message ( WARNING "It appears that MPI was built with a different Fortran compiler."
257+ "It is possible that this may cause unpredictable behavior. The build will continue"
258+ "using `mpif.h` BUT please report any suspicious behavior to the OpenCoarrays"
259+ "developers."
260+ )
261+ endif ()
140262
141263#----------------
142264# Setup MPI flags
0 commit comments