From b9358099488b6c9851e28ca912c8be246178974a Mon Sep 17 00:00:00 2001 From: Teo Date: Thu, 16 Feb 2023 23:58:54 -0500 Subject: Halide: new variants and bug fixes (#35495) * Update package.py Initial new stuff * Update package.py * Update package.py * Update package.py * fix targets * non-llvm backends * ooops * fix style * Somehow that was not caught? Somehow that was not caught? * style * Last fix make capitalization consistent with Halide not LLVM... --- var/spack/repos/builtin/packages/halide/package.py | 83 ++++++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git a/var/spack/repos/builtin/packages/halide/package.py b/var/spack/repos/builtin/packages/halide/package.py index 0b7c010e9b..6765a56ec0 100644 --- a/var/spack/repos/builtin/packages/halide/package.py +++ b/var/spack/repos/builtin/packages/halide/package.py @@ -26,15 +26,44 @@ class Halide(CMakePackage, PythonExtension): variant("tutorials", default=False, description="Install the Halide Tutorials.") variant("utils", default=False, description="Install the Halide Utilities.") variant("tests", default=False, description="Build and Run Halide Tests and Apps.") + variant("opencl", default=False, description="Build Non-llvm based OpenCl-C backend.") + variant("metal", default=False, description="Build Non-llvm based Metal backend.") + variant( + "d3d12", default=False, description="Build Non-llvm based Direct3D 12 Compute backend." + ) extends("python", when="+python") + _values = ( + "aarch64", + "amdgpu", + "arm", + "hexagon", + "nvptx", + "powerpc", + "riscv", + "webassembly", + "x86", + ) + variant( + "targets", + default="arm,x86,nvptx,aarch64,hexagon,webassembly", + description=("What targets to build. Spack's target family is always added "), + values=_values, + multi=True, + ) + variant("sharedllvm", default=False, description="Link to the shared version of LLVM.") - _targets = " targets=arm,x86,nvptx,aarch64,hexagon,webassembly " depends_on("cmake@3.22:", type="build") depends_on("ninja", type="build") depends_on( - "llvm@14.0.0:14+clang+lld" + _targets + " build_type=Release", + "llvm@14.0.0:14+clang+lld build_type=Release", type=("link", "run"), ) + for v in _values: + depends_on( + "llvm targets={0}".format(v), type=("link", "run"), when="targets={0}".format(v) + ) + depends_on("llvm+llvm_dylib", type=("link", "run"), when="+sharedllvm") + depends_on("libjpeg", type=("build", "link", "run")) depends_on("libpng", type=("build", "link", "run")) @@ -55,24 +84,68 @@ class Halide(CMakePackage, PythonExtension): return find_libraries("libHalide", root=self.prefix, recursive=True) def cmake_args(self): + # See https://github.com/halide/Halide/blob/main/README_cmake.md#building-halide-with-cmake spec = self.spec llvm_config = Executable(spec["llvm"].prefix.bin.join("llvm-config")) llvmdir = llvm_config("--cmakedir", output=str) args = [ - self.define("Python3_EXECUTABLE", spec["python"].command.path), - self.define("PYBIND11_USE_FETCHCONTENT", False), self.define("LLVM_DIR", llvmdir), self.define_from_variant("WITH_TESTS", "tests"), self.define_from_variant("WITH_TUTORIALS", "tutorials"), self.define_from_variant("WITH_UTILS", "utils"), self.define_from_variant("WITH_PYTHON_BINDINGS", "python"), + self.define_from_variant("Halide_SHARED_LLVM", "sharedllvm"), self.define("WITH_WABT", False), + self.define_from_variant("TARGET_OPENCL", "opencl"), + self.define_from_variant("TARGET_METAL", "metal"), + self.define_from_variant("TARGET_D3D12COMPUTE", "d3d12"), ] + llvm_targets = get_llvm_targets_to_build(spec) + for target in llvm_targets: + args += [self.define("TARGET_{0}".format(target[0]), target[1])] + if "+python" in spec: args += [ + self.define("Python3_EXECUTABLE", spec["python"].command.path), + self.define("PYBIND11_USE_FETCHCONTENT", False), self.define( "Halide_INSTALL_PYTHONDIR", python_platlib, - ) + ), ] return args + + +def get_llvm_targets_to_build(spec): + targets = spec.variants["targets"].value + llvm_targets = set() + # Convert targets variant values to CMake LLVM_TARGETS_TO_BUILD array. + spack_to_cmake = { + "aarch64": "AARCH64", + "amdgpu": "AMDGPU", + "arm": "ARM", + "hexagon": "HEXAGON", + "nvptx": "NVPTX", + "powerpc": "POWERPC", + "riscv": "RISCV", + "webassembly": "WEBASSEMBLY", + "x86": "X86", + } + for t in targets: + llvm_targets.add((spack_to_cmake[t], True)) + + if spec.target.family in ("x86", "x86_64"): + llvm_targets.add(("X86", True)) + elif spec.target.family == "arm": + llvm_targets.add(("ARM", True)) + elif spec.target.family == "aarch64": + llvm_targets.add(("AARCH64", True)) + elif spec.target.family in ("ppc64", "ppc64le", "ppc", "ppcle"): + llvm_targets.add(("POWERPC", True)) + + # for everything not represented, we add False + for v in spack_to_cmake.values(): + if (v, True) not in llvm_targets: + llvm_targets.add((v, False)) + + return list(llvm_targets) -- cgit v1.2.3-60-g2f50