90 lines
3.3 KiB
Python
90 lines
3.3 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 os
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Bricks(CMakePackage):
|
|
|
|
"""Bricks is a data layout and code generation framework,
|
|
enabling performance-portable stencil computations across
|
|
a multitude of architectures."""
|
|
|
|
# url for your package's homepage here.
|
|
homepage = "https://bricks.run/"
|
|
git = "https://github.com/CtopCsUtahEdu/bricklib.git"
|
|
|
|
test_requires_compiler = True
|
|
|
|
# List of GitHub accounts to notify when the package is updated.
|
|
maintainers("ztuowen", "drhansj")
|
|
|
|
version("r0.1", branch="r0.1")
|
|
|
|
variant("cuda", default=False, description="Build bricks with CUDA enabled")
|
|
|
|
# Building a variant of cmake without openssl is to match how the
|
|
# ECP E4S project builds cmake in their e4s-base-cuda Docker image
|
|
depends_on("cmake", type="build")
|
|
depends_on("autoconf", type="build")
|
|
depends_on("automake", type="build")
|
|
depends_on("libtool", type="build")
|
|
depends_on("opencl-clhpp", when="+cuda")
|
|
depends_on("cuda", when="+cuda")
|
|
depends_on("mpi")
|
|
|
|
patch("bricks-cmakelists-option-opencl.patch")
|
|
|
|
def cmake_args(self):
|
|
"""CMake arguments for configure stage"""
|
|
args = [self.define_from_variant("BRICK_USE_OPENCL", "cuda")]
|
|
if "+cuda" in self.spec:
|
|
args.append(f"-DOCL_ROOT:STRING={self.spec['opencl-clhpp'].prefix}")
|
|
return args
|
|
|
|
def flag_handler(self, name, flags):
|
|
"""Set build flags as needed"""
|
|
if name in ["cflags", "cxxflags", "cppflags"]:
|
|
# There are many vector instrinsics used in this package. If
|
|
# the package is built on a native architecture, then it likely
|
|
# will not run (illegal instruction fault) on a less feature-
|
|
# rich architecture.
|
|
# If you intend to use this package in an architecturally-
|
|
# heterogeneous environment, then the package should be build
|
|
# with "target=x86_64". This will ensure that all Intel
|
|
# architectures can use the libraries and tests in this
|
|
# project by forceing the AVX2 flag in gcc.
|
|
if name == "cxxflags" and self.spec.target == "x86_64":
|
|
flags.append("-mavx2")
|
|
return (None, flags, None)
|
|
return (flags, None, None)
|
|
|
|
@run_after("install")
|
|
def copy_test_sources(self):
|
|
"""Files to copy into test cache"""
|
|
srcs = [
|
|
join_path("examples", "external", "CMakeLists.txt"),
|
|
join_path("examples", "external", "main.cpp"),
|
|
join_path("examples", "external", "7pt.py"),
|
|
]
|
|
self.cache_extra_test_sources(srcs)
|
|
|
|
def test_bricklib_example(self):
|
|
"""build and run pre-built example"""
|
|
source_dir = join_path(self.test_suite.current_test_cache_dir, "examples", "external")
|
|
if not os.path.exists(source_dir):
|
|
raise SkipTest("{0} is missing".format(source_dir))
|
|
|
|
with working_dir(source_dir):
|
|
cmake = which(self.spec["cmake"].prefix.bin.cmake)
|
|
cmake(".")
|
|
|
|
cmake("--build", ".")
|
|
|
|
example = which("example")
|
|
example()
|