spack/var/spack/repos/builtin/packages/mercury/package.py
2024-11-18 11:36:23 -08:00

166 lines
7.1 KiB
Python

# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class Mercury(CMakePackage):
"""Mercury is a C library for implementing RPC, optimized for HPC"""
homepage = "https://mercury-hpc.github.io/"
url = "https://github.com/mercury-hpc/mercury/releases/download/v1.0.1/mercury-1.0.1.tar.bz2"
git = "https://github.com/mercury-hpc/mercury.git"
maintainers("soumagne")
tags = ["e4s"]
license("GPL-2.0-only")
version("master", branch="master", submodules=True)
version("2.4.0", sha256="8926cd177f6e3c04e8ae1683d42f7c8b27163a93d4d99a305fe497fa8ca86e79")
version("2.3.1", sha256="36182d49f2db7e2b075240cab4aaa1d4ec87a7756450c87643ededd1e6f16104")
version("2.3.0", sha256="e9e62ce1bb2fd482f0e85ad75fa255d9750c6fed50ba441a03de93b3b8eae742")
version("2.2.0", sha256="e66490cf63907c3959bbb2932b5aaf51d96a481b17f0935f409f3a862eff97f6")
version("2.1.0", sha256="9a58437161e9273b1b1c484d2f1a477a89eea9afe84575415025d47656f3761b")
version("2.0.1", sha256="335946d9620ac669643ffd9861a5fb3ee486834bab674b7779eaac9d6662e3fa")
version("2.0.0", sha256="9e80923712e25df56014309df70660e828dbeabbe5fcc82ee024bcc86e7eb6b7")
version("1.0.1", sha256="02febd56c401ef7afa250caf28d012b37dee842bfde7ee16fcd2f741b9cf25b3")
version("1.0.0", sha256="fb0e44d13f4652f53e21040435f91d452bc2b629b6e98dcf5292cd0bece899d4")
version("0.9.0", sha256="40868e141cac035213fe79400f8926823fb1f5a0651fd7027cbe162b063843ef")
depends_on("c", type="build") # generated
depends_on("cxx", type="build") # generated
variant("bmi", default=False, description="Use BMI plugin")
variant("mpi", default=False, description="Use MPI plugin")
variant("ofi", default=True, when="@1.0.0:", description="Use OFI libfabric plugin")
variant("psm", default=False, when="@2.2.0:", description="Use PSM plugin")
variant("psm2", default=False, when="@2.2.0:", description="Use PSM2 plugin")
# NOTE: the sm plugin does not require any package dependency.
variant("sm", default=True, description="Use shared-memory plugin")
variant("ucx", default=False, when="@2.1.0:", description="Use UCX plugin")
# NOTE: if boostsys is False, mercury will install its own copy
# of the preprocessor headers.
variant("boostsys", default=True, description="Use preprocessor headers from boost dependency")
variant("shared", default=True, description="Build with shared libraries")
# NOTE: the 'udreg' variant requires that the MPICH_GNI_NDREG_ENTRIES=1024
# environment variable be set at run time to avoid conflicts with
# Cray-MPICH if libfabric and MPI are used at the same time
variant(
"udreg",
default=False,
when="@1.0.0:+ofi",
description="Enable udreg on supported Cray Aries platforms",
)
variant("debug", default=False, description="Enable Mercury to print debug output")
variant("checksum", default=True, description="Checksum verify all request/response messages")
variant(
"hwloc", default=False, when="@2.2.0:", description="Use hwloc to retrieve NIC information"
)
depends_on("cmake@2.8.12.2:", type="build")
depends_on("bmi", when="+bmi")
depends_on("mpi", when="+mpi")
with when("+ofi"):
depends_on("libfabric@1.5:", when="@:2.0.1")
depends_on("libfabric@1.7:", when="@2.1.0:")
# openpa dependency is removed in 2.1.0
depends_on("openpa@1.0.3:", when="@:2.0.1%gcc@:4.8")
# We only need Boost preprocessor headers
depends_on("boost@1.48:", when="+boostsys")
depends_on("boost", when="@:0.9") # internal boost headers were added in 1.0.0
depends_on("ucx+thread_multiple", when="+ucx")
# Fix CMake check_symbol_exists
# See https://github.com/mercury-hpc/mercury/issues/299
patch("fix-cmake-3.15-check_symbol_exists.patch", when="@1.0.0:1.0.1")
def flag_handler(self, name, flags):
if self.spec.satisfies("%cce"):
if name == "ldflags":
flags.append("-Wl,-z,muldefs")
return (None, None, flags)
def cmake_args(self):
"""Populate cmake arguments for Mercury."""
spec = self.spec
define = self.define
define_from_variant = self.define_from_variant
parallel_tests = "+mpi" in spec and self.run_tests
cmake_args = [
define_from_variant("BUILD_SHARED_LIBS", "shared"),
define("MERCURY_USE_BOOST_PP", True),
define_from_variant("MERCURY_USE_CHECKSUMS", "checksum"),
define("MERCURY_USE_SYSTEM_MCHECKSUM", False),
define("MERCURY_USE_XDR", False),
define_from_variant("NA_USE_BMI", "bmi"),
define_from_variant("NA_USE_MPI", "mpi"),
define_from_variant("NA_USE_SM", "sm"),
]
if "@2.3.0:" in spec:
cmake_args.append(define("BUILD_TESTING_UNIT", self.run_tests))
if "@2.2.0:" in spec:
cmake_args.extend(
[
define_from_variant("NA_USE_PSM", "psm"),
define_from_variant("NA_USE_PSM2", "psm2"),
]
)
if "+ofi" in spec:
cmake_args.append(define_from_variant("NA_OFI_USE_HWLOC", "hwloc"))
if "@2.1.0:" in spec:
cmake_args.append(define_from_variant("NA_USE_UCX", "ucx"))
if "@2.0.0:" in spec:
cmake_args.extend(
[
define_from_variant("MERCURY_ENABLE_DEBUG", "debug"),
define("MERCURY_TESTING_ENABLE_PARALLEL", parallel_tests),
]
)
# Previous versions of mercury had more extensive CMake options
if "@:1.0.1" in spec:
cmake_args.extend(
[
define("MERCURY_ENABLE_PARALLEL_TESTING", parallel_tests),
define("MERCURY_ENABLE_POST_LIMIT", False),
define_from_variant("MERCURY_ENABLE_VERBOSE_ERROR", "debug"),
define("MERCURY_USE_EAGER_BULK", True),
define("MERCURY_USE_SELF_FORWARD", True),
]
)
if "@1.0.0:" in spec:
cmake_args.extend(
[
define_from_variant("MERCURY_USE_SYSTEM_BOOST", "boostsys"),
define_from_variant("NA_USE_OFI", "ofi"),
]
)
if "+ofi" in spec:
ofi_fabrics = spec["libfabric"].variants["fabrics"].value
if "gni" in ofi_fabrics:
cmake_args.append(define_from_variant("NA_OFI_GNI_USE_UDREG", "udreg"))
if self.run_tests:
supported = ["tcp", "verbs", "gni", "cxi"]
ofi_test_fabrics = list(filter(lambda x: x in supported, ofi_fabrics))
cmake_args.append(
define("NA_OFI_TESTING_PROTOCOL", format(";".join(ofi_test_fabrics)))
)
return cmake_args
def check(self):
"""Unit tests fail when run in parallel."""
with working_dir(self.build_directory):
make("test", parallel=False)