# 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 os
from spack.package import *
class Aml(AutotoolsPackage):
"""AML is a memory management library designed to ease the use of complex
memory topologies and complex data layout optimizations for
high-performance computing applications.
"""
homepage = "https://argo-aml.readthedocs.io/"
maintainers("perarnau")
test_requires_compiler = True
tags = ["e4s"]
# Package sources
###################################
url = "https://github.com/anlsys/aml/releases/download/v0.2.0/aml-0.2.0.tar.gz"
git = "https://github.com/anlsys/aml.git"
license("ISC")
# version string is generated from git tags, requires entire repo
version("master", branch="master", submodules=True, get_full_repo=True)
version("0.2.1", sha256="bae49e89ed0f2a2ad3547430e79b7e4c018d6228c6ed951a12d59afd0b35f71c")
version("0.2.0", sha256="2044a2f3f1d7a19827dd9c0726172b690189b4d3fe938656c4160c022468cc4a")
version(
"0.1.0",
sha256="cc89a8768693f1f11539378b21cdca9f0ce3fc5cb564f9b3e4154a051dcea69b",
deprecated=True,
)
# Generate possible variants.
#############################
variant("opencl", default=False, description="Support for memory operations on top of OpenCL.")
variant("ze", default=False, description="Support for memory operations on top of Level Zero.")
variant("hip", default=False, description="Support for memory operations on top of HIP.")
variant("cuda", default=False, description="Support for memory operations on top of CUDA.")
variant("hwloc", default=True, description="Enable feature related to topology management")
variant(
"hip-platform",
values=("none", conditional("amd", when="+hip"), conditional("nvidia", when="+cuda")),
default="none",
multi=False,
description="HIP backend platform.",
)
# Dependencies management
#########################
# aml always depends on libnuma
depends_on("numactl")
# - cuda dependency. We use the environment variable CUDA_HOME in the configure.
depends_on("cuda", when="+cuda")
# - hip dependency. We use the environment variable HIP_PATH in the configure.
depends_on("hip", when="+hip")
# - level_zero loader is the dependency for the oneAPI variant
depends_on("oneapi-level-zero", when="+ze")
# - hwloc >= 2.1 becomes a dependency when +hwloc variant is used.
depends_on("hwloc@2.1:", when="+hwloc")
# - ocl-icd >= 2.1 becomes a dependency when +opencl variant is used.
depends_on("ocl-icd@2.1:", when="+opencl")
# Required on master for autoconf pull the right pkg.m4 macros,
# and on other builds to detect dependencies
# Note: This does NOT work with pkg-config but requires pkgconf!
depends_on("pkgconf", type="build")
# when on master, we need all the autotools and extras to generate files.
with when("@master"):
depends_on("m4", type="build")
depends_on("autoconf", type="build")
depends_on("automake", type="build")
depends_on("libtool", type="build")
# Required to generate AML version in configure.
depends_on("git", type="build")
# Configure options management
###########################################
# This is the function to overload to pass all hwloc flag.
def configure_args(self):
config_args = []
for b in ["opencl", "hwloc", "ze", "hip", "cuda"]:
config_args.extend(self.with_or_without(b))
if self.spec.satisfies("%oneapi"):
config_args += ["--with-openmp-flags=-fiopenmp -fopenmp-targets=spir64"]
if self.spec.variants["hip-platform"].value == "amd":
config_args += ["--with-hip-platform=amd"]
if self.spec.variants["hip-platform"].value == "nvidia":
config_args += ["--with-hip-platform=nvidia"]
return config_args
# Tests
#########################
smoke_test = "0_hello"
smoke_test_src = join_path("doc", "tutorials", "hello_world", smoke_test + ".c")
@run_after("install")
def cache_test_sources(self):
"""Copy the example source files after the package is installed to an
install test subdirectory for use during `spack test run`."""
self.cache_extra_test_sources(self.smoke_test_src)
def test_check_tutorial(self):
"""Compile and run the tutorial tests as install checks"""
cc = which(os.environ["CC"])
cc_options = [
"-o",
self.smoke_test,
join_path(self.test_suite.current_test_cache_dir, self.smoke_test_src),
"-I{0}".format(self.prefix.include),
"-I{0}".format(self.spec["numactl"].prefix.include),
"-L{0}".format(self.prefix.lib),
"-laml",
"-lexcit",
"-lpthread",
]
cc(*cc_options)
smoke_test = which(self.smoke_test)
out = smoke_test(output=str.split, error=str.split)
assert "Hello world" in out