spack/var/spack/repos/builtin/packages/hpx/package.py
Harmen Stoppels eef9939c21
Automated git version fixes (#39637)
Use full length commit sha instead of short prefixes, to improve
reproducibility (future clashes) and guard against compromised repos and
man in the middle attacks.

Abbreviated commit shas are expanded to full length, to guard against future
clashes on short hash. It also guards against compromised repos and
man in the middle attacks, where attackers can easily fabricate a malicious
commit with a shasum prefix collision.

Versions with just tags now also get a commit sha, which can later be used to
check for retagged commits.
2023-08-29 16:33:03 +02:00

272 lines
11 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 sys
from spack.package import *
from spack.pkg.builtin.boost import Boost
class Hpx(CMakePackage, CudaPackage, ROCmPackage):
"""C++ runtime system for parallel and distributed applications."""
homepage = "https://hpx.stellar-group.org/"
url = "https://github.com/STEllAR-GROUP/hpx/archive/v0.0.0.tar.gz"
git = "https://github.com/STEllAR-GROUP/hpx.git"
maintainers("msimberg", "albestro", "teonnik", "hkaiser")
tags = ["e4s"]
version("master", branch="master")
version("stable", tag="stable", commit="38d5bf935e5a49f9466c5e615e04e8d553a73dc6")
version("1.9.1", sha256="1adae9d408388a723277290ddb33c699aa9ea72defadf3f12d4acc913a0ff22d")
version("1.9.0", sha256="2a8dca78172fbb15eae5a5e9facf26ab021c845f9c09e61b1912e6cf9e72915a")
version("1.8.1", sha256="2fc4c10f55e2e6bcdc6f6ff950e26c6d8e218e138fdbd885ee71ccf5c5549054")
version("1.8.0", sha256="93f147ab7cf0ab4161f37680ea720d3baeb86540a95382f2fb591645b2a9b135")
version("1.7.1", sha256="008a0335def3c551cba31452eda035d7e914e3e4f77eec679eea070ac71bd83b")
version("1.7.0", sha256="05099b860410aa5d8a10d6915b1a8818733aa1aa2d5f2b9774730ca7e6de5fac")
version("1.6.0", sha256="4ab715613c1e1808edc93451781cc9bc98feec4e422ccd4322858a680f6d9017")
version("1.5.1", sha256="b2f9358ce2a9446b9d8fb1998c30913e7199b007aa82e46d0aa05c763331c635")
version("1.5.0", sha256="de2901d8ae017592c513e0af9cf58de295abc9802e55ece00424cbd8a3801920")
version("1.4.1", sha256="965dabe44d17480e326d92da4eec56722d98b33943c53d2b0f8f4655cb208023")
version("1.4.0", sha256="241a1c47fafba751848fac12446e7bf4ad3d342d5eb2fa1ef94dd904acc329ed")
version("1.3.0", sha256="cd34da674064c4cc4a331402edbd65c5a1f8058fb46003314ca18fa08423c5ad")
version("1.2.1", sha256="8cba9b48e919035176d3b7bbfc2c110df6f07803256626f1dad8d9dde16ab77a")
version("1.2.0", sha256="20942314bd90064d9775f63b0e58a8ea146af5260a4c84d0854f9f968077c170")
version("1.1.0", sha256="1f28bbe58d8f0da600d60c3a74a644d75ac777b20a018a5c1c6030a470e8a1c9")
generator("ninja")
map_cxxstd = lambda cxxstd: "2a" if cxxstd == "20" else cxxstd
cxxstds = ("11", "14", "17", "20")
variant(
"cxxstd",
default="17",
values=cxxstds,
description="Use the specified C++ standard when building.",
)
variant(
"malloc",
default="tcmalloc",
description="Define which allocator will be linked in",
values=("system", "jemalloc", "mimalloc", "tbbmalloc", "tcmalloc"),
)
variant(
"max_cpu_count",
default="64",
description="Max number of OS-threads for HPX applications",
values=lambda x: isinstance(x, str) and x.isdigit(),
)
instrumentation_values = ("apex", "google_perftools", "papi", "valgrind")
variant(
"instrumentation",
values=any_combination_of(*instrumentation_values),
description="Add support for various kind of instrumentation",
)
variant(
"networking",
values=any_combination_of("tcp", "mpi").with_default("tcp"),
description="Support for networking through parcelports",
)
default_generic_coroutines = True
if sys.platform.startswith("linux") or sys.platform == "win32":
default_generic_coroutines = False
variant(
"generic_coroutines",
default=default_generic_coroutines,
description="Use Boost.Context as the underlying coroutines"
" context switch implementation.",
)
variant("tools", default=False, description="Build HPX tools")
variant("examples", default=False, description="Build examples")
variant("async_mpi", default=False, description="Enable MPI Futures.")
variant("async_cuda", default=False, description="Enable CUDA Futures.")
# Build dependencies
depends_on("python", type=("build", "test", "run"))
depends_on("pkgconfig", type="build")
depends_on("git", type="build")
depends_on("cmake", type="build")
# Other dependecies
depends_on("hwloc")
depends_on(Boost.with_default_variants)
depends_on("boost +context", when="+generic_coroutines")
for cxxstd in cxxstds:
depends_on("boost cxxstd={0}".format(map_cxxstd(cxxstd)), when="cxxstd={0}".format(cxxstd))
depends_on("asio", when="@1.7:")
for cxxstd in cxxstds:
depends_on(
"asio cxxstd={0}".format(map_cxxstd(cxxstd)), when="cxxstd={0} ^asio".format(cxxstd)
)
depends_on("gperftools", when="malloc=tcmalloc")
depends_on("jemalloc", when="malloc=jemalloc")
depends_on("mimalloc", when="malloc=mimalloc")
depends_on("tbb", when="malloc=tbbmalloc")
depends_on("mpi", when="networking=mpi")
depends_on("mpi", when="+async_mpi")
depends_on("cuda", when="+async_cuda")
depends_on("otf2", when="instrumentation=apex")
depends_on("gperftools", when="instrumentation=google_perftools")
depends_on("papi", when="instrumentation=papi")
depends_on("valgrind", when="instrumentation=valgrind")
# Only ROCm or CUDA maybe be enabled at once
conflicts("+rocm", when="+cuda")
# Restrictions for 1.9.X
with when("@1.9:"):
conflicts("%gcc@:8")
conflicts("%clang@:9")
# Restrictions for 1.8.X
with when("@1.8:"):
conflicts("cxxstd=14")
conflicts("%gcc@:7")
conflicts("%clang@:8")
depends_on("cuda@11:", when="+cuda")
# Restrictions for 1.7.X
with when("@1.7:"):
depends_on("cmake@3.18.0:", type="build")
depends_on("boost@1.71.0:")
depends_on("asio@1.12.0:")
conflicts("%gcc@:6")
conflicts("%clang@:6")
# Restrictions for 1.6.X
conflicts("+rocm", when="@:1.5")
# Restrictions for 1.5.x
conflicts("cxxstd=11", when="@1.5:")
# Restrictions for 1.2.X
with when("@:1.2.1"):
depends_on("cmake@3.9.0:", type="build")
depends_on("boost@1.62.0:")
depends_on("hwloc@1.11:")
# Restrictions before 1.2
with when("@:1.1.0"):
depends_on("boost@1.55.0:")
depends_on("hwloc@1.6:")
# Patches and one-off conflicts
# Certain Asio headers don't compile with nvcc from 1.17.0 onwards with
# C++17. Starting with CUDA 11.3 they compile again.
conflicts("^asio@1.17.0:", when="+cuda cxxstd=17 ^cuda@:11.2")
# Starting from ROCm 5.0.0 hipcc miscompiles asio 1.17.0 and newer
conflicts("^asio@1.17.0:", when="+rocm ^hip@5:")
# Boost and HIP don't work together in certain versions:
# https://github.com/boostorg/config/issues/392. Boost 1.78.0 and HPX 1.8.0
# both include a fix.
conflicts("^boost@:1.77.0", when="@:1.7 +rocm")
# libstdc++ has a broken valarray in some versions that clang/hipcc refuses
# to compile:
# https://github.com/spack/spack/issues/38104
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103022
conflicts("%gcc@9.1:9.4", when="+rocm")
conflicts("%gcc@10.1:10.3", when="+rocm")
conflicts("%gcc@11.2", when="+rocm")
# boost 1.73.0 build problem with HPX 1.4.0 and 1.4.1
# https://github.com/STEllAR-GROUP/hpx/issues/4728#issuecomment-640685308
depends_on("boost@:1.72.0", when="@:1.4")
# COROUTINES
# ~generic_coroutines conflict is not fully implemented
# for additional information see:
# https://github.com/spack/spack/pull/17654
# https://github.com/STEllAR-GROUP/hpx/issues/4829
depends_on("boost+context", when="+generic_coroutines")
_msg_generic_coroutines_platform = "This platform requires +generic_coroutines"
conflicts("~generic_coroutines", when="platform=darwin", msg=_msg_generic_coroutines_platform)
_msg_generic_coroutines_target = "This target requires +generic_coroutines"
conflicts("~generic_coroutines", when="target=aarch64:", msg=_msg_generic_coroutines_target)
conflicts("~generic_coroutines", when="target=arm:", msg=_msg_generic_coroutines_target)
# Patches APEX
patch("git_external.patch", when="@1.3.0 instrumentation=apex")
patch("mimalloc_no_version_requirement.patch", when="@:1.8.0 malloc=mimalloc")
def url_for_version(self, version):
if version >= Version("1.9.0"):
return "https://github.com/STEllAR-GROUP/hpx/archive/v{}.tar.gz".format(version)
return "https://github.com/STEllAR-GROUP/hpx/archive/{}.tar.gz".format(version)
def instrumentation_args(self):
args = []
for value in self.instrumentation_values:
condition = "instrumentation={0}".format(value)
args.append(self.define("HPX_WITH_{0}".format(value.upper()), condition in self.spec))
return args
def cmake_args(self):
spec, args = self.spec, []
args += [
self.define("HPX_WITH_CXX{0}".format(spec.variants["cxxstd"].value), True),
self.define_from_variant("HPX_WITH_MALLOC", "malloc"),
self.define_from_variant("HPX_WITH_CUDA", "cuda"),
self.define_from_variant("HPX_WITH_HIP", "rocm"),
self.define_from_variant("HPX_WITH_TOOLS", "tools"),
self.define_from_variant("HPX_WITH_EXAMPLES", "examples"),
self.define_from_variant("HPX_WITH_ASYNC_MPI", "async_mpi"),
self.define_from_variant("HPX_WITH_ASYNC_CUDA", "async_cuda"),
self.define("HPX_WITH_TESTS", self.run_tests),
self.define("HPX_WITH_NETWORKING", "networking=none" not in spec),
self.define("HPX_WITH_PARCELPORT_TCP", "networking=tcp" in spec),
self.define("HPX_WITH_PARCELPORT_MPI", "networking=mpi" in spec),
self.define_from_variant("HPX_WITH_MAX_CPU_COUNT", "max_cpu_count"),
self.define_from_variant("HPX_WITH_GENERIC_CONTEXT_COROUTINES", "generic_coroutines"),
self.define("BOOST_ROOT", spec["boost"].prefix),
self.define("HWLOC_ROOT", spec["hwloc"].prefix),
self.define("HPX_WITH_BOOST_ALL_DYNAMIC_LINK", True),
self.define("BUILD_SHARED_LIBS", True),
self.define("HPX_DATASTRUCTURES_WITH_ADAPT_STD_TUPLE", False),
]
# Enable unity builds when available
if spec.satisfies("@1.7:"):
args += [self.define("HPX_WITH_UNITY_BUILD", True)]
# HIP support requires compiling with hipcc
if "+rocm" in self.spec:
args += [self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc)]
if self.spec.satisfies("^cmake@3.21.0:3.21.2"):
args += [self.define("__skip_rocmclang", True)]
# Instrumentation
args += self.instrumentation_args()
if "instrumentation=apex" in spec:
args += [
self.define("APEX_WITH_OTF2", True),
self.define("OTF2_ROOT", spec["otf2"].prefix),
]
# it seems like there was a bug in the default version of APEX in 1.5.x
if spec.satisfies("@1.5"):
args += [self.define("HPX_WITH_APEX_TAG", "v2.3.0")]
return args