summaryrefslogtreecommitdiff
path: root/lib/spack/spack/operating_systems/cnl.py
blob: 78807865b3616df7d26a54d8d5501539a2458814 (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
import re
import os

from spack.architecture import OperatingSystem
from spack.util.executable import *
import spack.spec
from spack.util.multiproc import parmap
import spack.compilers


class Cnl(OperatingSystem):
    """ Compute Node Linux (CNL) is the operating system used for the Cray XC
    series super computers. It is a very stripped down version of GNU/Linux.
    Any compilers found through this operating system will be used with
    modules. If updated, user must make sure that version and name are
    updated to indicate that OS has been upgraded (or downgraded)
    """

    def __init__(self):
        name = 'CNL'
        version = '10'
        super(Cnl, self).__init__(name, version)

    def __str__(self):
        return self.name

    def find_compilers(self, *paths):
        types = spack.compilers.all_compiler_types()
        compiler_lists = parmap(
            lambda cmp_cls: self.find_compiler(cmp_cls, *paths), types)

        # ensure all the version calls we made are cached in the parent
        # process, as well.  This speeds up Spack a lot.
        clist = reduce(lambda x, y: x + y, compiler_lists)
        return clist

    def find_compiler(self, cmp_cls, *paths):
        compilers = []
        if cmp_cls.PrgEnv:
            if not cmp_cls.PrgEnv_compiler:
                tty.die('Must supply PrgEnv_compiler with PrgEnv')

            modulecmd = which('modulecmd')
            modulecmd.add_default_arg('python')

            # Save the environment variable to restore later
            old_modulepath = os.environ['MODULEPATH']
            # if given any explicit paths, search them for module files too
            if paths:
                module_paths = ':' + ':'.join(p for p in paths)
                os.environ['MODULEPATH'] = module_paths

            output = modulecmd(
                'avail', cmp_cls.PrgEnv_compiler, output=str, error=str)
            matches = re.findall(
                r'(%s)/([\d\.]+[\d])' % cmp_cls.PrgEnv_compiler, output)
            for name, version in matches:
                v = version
                comp = cmp_cls(
                    spack.spec.CompilerSpec(name + '@' + v), self,
                    ['cc', 'CC', 'ftn'], [cmp_cls.PrgEnv, name + '/' + v])

                compilers.append(comp)

            # Restore modulepath environment variable
            if paths:
                os.environ['MODULEPATH'] = old_modulepath

        return compilers