Skip to content

Commit 1c3c23b

Browse files
committed
use mpi_launcher.cmake
correct old mistake in TEST_LAUNCHER
1 parent 968a6a1 commit 1c3c23b

File tree

5 files changed

+47
-37
lines changed

5 files changed

+47
-37
lines changed

CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.19...3.28)
1+
cmake_minimum_required(VERSION 3.19...3.29)
22

33
project(FortranMPIexamples
44
LANGUAGES C Fortran
@@ -12,6 +12,7 @@ message(STATUS "CMake ${CMAKE_VERSION} Generator ${CMAKE_GENERATOR} Build type
1212

1313
# this has checks that can be reused in other projects as well
1414
include(cmake/mpi.cmake)
15+
include(cmake/mpi_launcher.cmake)
1516

1617
include(cmake/print_target_props.cmake)
1718
print_target_props(MPI::MPI_Fortran)

cmake/mpi.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ message(STATUS "MPI_Fortran_LINK_FLAGS: ${MPI_Fortran_LINK_FLAGS}")
1717

1818
include(${CMAKE_CURRENT_LIST_DIR}/openmpi.cmake)
1919

20-
2120
if(MPI_Fortran_HAVE_F08_MODULE)
2221
return()
2322
endif()

cmake/mpi_launcher.cmake

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
function(test_mpi_launcher target test Nworker)
2+
3+
if(NOT (DEFINED MPIEXEC_EXECUTABLE AND DEFINED MPIEXEC_NUMPROC_FLAG))
4+
message(FATAL_ERROR "MPIEXEC_EXECUTABLE and MPIEXEC_NUMPROC_FLAG must be defined to use test_mpi_launcher")
5+
endif()
6+
7+
if(NOT Nworker)
8+
message(FATAL_ERROR "Nworker must be defined to use test_mpi_launcher")
9+
endif()
10+
11+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.29)
12+
set_property(TARGET ${target} PROPERTY TEST_LAUNCHER ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${Nworker})
13+
else()
14+
set_property(TARGET ${target} PROPERTY CROSSCOMPILING_EMULATOR ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${Nworker})
15+
endif()
16+
17+
set_property(TEST ${test} PROPERTY PROCESSORS ${Nworker})
18+
19+
if(DEFINED mpi_tmpdir)
20+
set_property(TEST ${test} PROPERTY ENVIRONMENT "TMPDIR=${mpi_tmpdir}")
21+
endif()
22+
23+
endfunction()

cmake/openmpi.cmake

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
# https://github.com/open-mpi/ompi/issues/7393
22
# https://github.com/gerlero/openfoam-app/pull/112
33
# https://apple.stackexchange.com/a/287710
4-
# *** OpenMPI workaround
4+
5+
message(VERBOSE "MPI_C_LIBRARY_VERSION_STRING: ${MPI_C_LIBRARY_VERSION_STRING}")
6+
57
if(UNIX AND MPI_C_LIBRARY_VERSION_STRING MATCHES "Open[ ]?MPI")
68
if(NOT DEFINED mpi_tmpdir)
79
execute_process(COMMAND mktemp -d /tmp/mpi-XXXXXXXX
810
RESULT_VARIABLE ret
911
OUTPUT_VARIABLE mpi_tmpdir
1012
OUTPUT_STRIP_TRAILING_WHITESPACE
13+
TIMEOUT 10
1114
)
1215
if(NOT ret EQUAL 0)
1316
message(FATAL_ERROR "could not create MPI working dir via mktemp -d: ${ret}")
@@ -16,4 +19,3 @@ if(UNIX AND MPI_C_LIBRARY_VERSION_STRING MATCHES "Open[ ]?MPI")
1619
message(STATUS "${ret}: Created MPI working dir ${mpi_tmpdir}")
1720
endif()
1821
endif()
19-
# *** END OpenMPI workaround

test/CMakeLists.txt

+18-33
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
add_executable(mpi_basic_C basic.c)
22
target_link_libraries(mpi_basic_C PRIVATE MPI::MPI_C)
3-
add_test(NAME mpi_basic_C COMMAND mpi_basic_C)
3+
add_test(NAME MPIbasicC COMMAND mpi_basic_C)
4+
test_mpi_launcher(mpi_basic_C MPIbasicC 1)
45

56
add_executable(mpi_version_C mpivers.c)
67
target_link_libraries(mpi_version_C PRIVATE MPI::MPI_C)
7-
add_test(NAME mpi_version_C COMMAND mpi_version_C)
8+
add_test(NAME MPIversionC COMMAND mpi_version_C)
9+
test_mpi_launcher(mpi_version_C MPIversionC 1)
810

911
# --- Fortran MPI-3
1012

1113
add_executable(mpi_basic_Fortran basic.f90)
1214
target_link_libraries(mpi_basic_Fortran PRIVATE MPI::MPI_Fortran)
13-
add_test(NAME mpi_basic_Fortran COMMAND mpi_basic_Fortran)
15+
add_test(NAME MPIbasicFortran COMMAND mpi_basic_Fortran)
16+
test_mpi_launcher(mpi_basic_Fortran MPIbasicFortran 1)
1417

1518
add_executable(mpi_version_Fortran mpivers.f90)
1619
target_link_libraries(mpi_version_Fortran PRIVATE MPI::MPI_Fortran)
17-
add_test(NAME mpi_version_Fortran COMMAND mpi_version_Fortran)
20+
add_test(NAME MPIversionFortran COMMAND mpi_version_Fortran)
21+
test_mpi_launcher(mpi_version_Fortran MPIversionFortran 1)
1822

1923
# --- more than one MPI image
2024

2125
add_executable(mpi_hello helloworld.f90)
2226
target_link_libraries(mpi_hello PRIVATE MPI::MPI_Fortran)
23-
add_test(NAME mpi_hello COMMAND mpi_hello)
24-
set_property(TEST mpi_hello PROPERTY FIXTURES_SETUP mpi_fxt)
27+
add_test(NAME MPIhello COMMAND mpi_hello)
28+
test_mpi_launcher(mpi_hello MPIhello ${MPIEXEC_MAX_NUMPROCS})
29+
set_property(TEST MPIhello PROPERTY FIXTURES_SETUP mpi_fxt)
2530

2631
# --- actual message passing
2732

@@ -30,37 +35,17 @@ target_link_libraries(mpi_pass PRIVATE MPI::MPI_Fortran)
3035

3136
if(MPIEXEC_MAX_NUMPROCS GREATER_EQUAL 2)
3237

33-
add_test(NAME mpi_pass COMMAND mpi_pass)
34-
set_property(TEST mpi_pass PROPERTY FIXTURES_REQUIRED mpi_fxt)
38+
add_test(NAME MPIpass COMMAND mpi_pass)
39+
test_mpi_launcher(mpi_pass MPIpass 2)
40+
set_property(TEST MPIpass PROPERTY FIXTURES_REQUIRED mpi_fxt)
3541

3642
endif()
3743

3844
# --- test properties
3945

4046
get_property(tests DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY TESTS)
4147

42-
set_property(TEST ${tests} PROPERTY cpu_mpi)
43-
44-
set_property(TEST ${tests} PROPERTY SKIP_REGULAR_EXPRESSION "No host list provided")
45-
46-
# convenience vars
47-
set(single mpi_basic_C mpi_version_C mpi_basic_Fortran mpi_version_Fortran)
48-
set(_m ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG})
49-
50-
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.29)
51-
52-
set_property(TEST ${single} PROPERTY TEST_LAUNCHER ${_m} 1)
53-
set_property(TEST mpi_hello PROPERTY TEST_LAUNCHER ${_m} ${MPIEXEC_MAX_NUMPROCS})
54-
set_property(TEST mpi_pass PROPERTY TEST_LAUNCHER ${_m} 2)
55-
56-
else()
57-
58-
set_property(TARGET ${single} PROPERTY CROSSCOMPILING_EMULATOR ${_m} 1)
59-
set_property(TARGET mpi_hello PROPERTY CROSSCOMPILING_EMULATOR ${_m} ${MPIEXEC_MAX_NUMPROCS})
60-
set_property(TARGET mpi_pass PROPERTY CROSSCOMPILING_EMULATOR ${_m} 2)
61-
62-
endif()
63-
64-
if(DEFINED mpi_tmpdir)
65-
set_property(TEST ${tests} PROPERTY ENVIRONMENT TMPDIR=${mpi_tmpdir})
66-
endif()
48+
set_tests_properties(${tests} PROPERTIES
49+
RESOURCE_LOCK mpi
50+
SKIP_REGULAR_EXPRESSION "No host list provided"
51+
)

0 commit comments

Comments
 (0)