@@ -15,7 +15,7 @@ if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
15
15
"CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} "
16
16
" == CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} "
17
17
"\n This archive does not support in-source builds:\n "
18
- "You must now delete the CMakeCache.txt file and the CMakeFiles/ directory under"
18
+ "You must now delete the CMakeCache.txt file and the CMakeFiles/ directory under "
19
19
"the 'src' source directory or you will not be able to configure correctly!"
20
20
"\n You must now run something like:\n "
21
21
" $ rm -r CMakeCache.txt CMakeFiles/"
88
88
endif ()
89
89
90
90
if (gfortran_compiler )
91
+ set (OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
91
92
set (CMAKE_REQUIRED_FLAGS "-fcoarray=single -ffree-form" )
92
93
endif ()
93
94
include (CheckFortranSourceCompiles )
@@ -99,7 +100,8 @@ CHECK_Fortran_SOURCE_COMPILES("
99
100
end program
100
101
" Check_Simple_Coarray_Fortran_Source_Compiles )
101
102
if (gfortran_compiler )
102
- unset (CMAKE_REQUIRED_FLAGS )
103
+ set (CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS} )
104
+ unset (OLD_REQUIRED_FLAGS )
103
105
endif ()
104
106
105
107
@@ -108,17 +110,161 @@ endif()
108
110
#----------------------------------------------------------------------------
109
111
110
112
# If the user passes FC=mpif90 etc. check and prefer that location
111
- get_filename_component ( FTN_MPI_DIR "${CMAKE_Fortran_COMPILER} "
113
+ get_filename_component ( FTN_COMPILER_NAME "${CMAKE_Fortran_COMPILER} "
114
+ NAME )
115
+ get_filename_component ( C_COMPILER_NAME "${CMAKE_C_COMPILER} "
116
+ NAME )
117
+ get_filename_component ( FTN_COMPILER_DIR "${CMAKE_Fortran_COMPILER} "
112
118
REALPATH )
113
- get_filename_component ( C_MPI_DIR "${CMAKE_C_COMPILER} "
119
+ get_filename_component ( C_COMPILER_DIR "${CMAKE_C_COMPILER} "
114
120
REALPATH )
115
- set ( MPI_HOME "${MPI_HOME} " "${FTN_MPI_DIR} /.." "${C_MPI_DIR} /.." )
116
121
117
- # Check the install.sh defaut mpich installation directories
118
- set ( MPI_HOME "${MPI_HOME} " "${CMAKE_SOURCE_DIR} /prerequisites/installations/mpich/3.1.4" "${CMAKE_SOURCE_DIR} /prerequisites/installations/mpich/*" )
122
+ if (FTN_COMPILER_NAME MATCHES '^[mM][pP][iI]' )
123
+ set (MPI_Fortran_COMPILER "${CMAKE_Fortran_COMPILER} " )
124
+ endif ()
125
+ if (C_COMPILER_NAME MATCHES '^[mM][pP][iI]' )
126
+ set (MPI_C_COMPILER "${CMAKE_C_COMPILER} " )
127
+ endif ()
128
+
129
+ find_package ( MPI )
130
+
131
+ if ( (NOT MPI_C_FOUND ) OR (NOT MPI_Fortran_FOUND ) )
132
+ find_program (MY_MPI_EXEC NAMES mpirun mpiexec lamexec srun
133
+ PATHS "${CMAKE_SOURCE_DIR/prerequisites/installations/mpich/3.1.4}" "${CMAKE_SOURCE_DIR} /prerequisites/installations/mpich/*" ENV PATH
134
+ HINTS "${FTN_COMPILER_DIR} " "${C_COMPILER_DIR} "
135
+ PATH_SUFFIXES bin )
136
+ set ( MPI_HOME "${MPI_HOME} " "${MY_MPI_EXEC} " "${MY_MPI_EXEC} /.." )
137
+ find_package ( MPI REQUIRED )
138
+ endif ()
119
139
120
- find_package ( MPI REQUIRED )
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 ( MPI_Fortran_MODULE_COMPILES )
256
+ add_definitions (-DMPI_WORKING_MODULE )
257
+ else ()
258
+ message ( WARNING "It appears that MPI was built with a different Fortran compiler. "
259
+ "It is possible that this may cause unpredictable behavior. The build will continue "
260
+ "using `mpif.h` BUT please report any suspicious behavior to the OpenCoarrays "
261
+ "developers."
262
+ )
263
+ endif ()
121
264
265
+ #----------------
266
+ # Setup MPI flags
267
+ #----------------
122
268
set (CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS} )
123
269
set (CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS} )
124
270
set (CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS} )
0 commit comments