spack/var/spack/repos/builtin/packages/ucx/package.py

262 lines
12 KiB
Python

# Copyright 2013-2023 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)
import shutil
from spack.package import *
class Ucx(AutotoolsPackage, CudaPackage):
"""a communication library implementing high-performance messaging for
MPI/PGAS frameworks"""
homepage = "http://www.openucx.org"
url = "https://github.com/openucx/ucx/releases/download/v1.3.1/ucx-1.3.1.tar.gz"
git = "https://github.com/openucx/ucx.git"
maintainers("hppritcha")
# Current
version("1.14.0", sha256="9bd95e2059de5dece9dddd049aacfca3d21bfca025748a6a0b1be4486e28afdd")
# Still supported
version("1.13.1", sha256="efc37829b68e131d2acc82a3fd4334bfd611156a756837ffeb650ab9a9dd3828")
version("1.13.0", sha256="8a3881f21fe2788113789f5bae1c8174e931f7542de0a934322a96ef354e5e3d")
# Retired
version("1.12.1", sha256="40b447c8e7da94a253f2828001b2d76021eb4ad39647107d433d62d61e18ae8e")
version("1.12.0", sha256="93e994de2d1a4df32381ea92ba4c98a249010d1720eb0f6110dc72c9a7d25db6")
version("1.11.2", sha256="deebf86a5344fc2bd9e55449f88c650c4514928592807c9bc6fe4190e516c6df")
version("1.11.1", sha256="29338cad18858517f96b46ff83bdd259a5899e274792cebd269717c660aa86fd")
version("1.11.0", sha256="b7189b69fe0e16e3c03784ef674e45687a9c520750bd74a45125c460ede37647")
version("1.10.1", sha256="ae9a108af6842ca135e7ec9b6131469adf9f1e50f899349fafcc69a215368bc9")
version("1.10.0", sha256="b885e24b1b94724c03cb213c355381e98df1e2d1fd7f633cf8055b6dd05db92d")
version("1.9-dev", branch="v1.9.x")
version("1.9.0", sha256="a7a2c8841dc0d5444088a4373dc9b9cc68dbffcd917c1eba92ca8ed8e5e635fb")
version("1.8.1", sha256="a48820cb8d0761b5ccf3e7ba03a7c8c1dde6276017657178829e07ffc35b556a")
version("1.8.0", sha256="e400f7aa5354971c8f5ac6b881dc2846143851df868088c37d432c076445628d")
version("1.7.0", sha256="6ab81ee187bfd554fe7e549da93a11bfac420df87d99ee61ffab7bb19bdd3371")
version("1.6.1", sha256="1425648aa03f5fa40e4bc5c4a5a83fe0292e2fe44f6054352fbebbf6d8f342a1")
version("1.6.0", sha256="360e885dd7f706a19b673035a3477397d100a02eb618371697c7f3ee4e143e2c")
version("1.5.2", sha256="1a333853069860e86ba69b8d071ccc9871209603790e2b673ec61f8086913fad")
version("1.5.1", sha256="567119cd80ad2ae6968ecaa4bd1d2a80afadd037ccc988740f668de10d2fdb7e")
version("1.5.0", sha256="84f6e4fa5740afebb9b1c8bb405c07206e58c56f83120dcfcd8dc89e4b7d7458")
version("1.4.0", sha256="99891a98476bcadc6ac4ef9c9f083bc6ffb188a96b3c3bc89c8bbca64de2c76e")
version("1.3.1", sha256="e058c8ec830d2f50d9db1e3aaaee105cd2ad6c1e6df20ae58b9b4179de7a8992")
version("1.3.0", sha256="71e69e6d78a4950cc5a1edcbe59bf7a8f8e38d59c9f823109853927c4d442952")
version("1.2.2", sha256="914d10fee8f970d4fb286079dd656cf8a260ec7d724d5f751b3109ed32a6da63")
version("1.2.1", sha256="fc63760601c03ff60a2531ec3c6637e98f5b743576eb410f245839c84a0ad617")
version("1.2.0", sha256="1e1a62d6d0f89ce59e384b0b5b30b416b8fd8d7cedec4182a5319d0dfddf649c")
simd_values = ("avx", "sse41", "sse42")
variant("assertions", default=False, description="Enable assertions")
variant(
"backtrace_detail",
default=False,
description="Enable using BFD support "
"for detailed backtrace. Note: this adds a dependency on binutils, you may "
"want to mark binutils as external or depend on binutils~ld to avoid "
"changing the linker during the build of ucx.",
)
variant("debug", default=False, description="Enable debugging")
variant("examples", default=True, description="Keep examples")
variant("java", default=False, description="Builds with Java bindings")
variant(
"libs",
default="shared,static",
values=("shared", "static"),
multi=True,
description="Build shared libs, static libs or both",
)
variant("logging", default=False, description="Enable logging")
variant("openmp", default=True, description="Use OpenMP")
variant(
"opt",
default="3",
values=("0", "1", "2", "3"),
multi=False,
description="Set optimization level",
)
variant("optimizations", default=True, description="Enable optimizations")
variant("parameter_checking", default=False, description="Enable parameter checking")
variant("pic", default=True, description="Builds with PIC support")
variant("rocm", default=False, description="Enable ROCm support")
variant(
"simd",
values=disjoint_sets(("auto",), simd_values)
.with_default("auto")
.with_non_feature_values("auto"),
)
variant("thread_multiple", default=False, description="Enable thread support in UCP and UCT")
variant(
"ucg",
default=False,
description="Enable the group collective operations (experimental component)",
)
variant("vfs", default=False, when="@1.11.0:", description="UCX Virtual Filesystem support")
variant(
"cm",
default=False,
when="@:1.10",
description="Compile with IB Connection Manager support",
)
variant("cma", default=False, description="Enable Cross Memory Attach")
variant("dc", default=False, description="Compile with IB Dynamic Connection support")
variant("dm", default=False, description="Compile with Device Memory support")
variant("gdrcopy", default=False, description="Enable gdrcopy support")
variant("ib_hw_tm", default=False, description="Compile with IB Tag Matching support")
variant("knem", default=False, description="Enable KNEM support")
variant("mlx5_dv", default=False, description="Compile with mlx5 Direct Verbs support")
variant("rc", default=False, description="Compile with IB Reliable Connection support")
variant("rdmacm", default=False, description="Enable the use of RDMACM")
variant("ud", default=False, description="Compile with IB Unreliable Datagram support")
variant("verbs", default=False, description="Build OpenFabrics support")
variant("xpmem", default=False, description="Enable XPMEM support")
variant("gtest", default=False, description="Build and install Googletest")
depends_on("binutils+ld", when="%aocc", type="build")
depends_on("binutils", when="+backtrace_detail")
depends_on("gdrcopy", when="@1.7:+gdrcopy")
depends_on("gdrcopy@1.3", when="@:1.6+gdrcopy")
depends_on("java@8", when="+java")
depends_on("knem", when="+knem")
depends_on("libfuse@3:", when="+vfs")
depends_on("maven", when="+java")
depends_on("numactl")
depends_on("pkgconfig", type="build")
depends_on("rdma-core", when="+rdmacm")
depends_on("rdma-core", when="+verbs")
depends_on("xpmem", when="+xpmem")
depends_on("hip", when="+rocm")
conflicts("+gdrcopy", when="~cuda", msg="gdrcopy currently requires cuda support")
conflicts("+rocm", when="+gdrcopy", msg="gdrcopy > 2.0 does not support rocm")
configure_abs_path = "contrib/configure-release"
# See https://github.com/openucx/ucx/pull/8629, wrong int type
patch("commit-2523555.patch", when="@1.13.1")
def patch(self):
if self.spec.satisfies("+rocm"):
filter_file("$$with_rocm", "${with_rocm[@]}", "configure", string=True)
filter_file(
"-I$with_rocm/include/hip -I$with_rocm/include",
"$ROCM_CPPFLAGS",
"configure",
string=True,
)
filter_file(
"-L$with_rocm/hip/lib -L$with_rocm/lib", "$ROCM_LDFLAGS", "configure", string=True
)
@when("@1.9-dev")
def autoreconf(self, spec, prefix):
Executable("./autogen.sh")()
def configure_args(self):
spec = self.spec
args = ["--without-go", "--disable-doxygen-doc"] # todo # todo
args += self.enable_or_disable("assertions")
args.append("--enable-compiler-opt=" + self.spec.variants["opt"].value)
args += self.with_or_without("java", activation_value="prefix")
args += self.enable_or_disable("libs")
args += self.enable_or_disable("logging")
args += self.enable_or_disable("mt", variant="thread_multiple")
args += self.with_or_without("openmp")
args += self.enable_or_disable("optimizations")
args += self.enable_or_disable("params-check", variant="parameter_checking")
args += self.enable_or_disable("gtest")
args += self.with_or_without("pic")
args += self.with_or_without("cuda", activation_value="prefix")
args += self.with_or_without("cm")
args += self.enable_or_disable("cma")
args += self.with_or_without("dc")
args += self.with_or_without("dm")
args += self.with_or_without("gdrcopy", activation_value="prefix")
args += self.with_or_without("ib-hw-tm", variant="ib_hw_tm")
args += self.with_or_without("knem", activation_value="prefix")
args += self.with_or_without("mlx5-dv", variant="mlx5_dv")
args += self.with_or_without("rc")
args += self.with_or_without("ud")
args += self.with_or_without("xpmem", activation_value="prefix")
# Virtual filesystem as of UCX 1.11
if "+vfs" in spec:
args.append("--with-fuse3=" + self.spec["libfuse"].prefix)
else:
args.append("--without-fuse3")
# Backtraces
# UCX <= 1.11: --enable-backtrace-detail
# UCX >= 1.12: --with-bfd
if "@:1.11" in spec:
args += self.enable_or_disable("backtrace-detail", variant="backtrace_detail")
else:
if "+backtrace_detail" in spec:
args.append("--with-bfd=" + self.spec["binutils"].prefix)
else:
args.append("--without-bfd")
if "+rdmacm" in spec:
args.append("--with-rdmacm=" + self.spec["rdma-core"].prefix)
else:
args.append("--without-rdmacm")
if "+verbs" in spec:
args.append("--with-verbs=" + self.spec["rdma-core"].prefix)
else:
args.append("--without-verbs")
# SIMD flags.
if self.spec.satisfies("simd=auto"):
if "avx" in self.spec.target:
args.append("--with-avx")
else:
args.append("--without-avx")
elif self.spec.satisfies("simd=none"):
for instr in self.simd_values:
args.append("--without-" + instr)
else:
for instr in self.simd_values:
if instr in spec.variants["simd"].value:
args.append("--with-" + instr)
else:
args.append("--without-" + instr)
# lld doesn't support '-dynamic-list-data'
if "%aocc" in spec:
args.append("LDFLAGS=-fuse-ld=bfd")
if "+rocm" in spec:
rocm_flags = " ".join(
[
"-I" + self.spec["hip"].prefix.include,
"-I" + self.spec["hip"].prefix.include.hip,
"-I" + self.spec["hsa-rocr-dev"].prefix.include.hsa,
"-L" + self.spec["hip"].prefix.lib,
"-L" + self.spec["hsa-rocr-dev"].prefix.lib,
]
)
args.append("--with-rocm=" + rocm_flags)
else:
args.append("--without-rocm")
return args
@run_after("install")
def drop_examples(self):
if self.spec.satisfies("~examples"):
shutil.rmtree(join_path(self.spec.prefix, "share", "ucx", "examples"))
@run_after("install")
def install_gtest(self):
if self.spec.satisfies("+gtest"):
install_tree("test", self.spec.prefix.test)