@@ -137,6 +137,128 @@ if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) )
137
137
find_package ( MPI REQUIRED )
138
138
endif ()
139
139
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 ()
140
262
141
263
#----------------
142
264
# Setup MPI flags
0 commit comments