@@ -7,15 +7,15 @@ set ( CMAKE_BUILD_TYPE "Release"
77set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
88
99#Name project and specify source languages
10- project (opencoarrays VERSION 1.6.3 LANGUAGES C Fortran)
10+ project (opencoarrays VERSION 1.7.5 LANGUAGES C Fortran)
1111
1212#Print an error message on an attempt to build inside the source directory tree:
1313if ("${CMAKE_CURRENT_SOURCE_DIR} " STREQUAL "${CMAKE_CURRENT_BINARY_DIR} " )
1414 message (FATAL_ERROR "ERROR! "
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,9 +100,180 @@ 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
107+
108+ #----------------------------------------------------------------------------
109+ # Find MPI and set some flags so that FC and CC can point to gfortran and gcc
110+ #----------------------------------------------------------------------------
111+
112+ # If the user passes FC=mpif90 etc. check and prefer that location
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} "
118+ REALPATH )
119+ get_filename_component ( C_COMPILER_DIR "${CMAKE_C_COMPILER} "
120+ REALPATH )
121+
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 ()
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 ( 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 ()
264+
265+ #----------------
266+ # Setup MPI flags
267+ #----------------
268+ set (CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS} )
269+ set (CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS} )
270+ set (CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS} )
271+ set (CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS} )
272+ include_directories (BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH} )
273+
274+ #-------------------------------
275+ # Recurse into the src directory
276+ #-------------------------------
105277include_directories (${CMAKE_CURRENT_SOURCE_DIR} /src)
106278
107279add_subdirectory (src)
@@ -148,9 +320,12 @@ configure_file ( "${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake.in" "${CMAKE_BINARY_
148320add_custom_target ( uninstall
149321 COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR} /uninstall.cmake" )
150322
151-
152323enable_testing ()
153324
325+ add_custom_target (check COMMAND ${CMAKE_CTEST_COMMAND} --output -on -failure)
326+ # See JSON-Fortran's CMakeLists.txt file to find out how to get the check target to depend
327+ # on the test executables
328+
154329# Determine if we're using Open MPI
155330execute_process (COMMAND ${MPIEXEC} --version
156331 OUTPUT_VARIABLE mpi_version_out)
@@ -167,7 +342,7 @@ function(add_mpi_test name num_mpi_proc path)
167342 if ( openmpi )
168343 if ( N LESS 2 )
169344 set ( num_mpi_proc 2 )
170- set (test_parameters --oversubscribed )
345+ set (test_parameters --oversubscribe )
171346 else ()
172347 set ( num_mpi_proc ${N} )
173348 endif ()
@@ -185,31 +360,44 @@ if(opencoarrays_aware_compiler)
185360 # Unit tests targeting each libcaf_mpi function, argument, and branch of code
186361 add_mpi_test(initialize_mpi 2 ${tests_root} /unit/init_register/initialize_mpi)
187362 add_mpi_test(register 2 ${tests_root} /unit/init_register/register)
188- add_mpi_test(register_rename_me 2 ${tests_root} /unit/init_register/register_rename_me )
189- add_mpi_test(register_rename_me_too 2 ${tests_root} /unit/init_register/register_rename_me_too )
363+ add_mpi_test(register_vector 2 ${tests_root} /unit/init_register/register_vector )
364+ add_mpi_test(register_alloc_vector 2 ${tests_root} /unit/init_register/register_alloc_vector )
190365 add_mpi_test(allocate_as_barrier 2 ${tests_root} /unit/init_register/allocate_as_barrier)
191366 add_mpi_test(allocate_as_barrier_proc 32 ${tests_root} /unit/init_register/allocate_as_barrier_proc)
367+ if (gfortran_compiler AND (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7))
368+ add_mpi_test(register_alloc_comp_1 2 ${tests_root} /unit/init_register/register_alloc_comp_1)
369+ add_mpi_test(register_alloc_comp_2 2 ${tests_root} /unit/init_register/register_alloc_comp_2)
370+ add_mpi_test(register_alloc_comp_3 2 ${tests_root} /unit/init_register/register_alloc_comp_3)
371+ add_mpi_test(check_remote_alloced_comp_1 6 ${tests_root} /unit/init_register/check_remote_alloced_comp_1)
372+ endif ()
192373 add_mpi_test(get_array 2 ${tests_root} /unit/send-get /get_array)
374+ add_mpi_test(get_self 2 ${tests_root} /unit/send-get /get_self)
193375 add_mpi_test(send_array 2 ${tests_root} /unit/send-get /send_array)
194376 add_mpi_test(get_with_offset_1d 2 ${tests_root} /unit/send-get /get_with_offset_1d)
195377 add_mpi_test(whole_get_array 2 ${tests_root} /unit/send-get /whole_get_array)
196378 add_mpi_test(strided_get 2 ${tests_root} /unit/send-get /strided_get)
379+ add_mpi_test(strided_sendget 3 ${tests_root} /unit/send-get /strided_sendget)
197380 add_mpi_test(co_sum 4 ${tests_root} /unit/collectives/co_sum_test)
198381 add_mpi_test(co_broadcast 4 ${tests_root} /unit/collectives/co_broadcast_test)
199382 add_mpi_test(co_min 4 ${tests_root} /unit/collectives/co_min_test)
200383 add_mpi_test(co_max 4 ${tests_root} /unit/collectives/co_max_test)
201384 add_mpi_test(syncall 32 ${tests_root} /unit/sync/syncall)
202385 add_mpi_test(syncimages 32 ${tests_root} /unit/sync/syncimages)
386+ add_mpi_test(syncimages2 32 ${tests_root} /unit/sync/syncimages2)
203387 add_mpi_test(duplicate_syncimages 8 ${tests_root} /unit/sync/duplicate_syncimages)
204388 add_mpi_test(co_reduce 4 ${tests_root} /unit/collectives/co_reduce_test)
205389 add_mpi_test(syncimages_status 32 ${tests_root} /unit/sync/syncimages_status)
390+ add_mpi_test(simpleatomics 32 ${tests_root} /unit/simple/atomics)
391+ # possible logic error in the following test
392+ # add_mpi_test(increment_my_neighbor 32 ${tests_root}/unit/simple/increment_my_neighbor)
206393
207394 # Integration tests verifying the use of libcaf_mpi in applications
208395 add_mpi_test(hello_multiverse 2 ${tests_root} /integration/coarrayHelloWorld/hello_multiverse)
209396 add_mpi_test(coarray_burgers_pde 2 ${tests_root} /integration/pde_solvers/coarrayBurgers/coarray_burgers_pde)
210397 add_mpi_test(co_heat 2 ${tests_root} /integration/pde_solvers/coarrayHeatSimplified/co_heat)
398+ add_mpi_test(asynchronous_hello_world 2 ${tests_root} /integration/events/asynchronous_hello_world)
211399 if ( ("${CMAKE_SYSTEM_PROCESSOR} " MATCHES "x86_64" ) AND ("${CMAKE_SYSTEM_NAME} " MATCHES "Linux" ) )
212- if ( NOT (DEFINED ENV{TRAVIS}))
400+ if ( ( NOT (DEFINED ENV{TRAVIS})) AND ( NOT SKIP_ASSEMBLY_DEPS) )
213401 add_mpi_test(coarray_navier_stokes 2 ${tests_root} /integration/pde_solvers/navier-stokes/coarray_navier_stokes)
214402 set_property (TEST coarray_navier_stokes PROPERTY PASS_REGULAR_EXPRESSION "Test passed." )
215403 endif ()
@@ -230,3 +418,6 @@ else()
230418 add_test (co_reduce_extension ${tests_root} /unit/extensions/test -co_reduce-extension.sh)
231419 set_property (TEST co_reduce_extension PROPERTY PASS_REGULAR_EXPRESSION "Test passed." )
232420endif ()
421+
422+ include (AddInstallationScriptTest.cmake )
423+ add_installation_script_test(installation-scripts.sh src/tests/installation/)
0 commit comments