summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/libflame/package.py
blob: 580dd983dcbea544dd88641ff6fb87883254ada3 (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# Copyright 2013-2023 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 LibflameBase(AutotoolsPackage):
    """Base class for building Libflame, shared with the AMD
    optimized version of the library in the 'libflame' package"""

    provides("lapack", when="+lapack2flame")

    variant(
        "lapack2flame",
        default=True,
        description="Map legacy LAPACK routine invocations"
        " to their corresponding native C implementations"
        " in libflame.",
    )

    variant(
        "threads",
        default="none",
        description="Multithreading support",
        values=("pthreads", "openmp", "none"),
        multi=False,
    )

    variant("static", default=True, description="Build static library")

    variant("shared", default=True, description="Build shared library")

    variant("debug", default=False, description="Build with debugging support")

    # TODO: Libflame prefers to defer to an external
    # LAPACK library for small problems. Is this to be
    # implemented in spack?

    # Libflame has a secondary dependency on BLAS:
    # https://github.com/flame/libflame/issues/24
    depends_on("blas")

    # There is a known issue with the makefile:
    # https://groups.google.com/forum/#!topic/libflame-discuss/lQKEfjyudOY
    patch("Makefile_5.1.0.patch", when="@5.1.0")

    # Problems with permissions on installed libraries:
    # https://github.com/flame/libflame/issues/24
    patch("Makefile_5.2.0.patch", when="@5.2.0")

    # Problems building on macOS:
    # https://github.com/flame/libflame/issues/23
    patch("Makefile_5.2.0_darwin.patch", when="@5.2.0")

    def flag_handler(self, name, flags):
        # -std=gnu99 at least required, old versions of GCC default to -std=c90
        if self.spec.satisfies("%gcc@:5.1") and name == "cflags":
            flags.append("-std=gnu99")
        return (flags, None, None)

    def enable_or_disable_threads(self):
        opt_val = self.spec.variants["threads"].value
        if opt_val == "none":
            opt_val = "no"
        return ["--enable-multithreading={0}".format(opt_val)]

    def configure_args(self):
        # Libflame has a secondary dependency on BLAS,
        # but doesn't know which library name to expect:
        # https://github.com/flame/libflame/issues/24
        config_args = ["LIBS=" + self.spec["blas"].libs.ld_flags]

        if "+lapack2flame" in self.spec:
            config_args.append("--enable-lapack2flame")
        else:
            config_args.append("--disable-lapack2flame")

        if "+static" in self.spec:
            config_args.append("--enable-static-build")
        else:
            config_args.append("--disable-static-build")

        if "+shared" in self.spec:
            config_args.append("--enable-dynamic-build")
        else:
            config_args.append("--disable-dynamic-build")

        if "+debug" in self.spec:
            config_args.append("--enable-debug")
        else:
            config_args.append("--disable-debug")

        config_args.extend(self.enable_or_disable_threads())

        if self.spec.variants["threads"].value != "none":
            config_args.append("--enable-supermatrix")
        else:
            config_args.append("--disable-supermatrix")

        # https://github.com/flame/libflame/issues/21
        config_args.append("--enable-max-arg-list-hack")

        if self.spec.satisfies("^blis"):
            config_args.append("LDFLAGS=-L{}".format(self.spec["blis"].prefix.lib))

        return config_args

    @run_after("install")
    def darwin_fix(self):
        # The shared library is not installed correctly on Darwin; fix this
        if self.spec.satisfies("platform=darwin"):
            fix_darwin_install_name(self.prefix.lib)


class Libflame(LibflameBase):
    """libflame is a portable library for dense matrix computations,
    providing much of the functionality present in LAPACK, developed
    by current and former members of the Science of High-Performance
    Computing (SHPC) group in the Institute for Computational
    Engineering and Sciences at The University of Texas at Austin.
    libflame includes a compatibility layer, lapack2flame, which
    includes a complete LAPACK implementation."""

    homepage = "https://www.cs.utexas.edu/~flame/web/libFLAME.html"
    url = "https://github.com/flame/libflame/archive/5.1.0.tar.gz"
    git = "https://github.com/flame/libflame.git"

    license("BSD-3-Clause")

    version("master", branch="master")
    version("5.2.0", sha256="997c860f351a5c7aaed8deec00f502167599288fd0559c92d5bfd77d0b4d475c")
    version("5.1.0", sha256="e7189b750890bd781fe773f366b374518dd1d89a6513d3d6261bf549826384d1")

    provides("flame@5.2", when="@5.2.0")
    provides("flame@5.1", when="@5.1.0")

    depends_on("python", type="build")