summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/pagmo/package.py
blob: b3998fee50ecfb390b7bfddb5b754ced69189c5e (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
# 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 *
from spack.pkg.builtin.boost import Boost


class Pagmo(CMakePackage):
    """Parallel Global Multiobjective Optimizer (and its Python alter ego
    PyGMO) is a C++ / Python platform to perform parallel computations of
    optimisation tasks (global and local) via the asynchronous generalized
    island model."""

    # Multiple homepages:
    # C++    interface: https://esa.github.io/pagmo/
    # Python interface: https://esa.github.io/pygmo/

    homepage = "https://esa.github.io/pagmo/"
    url = "https://github.com/esa/pagmo/archive/1.1.7.tar.gz"

    license("GPL-3.0-or-later")

    version("1.1.7", sha256="6d8fab89ef9d5d5f30f148225bf9b84b2e5a38997f3d68b85547840e9fd95172")

    variant("examples", default=False, description="Build examples")
    variant("cxx", default=True, description="Build the C++ interface")
    variant("python", default=True, description="Build Python bindings")
    variant("gsl", default=True, description="Enable support for GSL minimisers")
    variant("gtop", default=False, description="Build GTOP database problems")
    variant("ipopt", default=False, description="Enable support for IPOPT minimiser")
    variant("mpi", default=True, description="Enable support for MPI")
    variant("nlopt", default=False, description="Enable support for NLopt minimisers")
    variant("snopt", default=False, description="Enable support for SNOPT minimiser")
    variant("worhp", default=False, description="Enable support for WORHP minimiser")
    variant("headers", default=True, description="Installs the header files")
    variant("blas", default=True, description="Enable support for BLAS")
    variant("scipy", default=True, description="Enable support for scipy")
    variant("networkx", default=False, description="Enable support for networkx")
    variant("vpython", default=False, description="Enable support for vpython")
    variant("pykep", default=False, description="Enable support for pykep")

    extends("python", when="+python")

    # Concretization in Spack is currently broken
    # depends_on('boost+system+serialization+thread')
    # depends_on('boost+python',    when='+python')
    # depends_on('boost+date_time', when='+gtop')

    # Workaround for now
    depends_on("boost+system+serialization+thread", when="~python~gtop")
    depends_on("boost+system+serialization+thread+python", when="+python~gtop")
    depends_on("boost+system+serialization+thread+date_time", when="~python+gtop")
    depends_on("boost+system+serialization+thread+python+date_time", when="+python+gtop")

    # TODO: replace this with an explicit list of components of Boost,
    # for instance depends_on('boost +filesystem')
    # See https://github.com/spack/spack/pull/22303 for reference
    depends_on(Boost.with_default_variants)

    depends_on("gsl@1.15:", when="+gsl")
    depends_on("ipopt", when="+ipopt")
    depends_on("mpi@1.2:", when="+mpi")
    depends_on("blas", when="+blas")
    depends_on("py-scipy", type=("build", "run"), when="+scipy")
    depends_on("py-networkx", type=("build", "run"), when="+networkx")

    # TODO: Add packages for missing dependencies
    # depends_on('nlopt+cxx', when='+nlopt')
    # depends_on('snopt',     when='+snopt')
    # depends_on('py-vpython',     type=('build', 'run'), when='+vpython')
    # depends_on('py-pykep@1.15:', type=('build', 'run'), when='+gtop')
    # depends_on('py-pykep@1.15:', type=('build', 'run'), when='+pykep')

    depends_on("cmake@2.8:", type="build")

    def variant_to_bool(self, variant):
        return "ON" if variant in self.spec else "OFF"

    def cmake_args(self):
        spec = self.spec

        args = [
            self.define_from_variant("BUILD_EXAMPLES", "examples"),
            self.define_from_variant("BUILD_MAIN", "cxx"),
            self.define_from_variant("BUILD_PYGMO", "python"),
            self.define_from_variant("ENABLE_GSL", "gsl"),
            self.define_from_variant("ENABLE_GTOP_DATABASE", "gtop"),
            self.define_from_variant("ENABLE_IPOPT", "ipopt"),
            self.define_from_variant("ENABLE_MPI", "mpi"),
            self.define_from_variant("ENABLE_NLOPT", "nlopt"),
            self.define_from_variant("ENABLE_SNOPT", "snopt"),
            self.define_from_variant("ENABLE_WORHP", "worhp"),
            self.define_from_variant("INSTALL_HEADERS", "headers"),
            self.define("ENABLE_TESTS", self.run_tests),
        ]

        if "+python" in spec:
            args.extend(
                [
                    # By default picks up the system python not the Spack build
                    "-DPYTHON_EXECUTABLE={0}".format(spec["python"].command.path),
                    # By default installs to the python prefix not the pagmo prefix
                    "-DPYTHON_MODULES_DIR={0}".format(python_platlib),
                ]
            )

        return args