|
3 | 3 | # SPDX-License-Identifier: (Apache-2.0 OR MIT) |
4 | 4 |
|
5 | 5 |
|
| 6 | +import os |
| 7 | +import re |
| 8 | + |
6 | 9 | from spack_repo.builtin.build_systems.oneapi import IntelOneApiLibraryPackage, IntelOneApiPackage |
7 | 10 |
|
8 | 11 | from spack.package import * |
@@ -192,6 +195,44 @@ class IntelOneapiMpi(IntelOneApiLibraryPackage): |
192 | 195 | provides("mpi@:3.1") |
193 | 196 | conflicts("+generic-names +classic-names") |
194 | 197 |
|
| 198 | + executables = [r"^mpiicpx$"] |
| 199 | + |
| 200 | + @classmethod |
| 201 | + def determine_version(cls, exe): |
| 202 | + output = Executable(exe)("-v", output=str, error=str) |
| 203 | + match = re.search(r"MPI Library (20\d\d(\.\d+)+)", output) |
| 204 | + return match.group(1) if match else None |
| 205 | + |
| 206 | + @classmethod |
| 207 | + def determine_variants(cls, exes, version_str): |
| 208 | + output = Executable(exes[0])("-show", output=str, error=str) |
| 209 | + lib_paths = re.findall(r'-L"?([^\s"]+)"?', output) |
| 210 | + variants_set = set() |
| 211 | + for lib_path in set(lib_paths): |
| 212 | + mpi_root = join_path(lib_path, "..") |
| 213 | + # Look for ilp64 |
| 214 | + if os.path.exists(join_path(lib_path, "libmpi_ilp64.so")): |
| 215 | + variants_set.add("+ilp64") |
| 216 | + # Look for libfabric |
| 217 | + libfabric_dir = join_path(mpi_root, "opt/mpi/libfabric/lib") |
| 218 | + if os.path.exists(join_path(libfabric_dir, "libfabric.so")): |
| 219 | + variants_set.add("~external-libfabric") |
| 220 | + # If generic executables don't exist, disable the variant |
| 221 | + mpicxx_path = join_path(mpi_root, "bin", "mpicxx") |
| 222 | + if not os.path.exists(mpicxx_path): |
| 223 | + variants_set.add("~generic-names") |
| 224 | + # If classic executables don't exist, disable the variant |
| 225 | + mpiicpc_path = join_path(mpi_root, "bin", "mpiicpc") |
| 226 | + if not os.path.exists(mpiicpc_path): |
| 227 | + variants_set.add("~classic-names") |
| 228 | + |
| 229 | + if "+ilp64" not in variants_set: |
| 230 | + variants_set.add("~ilp64") |
| 231 | + if "~external-libfabric" not in variants_set: |
| 232 | + variants_set.add("+external-libfabric") |
| 233 | + |
| 234 | + return "".join(list(variants_set)) |
| 235 | + |
195 | 236 | @property |
196 | 237 | def mpiexec(self): |
197 | 238 | return self.component_prefix.bin.mpiexec |
|
0 commit comments