summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/bart/package.py
blob: 7182b7dd394fe160265bbc3c4fc8993e04c769c9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 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)

from spack.package import *


class Bart(MakefilePackage, CudaPackage):
    """BART: Toolbox for Computational Magnetic Resonance Imaging"""

    homepage = "https://mrirecon.github.io/bart/"
    url      = "https://github.com/mrirecon/bart/archive/v0.5.00.tar.gz"

    maintainers = ['glennpj']

    version('0.7.00', sha256='a16afc4b632c703d95b5c34e47acd82fafc19f51f9aff442373eecfef08bfc41')
    version('0.6.00', sha256='dbbd33d1e3ed3324fe21f90a3b62cb51765fe369f21df100b46a32004928f18d')
    version('0.5.00', sha256='30eedcda0f0ef3808157542e0d67df5be49ee41e4f41487af5c850632788f643')

    # patch to fix build with MKL
    patch('https://github.com/mrirecon/bart/commit/b62ca4972d5ac41a44217a5c27123c15daae74db.patch?full_index=1',
          sha256='501ca985df2324fc02e32cc4ffb32ce5c235fe83a59f5b853eb78ad0f2d6629c',
          when='@0.5.00')

    # patch to fix Makefile for openblas and cuda
    patch('Makefile.patch', when='@:0.6.00')
    patch('Makefile-0.7.00.patch', when='@0.7.00:')

    # patch to set path to bart
    patch('bart_path-0.5.00.patch', when='@0.5.00')
    patch('bart_path-0.6.00.patch', when='@0.6.00:')

    depends_on('libpng')
    depends_on('fftw')
    depends_on('blas')
    depends_on('lapack')
    depends_on('py-numpy', type='run')
    depends_on('py-matplotlib', type='run')
    extends('python')

    conflicts('^atlas', msg='BART does not currently support atlas')

    def edit(self, spec, prefix):
        env['PREFIX'] = prefix
        env['FFTW_BASE'] = spec['fftw'].prefix

        if spec['blas'].name == 'openblas':
            env['OPENBLAS'] = '1'

        if '^mkl' in spec:
            env['MKL'] = '1'
            env['MKL_BASE'] = spec['mkl'].prefix.mkl
        else:
            env['BLAS_BASE'] = spec['blas'].prefix

        if '^netlib-lapack+lapacke' not in spec:
            env['NOLAPACKE'] = '1'

        if '+cuda' in spec:
            cuda_arch = self.spec.variants['cuda_arch'].value
            env['CUDA'] = '1'
            env['CUDA_BASE'] = spec['cuda'].prefix
            env['GPUARCH_FLAGS'] = ' '.join(self.cuda_flags(cuda_arch))

    def install(self, spec, prefix):
        make('install')

        install_tree('scripts', prefix.scripts)
        install_tree('matlab', prefix.matlab)
        install('startup.m', prefix)

        install('python/bart.py', python_platlib)
        install('python/cfl.py', python_platlib)
        install('python/wslsupport.py', python_platlib)

        if '^python@3:' in spec:
            install('python/bartview3.py', join_path(prefix.bin, 'bartview'))
            filter_file(r'#!/usr/bin/python3', '#!/usr/bin/env python',
                        prefix.bin.bartview)
        else:
            install('python/bartview.py', join_path(prefix.bin, 'bartview'))
            filter_file(r'#!/usr/bin/python', '#!/usr/bin/env python',
                        prefix.bin.bartview)

    def setup_run_environment(self, env):
        env.set('TOOLBOX_PATH', self.prefix)