summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/bohrium/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'var/spack/repos/builtin/packages/bohrium/package.py')
-rw-r--r--var/spack/repos/builtin/packages/bohrium/package.py272
1 files changed, 272 insertions, 0 deletions
diff --git a/var/spack/repos/builtin/packages/bohrium/package.py b/var/spack/repos/builtin/packages/bohrium/package.py
new file mode 100644
index 0000000000..9df2ace777
--- /dev/null
+++ b/var/spack/repos/builtin/packages/bohrium/package.py
@@ -0,0 +1,272 @@
+# Copyright 2013-2018 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 import *
+from spack.package_test import compare_output
+from spack.util.executable import Executable
+import llnl.util.tty as tty
+import os
+
+
+class Bohrium(CMakePackage, CudaPackage):
+ """Library for automatic acceleration of array operations"""
+
+ homepage = "http://bh107.org"
+ url = "https://github.com/bh107/bohrium/archive/v0.9.0.tar.gz"
+ git = "https://github.com/bh107/bohrium.git"
+
+ maintainers = ['mfherbst']
+
+ #
+ # Versions
+ #
+ version("develop", branch="master")
+ version('0.9.1', sha256='a8675db35ea4587ef12d5885a1aa19b59fd9c3f1366e239059de8b0f3cf51e04')
+ version('0.9.0', sha256='6f6379f1555de5a6a19138beac891a470df7df1fc9594e2b9404cf01b6e17d93')
+
+ #
+ # Variants
+ #
+ variant("cuda", default=True,
+ description="Build with CUDA code generator")
+ variant('opencl', default=True,
+ description="Build with OpenCL code generator")
+ variant('openmp', default=True,
+ description="Build with OpenMP code generator")
+
+ variant('node', default=True,
+ description="Build the node vector engine manager")
+ variant('proxy', default=False,
+ description="Build the proxy vector engine manager")
+ variant('python', default=True,
+ description="Build the numpy-like bridge "
+ "to enable use from python")
+ variant('cbridge', default=True,
+ description="Build the bridge interface towards plain C")
+
+ variant('blas', default=True,
+ description="Build with BLAS extension methods")
+ variant('lapack', default=True,
+ description="Build with LAPACK extension methods")
+ variant('opencv', default=True,
+ description="Build with OpenCV extension methods")
+
+ #
+ # Conflicts and extensions
+ #
+ conflicts('%intel')
+ conflicts('%clang@:3.5')
+ conflicts('%gcc@:4.7')
+ extends('python', when="+python")
+
+ # Bohrium needs at least one vector engine and
+ # at least one vector engine manager
+ conflicts('~node~proxy')
+ conflicts('~openmp~opencl~cuda')
+
+ #
+ # Dependencies
+ #
+ depends_on('cmake@2.8:', type="build")
+ depends_on('boost+system+serialization+filesystem+regex')
+
+ # cuda dependencies managed by CudaPackage class
+ depends_on('opencl', when="+opencl")
+
+ # NOTE The lapacke interface and hence netlib-lapack
+ # is the strictly required lapack provider
+ # for bohrium right now.
+ depends_on('netlib-lapack+lapacke', when="+lapack")
+ depends_on('blas', when="+blas")
+
+ # Make sure an appropriate opencv is used
+ depends_on('opencv+imgproc', when="+opencv")
+ depends_on('opencv+imgproc+cuda', when="+opencv+cuda")
+ depends_on('opencv+imgproc+openmp', when="+opencv+openmp")
+ depends_on('opencv+imgproc+openmp+cuda', when="+opencv+openmp+cuda")
+
+ depends_on('python', type="build", when="~python")
+ depends_on('python', type=("build", "link", "test"), when="+python")
+ depends_on('py-numpy', type=("build", "test", "run"), when="+python")
+ depends_on('swig', type="build", when="+python")
+ depends_on('py-cython', type="build", when="+python")
+
+ depends_on('zlib', when="+proxy")
+
+ @property
+ def config_file(self):
+ """Return the path of the Bohrium system-wide configuration file"""
+ return join_path(self.prefix.etc.bohrium, "config.ini")
+
+ #
+ # Settings and cmake cache
+ #
+ def cmake_args(self):
+ spec = self.spec
+
+ # Sanity check
+ cuda_arch = spec.variants['cuda_arch'].value
+ if "+cuda" in spec and len(cuda_arch) >= 1 and cuda_arch[0]:
+ # TODO Add cuda_arch support to Bohrium once the basic setup
+ # via Spack works.
+ raise InstallError(
+ "Bohrium does not support setting the CUDA architecture yet."
+ )
+
+ args = [
+ # Choose a particular python version
+ "-DPYTHON_EXECUTABLE:FILEPATH=" + spec['python'].command.path,
+ #
+ # Hard-disable Jupyter, since this would override a config
+ # file in the user's home directory in some cases during
+ # the configuration stage.
+ "-DJUPYTER_FOUND=FALSE",
+ "-DJUPYTER_EXECUTABLE=FALSE",
+ #
+ # Force the configuration file to appear at a sensible place
+ "-DFORCE_CONFIG_PATH=" + os.path.dirname(self.config_file),
+ #
+ # Vector engine managers
+ "-DVEM_NODE=" + str("+node" in spec),
+ "-DVEM_PROXY=" + str("+proxy" in spec),
+ #
+ # Bridges and interfaces
+ "-DBRIDGE_BHXX=ON",
+ "-DBRIDGE_C=" + str("+cbridge" in spec or "+python" in spec),
+ "-DBRIDGE_NPBACKEND=" + str("+python" in spec),
+ "-DNO_PYTHON3=ON", # Only build python version we provide
+ ]
+
+ #
+ # Vector engines
+ #
+ args += [
+ "-DVE_OPENCL=" + str("+opencl" in spec),
+ "-DVE_CUDA=" + str("+cuda" in spec),
+ ]
+
+ if "+openmp" in spec:
+ args += [
+ "-DVE_OPENMP=ON",
+ "-DOPENMP_FOUND=True",
+ "-DVE_OPENMP_COMPILER_CMD=" + self.compiler.cc,
+ ]
+ else:
+ args += ["-DVE_OPENMP=OFF", "-DOPENMP_FOUND=False"]
+
+ #
+ # Extension methods
+ #
+ if "+blas" in spec:
+ args += [
+ "-DEXT_BLAS=ON",
+ "-DCBLAS_FOUND=True",
+ "-DCBLAS_LIBRARIES=" + spec["blas"].libs.joined(";"),
+ "-DCBLAS_INCLUDES=" + spec["blas"].prefix.include,
+ ]
+ else:
+ args += ["-DEXT_BLAS=OFF", "-DDCBLAS_FOUND=False"]
+
+ if "+lapack" in spec:
+ args += [
+ "-DEXT_LAPACK=ON",
+ "-DLAPACKE_FOUND=True",
+ "-DLAPACKE_LIBRARIES=" + spec["lapack"].libs.joined(";"),
+ "-DLAPACKE_INCLUDE_DIR=" + spec["lapack"].prefix.include,
+ ]
+ else:
+ args += ["-DEXT_LAPACK=OFF", "-DLAPACKE_FOUND=False"]
+
+ if "+opencv" in spec:
+ args += [
+ "-DEXT_OPENCV=ON",
+ "-DOpenCV_FOUND=True",
+ "-DOpenCV_INCLUDE_DIRS=" + spec["opencv"].prefix.include,
+ "-DOpenCV_LIBS=" + spec["opencv"].libs.joined(";"),
+ ]
+ else:
+ args += ["-DEXT_OPENCV=OFF", "-DOpenCV_FOUND=False"]
+
+ # TODO Other extension methods are not ready yet,
+ # because of missing packages in Spack
+ args += [
+ "-DEXT_CLBLAS=OFF", # clBLAS missing
+ # Bohrium visualizer extension method
+ "-DEXT_VISUALIZER=OFF", # freeglut missing
+ ]
+ return args
+
+ #
+ # Environment setup
+ #
+ def setup_environment(self, spack_env, run_env):
+ # Bohrium needs an extra include dir apart from
+ # the self.prefix.include dir
+ run_env.prepend_path("CPATH", self.prefix.include.bohrium)
+ run_env.set("BH_CONFIG", self.config_file)
+
+ #
+ # Quick tests
+ #
+ @run_after('install')
+ @on_package_attributes(run_tests=True)
+ def check_install(self):
+ spec = self.spec
+ test_env = {}
+
+ # Make sure the correct config is found
+ test_env["BH_CONFIG"] = self.config_file
+
+ # Remove the lib/spackenv directory from the PATH variable when
+ # executing the tests, becauses it messes with the JIT compilation
+ # inside Bohrium
+ paths = os.environ['PATH'].split(':')
+ paths = [p for p in paths if "spack/env" not in p]
+ test_env["PATH"] = ":".join(paths)
+
+ # Add the PYTHONPATH to bohrium to the PYTHONPATH environment
+ pythonpaths = [p for p in os.environ["PYTHONPATH"].split(":")]
+ pythonpaths.append(join_path(self.prefix,
+ spec['python'].package.site_packages_dir))
+ test_env["PYTHONPATH"] = ":".join(pythonpaths)
+
+ # Collect the stacks which should be available:
+ stacks = ["default"]
+ if "+openmp" in spec:
+ stacks.append("openmp")
+ if "+cuda" in spec:
+ stacks.append("cuda")
+ if "+opencl" in spec:
+ stacks.append("opencl")
+
+ # C++ compiler and compiler flags
+ cxx = Executable(self.compiler.cxx)
+ cxx_flags = ["-I", self.prefix.include,
+ "-I", self.prefix.include.bohrium,
+ "-L", self.prefix.lib, "-lbh", "-lbhxx"]
+
+ # Compile C++ test program
+ file_cxxadd = join_path(os.path.dirname(self.module.__file__),
+ "cxxadd.cpp")
+ cxx("-o", "test_cxxadd", file_cxxadd, *cxx_flags)
+ test_cxxadd = Executable("./test_cxxadd")
+
+ # Build python test commandline
+ file_pyadd = join_path(os.path.dirname(self.module.__file__),
+ "pyadd.py")
+ test_pyadd = Executable(spec['python'].command.path + " " + file_pyadd)
+
+ # Run tests for each available stack
+ for bh_stack in stacks:
+ tty.info("Testing with bohrium stack '" + bh_stack + "'")
+ test_env["BH_STACK"] = bh_stack
+
+ cpp_output = test_cxxadd(output=str, env=test_env)
+ compare_output(cpp_output, "Success!\n")
+
+ # Python test (if +python)
+ if "+python" in spec:
+ py_output = test_pyadd(output=str, env=test_env)
+ compare_output(py_output, "Success!\n")