90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
#
|
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
import os
|
|
import shutil
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Mumax(MakefilePackage, CudaPackage):
|
|
"""GPU accelerated micromagnetic simulator."""
|
|
|
|
homepage = "https://mumax.github.io"
|
|
url = "https://github.com/mumax/3/archive/v3.10.tar.gz"
|
|
|
|
license("CC-BY-3.0")
|
|
|
|
version(
|
|
"3.10",
|
|
sha256="42c858661cec3896685ff4babea11e711f71fd6ea37d20c2bed7e4a918702caa",
|
|
preferred=True,
|
|
)
|
|
version(
|
|
"3.10beta",
|
|
sha256="f20fbd90a4b531fe5a0d8acc3d4505a092a5e426f5f53218a22a87d445daf0e9",
|
|
url="https://github.com/mumax/3/archive/3.10beta.tar.gz",
|
|
)
|
|
|
|
variant("cuda", default=True, description="Use CUDA; must be true")
|
|
variant("gnuplot", default=False, description="Use gnuplot for graphs")
|
|
|
|
depends_on("c", type="build")
|
|
|
|
depends_on("cuda")
|
|
depends_on("go", type="build")
|
|
depends_on("gnuplot", type="run", when="+gnuplot")
|
|
|
|
conflicts("~cuda", msg="mumax requires cuda")
|
|
|
|
patch(
|
|
"https://github.com/mumax/3/commit/2cf5c9a6985c9eb16a124c6bd96aed75b4a30c24.patch?full_index=1",
|
|
sha256="4bbb95aacdac7e2cbcb37ee8adcfb9464e69965f984c264ff094dc1cca10589b",
|
|
when="@3.10beta",
|
|
)
|
|
|
|
@property
|
|
def cuda_arch(self):
|
|
cuda_arch = " ".join(self.spec.variants["cuda_arch"].value)
|
|
if cuda_arch == "none":
|
|
raise InstallError("Must select at least one value for cuda_arch")
|
|
return cuda_arch
|
|
|
|
@property
|
|
def gopath(self):
|
|
return self.stage.path
|
|
|
|
@property
|
|
def mumax_gopath_dir(self):
|
|
return join_path(self.gopath, "src/github.com/mumax/3")
|
|
|
|
def do_stage(self, mirror_only=False):
|
|
super().do_stage(mirror_only)
|
|
if not os.path.exists(self.mumax_gopath_dir):
|
|
# Need to move source to $GOPATH and then symlink the original
|
|
# stage directory
|
|
shutil.move(self.stage.source_path, self.mumax_gopath_dir)
|
|
force_symlink(self.mumax_gopath_dir, self.stage.source_path)
|
|
|
|
# filter out targets that do not exist
|
|
def edit(self, spec, prefix):
|
|
filter_file(r"(^all: cudakernels) hooks$", r"\1", "Makefile")
|
|
|
|
@when("@3.10beta")
|
|
def edit(self, spec, prefix):
|
|
filter_file(r"(^ln -sf .*)", r"#\1", "make.bash")
|
|
filter_file(r"(^\(cd test)", r"#\1", "make.bash")
|
|
filter_file(r"(for cc in ).*(; do)", r"\1{0}\2".format(self.cuda_arch), "cuda/make.bash")
|
|
|
|
def setup_build_environment(self, env):
|
|
env.prepend_path("GOPATH", self.gopath)
|
|
env.set("CUDA_CC", self.cuda_arch)
|
|
env.set("NVCC_CCBIN", spack_cc)
|
|
|
|
def install(self, spec, prefix):
|
|
go("mod init github.com/mumax/3")
|
|
make()
|
|
with working_dir(self.gopath):
|
|
install_tree("bin", prefix.bin)
|