summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/cray-mpich/package.py
blob: 98f9962cea5b32c0879af63ce84f2168c4eb9a88 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# Copyright 2013-2021 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

from spack import *
from spack.util.module_cmd import get_path_args_from_module_line, module


class CrayMpich(Package):
    """Cray's MPICH is a high performance and widely portable implementation of
    the Message Passing Interface (MPI) standard."""

    homepage = "https://docs.nersc.gov/development/compilers/wrappers/"
    has_code = False    # Skip attempts to fetch source that is not available

    maintainers = ['haampie']

    version('8.1.0')
    version('8.0.16')
    version('8.0.14')
    version('8.0.11')
    version('8.0.9')
    version('7.7.16')
    version('7.7.15')
    version('7.7.14')
    version('7.7.13')

    provides('mpi@3')

    canonical_names = {
        'gcc': 'GNU',
        'cce': 'CRAY',
        'intel': 'INTEL',
        'clang': 'ALLINEA',
        'aocc': 'AOCC'
    }

    @property
    def modname(self):
        return "cray-mpich/{0}".format(self.version)

    @property
    def external_prefix(self):
        mpich_module = module("show", self.modname).splitlines()

        for line in mpich_module:
            if "CRAY_MPICH_DIR" in line:
                return get_path_args_from_module_line(line)[0]

        # Fixes an issue on Archer2 cray-mpich/8.0.16 where there is
        # no CRAY_MPICH_DIR variable in the module file.
        for line in mpich_module:
            if "CRAY_LD_LIBRARY_PATH" in line:
                libdir = get_path_args_from_module_line(line)[0]
                return os.path.dirname(os.path.normpath(libdir))

    def setup_run_environment(self, env):
        env.set('MPICC', spack_cc)
        env.set('MPICXX', spack_cxx)
        env.set('MPIF77', spack_fc)
        env.set('MPIF90', spack_fc)

    def setup_dependent_build_environment(self, env, dependent_spec):
        self.setup_run_environment(env)

        env.set('MPICH_CC', spack_cc)
        env.set('MPICH_CXX', spack_cxx)
        env.set('MPICH_F77', spack_f77)
        env.set('MPICH_F90', spack_fc)
        env.set('MPICH_FC', spack_fc)

    def setup_dependent_package(self, module, dependent_spec):
        spec = self.spec
        spec.mpicc = spack_cc
        spec.mpicxx = spack_cxx
        spec.mpifc = spack_fc
        spec.mpif77 = spack_f77

    def install(self, spec, prefix):
        raise InstallError(
            self.spec.format('{name} is not installable, you need to specify '
                             'it as an external package in packages.yaml'))

    @property
    def headers(self):
        hdrs = find_headers('mpi', self.prefix.include, recursive=True)
        hdrs.directories = os.path.dirname(hdrs[0])
        return hdrs

    @property
    def libs(self):
        query_parameters = self.spec.last_query.extra_parameters

        libraries = ['libmpich']

        if 'cxx' in query_parameters:
            libraries.extend(['libmpicxx', 'libmpichcxx'])

        if 'f77' in query_parameters:
            libraries.extend(['libmpifort', 'libmpichfort',
                              'libfmpi', 'libfmpich'])

        if 'f90' in query_parameters:
            libraries.extend(['libmpif90', 'libmpichf90'])

        libs = find_libraries(libraries, root=self.prefix.lib, recursive=True)
        libs += find_libraries(libraries, root=self.prefix.lib64, recursive=True)

        return libs