Skip to content

Commit cf525aa

Browse files
committed
Move MPI runtime JSON generation to Python
1 parent 4305ab2 commit cf525aa

2 files changed

Lines changed: 63 additions & 30 deletions

File tree

cmake/mpi.cmake

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,9 @@ set(PPC_MPI_EXTENSIONS_HOME
44
""
55
CACHE PATH "Path to an unpacked mpi-extensions Open MPI package")
66

7-
function(_ppc_json_escape output value)
8-
set(escaped "${value}")
9-
string(REPLACE "\\" "\\\\" escaped "${escaped}")
10-
string(REPLACE "\"" "\\\"" escaped "${escaped}")
11-
string(REPLACE "\n" "\\n" escaped "${escaped}")
12-
string(REPLACE "\r" "\\r" escaped "${escaped}")
13-
string(REPLACE "\t" "\\t" escaped "${escaped}")
14-
set(${output}
15-
"${escaped}"
16-
PARENT_SCOPE)
17-
endfunction()
18-
197
if(NOT WIN32)
8+
find_package(Python REQUIRED COMPONENTS Interpreter)
9+
2010
if(NOT PPC_MPI_EXTENSIONS_HOME)
2111
message(
2212
FATAL_ERROR
@@ -67,24 +57,23 @@ if(NOT WIN32)
6757
list(PREPEND CMAKE_INSTALL_RPATH "${_PPC_MPI_EXTENSIONS_LIB}")
6858

6959
set(_PPC_MPI_RUNTIME_CONFIG "${CMAKE_BINARY_DIR}/ppc_mpi_runtime_env.json")
70-
_ppc_json_escape(_PPC_MPI_EXTENSIONS_HOME_JSON "${PPC_MPI_EXTENSIONS_HOME}")
71-
_ppc_json_escape(_MPIEXEC_EXECUTABLE_JSON "${MPIEXEC_EXECUTABLE}")
72-
_ppc_json_escape(_PPC_MPI_EXTENSIONS_BIN_JSON "${_PPC_MPI_EXTENSIONS_BIN}")
73-
_ppc_json_escape(_PPC_MPI_EXTENSIONS_LIB_JSON "${_PPC_MPI_EXTENSIONS_LIB}")
74-
file(
75-
WRITE "${_PPC_MPI_RUNTIME_CONFIG}"
76-
"{\n"
77-
" \"mpi_extensions_home\": \"${_PPC_MPI_EXTENSIONS_HOME_JSON}\",\n"
78-
" \"mpi_exec\": \"${_MPIEXEC_EXECUTABLE_JSON}\",\n"
79-
" \"path_prepend\": \"${_PPC_MPI_EXTENSIONS_BIN_JSON}\",\n"
80-
" \"library_path_prepend\": \"${_PPC_MPI_EXTENSIONS_LIB_JSON}\",\n"
81-
" \"env\": {\n"
82-
" \"MPI_EXTENSIONS_HOME\": \"${_PPC_MPI_EXTENSIONS_HOME_JSON}\",\n"
83-
" \"MPI_HOME\": \"${_PPC_MPI_EXTENSIONS_HOME_JSON}\",\n"
84-
" \"OPAL_PREFIX\": \"${_PPC_MPI_EXTENSIONS_HOME_JSON}\",\n"
85-
" \"OMPI_MCA_shmem\": \"mmap\"\n"
86-
" }\n"
87-
"}\n")
60+
execute_process(
61+
COMMAND
62+
"${Python_EXECUTABLE}"
63+
"${CMAKE_SOURCE_DIR}/scripts/write_mpi_runtime_env.py" --output
64+
"${_PPC_MPI_RUNTIME_CONFIG}" --mpi-extensions-home
65+
"${PPC_MPI_EXTENSIONS_HOME}" --mpi-exec "${MPIEXEC_EXECUTABLE}"
66+
--path-prepend "${_PPC_MPI_EXTENSIONS_BIN}" --library-path-prepend
67+
"${_PPC_MPI_EXTENSIONS_LIB}"
68+
RESULT_VARIABLE _PPC_MPI_RUNTIME_CONFIG_RESULT
69+
OUTPUT_VARIABLE _PPC_MPI_RUNTIME_CONFIG_OUTPUT
70+
ERROR_VARIABLE _PPC_MPI_RUNTIME_CONFIG_ERROR)
71+
if(NOT _PPC_MPI_RUNTIME_CONFIG_RESULT EQUAL 0)
72+
message(
73+
FATAL_ERROR
74+
"Failed to write MPI runtime config:\n"
75+
"${_PPC_MPI_RUNTIME_CONFIG_OUTPUT}${_PPC_MPI_RUNTIME_CONFIG_ERROR}")
76+
endif()
8877
install(FILES "${_PPC_MPI_RUNTIME_CONFIG}" DESTINATION ".")
8978
endif()
9079

scripts/write_mpi_runtime_env.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env python3
2+
3+
from __future__ import annotations
4+
5+
import argparse
6+
import json
7+
from pathlib import Path
8+
9+
10+
def parse_args() -> argparse.Namespace:
11+
parser = argparse.ArgumentParser(
12+
description="Write the PPC MPI runtime environment JSON file."
13+
)
14+
parser.add_argument("--output", required=True, type=Path)
15+
parser.add_argument("--mpi-extensions-home", required=True)
16+
parser.add_argument("--mpi-exec", required=True)
17+
parser.add_argument("--path-prepend", required=True)
18+
parser.add_argument("--library-path-prepend", required=True)
19+
return parser.parse_args()
20+
21+
22+
def main() -> None:
23+
args = parse_args()
24+
runtime_config = {
25+
"mpi_extensions_home": args.mpi_extensions_home,
26+
"mpi_exec": args.mpi_exec,
27+
"path_prepend": args.path_prepend,
28+
"library_path_prepend": args.library_path_prepend,
29+
"env": {
30+
"MPI_EXTENSIONS_HOME": args.mpi_extensions_home,
31+
"MPI_HOME": args.mpi_extensions_home,
32+
"OPAL_PREFIX": args.mpi_extensions_home,
33+
"OMPI_MCA_shmem": "mmap",
34+
},
35+
}
36+
37+
args.output.parent.mkdir(parents=True, exist_ok=True)
38+
args.output.write_text(
39+
json.dumps(runtime_config, indent=2) + "\n", encoding="utf-8"
40+
)
41+
42+
43+
if __name__ == "__main__":
44+
main()

0 commit comments

Comments
 (0)