
The number of commit characters in patch files fetched from GitHub can change, so we should use `full_index=1` to enforce full commit hashes (and a stable patch `sha256`). Similarly, URLs for branches like `master` don't give us stable patch files, because branches are moving targets. Use specific tags or commits for those. - [x] update all github patch URLs to use `full_index=1` - [x] don't use `master` or other branches for patches - [x] add an audit check and a test for `?full_index=1` Co-authored-by: Todd Gamblin <tgamblin@llnl.gov>
86 lines
2.9 KiB
Python
86 lines
2.9 KiB
Python
# Copyright 2013-2022 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
|
|
import shutil
|
|
|
|
from spack 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"
|
|
|
|
maintainers = ['glennpj']
|
|
|
|
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('cuda')
|
|
depends_on('go@:1.15', 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(Mumax, self).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)
|
|
|
|
def install(self, spec, prefix):
|
|
make()
|
|
with working_dir(self.gopath):
|
|
install_tree('bin', prefix.bin)
|