summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/py-cvxopt/package.py
blob: 2fcf1433e6b5f503af1708cc236935b908def328 (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
# Copyright 2013-2024 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 PyCvxopt(PythonPackage):
    """CVXOPT is a free software package for convex optimization based on the
    Python programming language."""

    homepage = "https://cvxopt.org/"
    pypi = "cvxopt/cvxopt-1.1.9.tar.gz"

    license("GPL-3.0-only")

    version("1.2.5", sha256="94ec8c36bd6628a11de9014346692daeeef99b3b7bae28cef30c7490bbcb2d72")

    variant(
        "gsl",
        default=False,
        description="Use GSL random number generators for constructing random matrices",
    )
    variant("fftw", default=False, description="Install the cvxopt.fftw interface to FFTW")
    variant(
        "glpk", default=False, description="Enable support for the linear programming solver GLPK"
    )
    # variant(
    #     'mosek',
    #     default=False,
    #     description=(
    #         'Enable support for the linear, second-order cone, and quadratic '
    #         'programming solvers in MOSEK'
    #     ),
    # )
    variant(
        "dsdp",
        default=False,
        description="Enable support for the semidefinite programming solver DSDP",
    )

    # Required dependencies
    depends_on("python@2.7:", type=("build", "link", "run"))
    depends_on("py-setuptools", type="build")
    depends_on("blas")
    depends_on("lapack")
    depends_on("suite-sparse")

    # Optional dependencies
    depends_on("gsl", when="+gsl")
    depends_on("fftw", when="+fftw")
    depends_on("glpk", when="+glpk")
    # depends_on('mosek@8:',  when='+mosek')
    depends_on("dsdp@5.8:", when="+dsdp")

    def setup_build_environment(self, env):
        spec = self.spec

        # BLAS/LAPACK Libraries

        # Default names of BLAS and LAPACK libraries
        env.set("CVXOPT_BLAS_LIB", ";".join(spec["blas"].libs.names))
        env.set("CVXOPT_LAPACK_LIB", ";".join(spec["lapack"].libs.names))

        # Directory containing BLAS and LAPACK libraries
        env.set("CVXOPT_BLAS_LIB_DIR", spec["blas"].libs.directories[0])

        # SuiteSparse Libraries

        # Directory containing SuiteSparse libraries
        env.set("CVXOPT_SUITESPARSE_LIB_DIR", spec["suite-sparse"].libs.directories[0])

        # Directory containing SuiteSparse header files
        env.set("CVXOPT_SUITESPARSE_INC_DIR", spec["suite-sparse"].headers.directories[0])

        # GSL Libraries

        if "+gsl" in spec:
            env.set("CVXOPT_BUILD_GSL", 1)

            # Directory containing libgsl
            env.set("CVXOPT_GSL_LIB_DIR", spec["gsl"].libs.directories[0])

            # Directory containing the GSL header files
            env.set("CVXOPT_GSL_INC_DIR", spec["gsl"].headers.directories[0])
        else:
            env.set("CVXOPT_BUILD_GSL", 0)

        # FFTW Libraries

        if "+fftw" in spec:
            env.set("CVXOPT_BUILD_FFTW", 1)

            # Directory containing libfftw3
            env.set("CVXOPT_FFTW_LIB_DIR", spec["fftw"].libs.directories[0])

            # Directory containing fftw.h
            env.set("CVXOPT_FFTW_INC_DIR", spec["fftw"].headers.directories[0])
        else:
            env.set("CVXOPT_BUILD_FFTW", 0)

        # GLPK Libraries

        if "+glpk" in spec:
            env.set("CVXOPT_BUILD_GLPK", 1)

            # Directory containing libglpk
            env.set("CVXOPT_GLPK_LIB_DIR", spec["glpk"].libs.directories[0])

            # Directory containing glpk.h
            env.set("CVXOPT_GLPK_INC_DIR", spec["glpk"].headers.directories[0])
        else:
            env.set("CVXOPT_BUILD_GLPK", 0)

        # DSDP Libraries

        if "+dsdp" in spec:
            env.set("CVXOPT_BUILD_DSDP", 1)

            # Directory containing libdsdp
            env.set("CVXOPT_DSDP_LIB_DIR", spec["dsdp"].libs.directories[0])

            # Directory containing dsdp5.h
            env.set("CVXOPT_DSDP_INC_DIR", spec["dsdp"].headers.directories[0])

    @run_after("install")
    @on_package_attributes(run_tests=True)
    def install_test(self):
        """Test that the installation was successful."""
        python("-m", "unittest", "discover", "-s", "tests")