@@ -15,7 +15,7 @@ if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
1515 "CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} "
1616 " == CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} "
1717 "\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 "
1919 "the 'src' source directory or you will not be able to configure correctly!"
2020 "\n You must now run something like:\n "
2121 " $ rm -r CMakeCache.txt CMakeFiles/"
8888endif ()
8989
9090if (gfortran_compiler)
91+ set (OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
9192 set (CMAKE_REQUIRED_FLAGS "-fcoarray=single -ffree-form" )
9293endif ()
9394include (CheckFortranSourceCompiles)
@@ -99,7 +100,8 @@ CHECK_Fortran_SOURCE_COMPILES("
99100 end program
100101" Check_Simple_Coarray_Fortran_Source_Compiles)
101102if (gfortran_compiler)
102- unset (CMAKE_REQUIRED_FLAGS)
103+ set (CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS} )
104+ unset (OLD_REQUIRED_FLAGS)
103105endif ()
104106
105107
@@ -108,17 +110,161 @@ endif()
108110#----------------------------------------------------------------------------
109111
110112# 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} "
112118 REALPATH )
113- get_filename_component ( C_MPI_DIR "${CMAKE_C_COMPILER} "
119+ get_filename_component ( C_COMPILER_DIR "${CMAKE_C_COMPILER} "
114120 REALPATH )
115- set ( MPI_HOME "${MPI_HOME} " "${FTN_MPI_DIR} /.." "${C_MPI_DIR} /.." )
116121
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 ()
119139
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 ()
121264
265+ #----------------
266+ # Setup MPI flags
267+ #----------------
122268set (CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS} )
123269set (CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS} )
124270set (CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS} )
0 commit comments