summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/adol-c/package.py
blob: 749adc5e3ed98e98ee0773aa0dab13b88b30fa41 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
# 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 AdolC(AutotoolsPackage):
    """A package for the automatic differentiation of first and higher
    derivatives of vector functions in C and C++ programs by operator
    overloading."""

    homepage = "https://github.com/coin-or/ADOL-C"
    url = "https://github.com/coin-or/ADOL-C/archive/releases/2.7.2.tar.gz"
    git = "https://github.com/coin-or/ADOL-C.git"
    maintainers("jppelteret")

    license("EPL-1.0")

    version("master", branch="master")
    version("2.7.2", sha256="701e0856baae91b98397960d5e0a87a549988de9d4002d0e9a56fa08f5455f6e")
    version("2.7.1", sha256="a05422cc7faff5700e134e113822d1934fb540ad247e63778524d5d6d75bb0ef")
    version("2.7.0", sha256="a75cfa6240de8692b2a3e8e782319efefc316f1e595234fcee972ab0e7afa3cd")
    version("2.6.3", sha256="9750a0a06dcab9a0dba2010f07872ea9057ed29781e9e7d571691c27aa559b04")
    version("2.6.2", sha256="4ef6ff15b4691235c0ea6580917c7eb17d09ded485ac524a0a33ac7e99ab004b")
    version("2.6.1", sha256="48b41c40d1c8437fb98eeed4b24deaf3e59da804f34ac9c848da1b049b3b071a")
    version("2.6.0", sha256="26a1fcb8561f15781f645d245fc345c83497147ec7bb64d4bfc96e32c34c6c1c")
    version("2.5.2", sha256="390edb1513f749b2dbf6fb90db12ce786f6532af80e589f161ff43646b3a78a6")
    version("2.5.1", sha256="dedb93c3bb291366d799014b04b6d1ec63ca4e7216edf16167776c07961e3b4a")
    version("2.5.0", sha256="9d51c426d831884aac8f418be410c001eb62f3a11cb8f30c66af0b842edffb96")

    variant(
        "advanced_branching",
        default=False,
        description="Enable advanced branching to reduce retaping",
    )
    variant("atrig_erf", default=True, description="Enable arc-trig and error functions")
    variant(
        "traceless_refcounting",
        default=True,
        description="Enable reference counting for tapeless numbers",
    )
    variant(
        "stdczero",
        default=True,
        description="Enable default initialization for the adouble datatype",
    )
    variant("doc", default=True, description="Install documentation")
    variant("openmp", default=False, description="Enable OpenMP support")
    variant("sparse", default=False, description="Enable sparse drivers")
    variant("examples", default=True, description="Install examples")
    variant("boost", default=False, description="Enable boost")

    # Build dependencies
    depends_on("automake", type="build", when="@develop")
    depends_on("autoconf", type="build", when="@develop")
    depends_on("libtool", type="build", when="@develop")
    depends_on("m4", type="build", when="@develop")

    # Link dependencies
    depends_on("boost+system", when="+boost")

    # FIXME: add
    #  --with-colpack=DIR      path to the colpack library and headers
    #                       [default=system libraries]
    #  --with-mpi-root=MPIROOT absolute path to the MPI root directory
    #  --with-mpicc=MPICC      name of the MPI C++ compiler (default mpicc)
    #  --with-mpicxx=MPICXX    name of the MPI C++ compiler (default mpicxx)
    #  --with-ampi=AMPI_DIR    full path to the installation of adjoinable MPI
    #                           (AMPI)

    # The build system doesn't seem to respect the default flag to disable
    # Colpack. When there is an instance of Colpack in path, it will enable
    # it which leads to a cascade of unwanted features to be enabled and
    # ultimately a compilation failure.
    # See https://github.com/xsdk-project/xsdk-examples/issues/16
    patch("disable_colpack.patch", when="@2.7.2:")

    patch("openmp_exam_261.patch", when="@2.6.1")

    def configure_args(self):
        spec = self.spec

        configure_args = []

        if "+boost" in spec:
            configure_args.append(f"--with-boost={spec['boost'].prefix}")
        else:
            configure_args.append("--with-boost=no")

        if "+openmp" in spec:
            configure_args.append(f"--with-openmp-flag={self.compiler.openmp_flag}")

        configure_args.extend(
            self.enable_or_disable("advanced-branching", variant="advanced_branching")
        )
        configure_args.extend(self.enable_or_disable("atrig-erf", variant="atrig_erf"))
        configure_args.extend(
            self.enable_or_disable("traceless-refcounting", variant="traceless_refcounting")
        )
        configure_args.extend(self.enable_or_disable("sparse"))
        configure_args.extend(self.enable_or_disable("stdczero"))

        # We can simply use the bundled examples to check
        # whether Adol-C works as expected
        if "+examples" in spec:
            configure_args.extend(
                [
                    "--enable-docexa",  # Documented examples
                    "--enable-addexa",  # Additional examples
                ]
            )
            if "+openmp" in spec:
                configure_args.append("--enable-parexa")  # Parallel examples

        return configure_args

    @run_after("install")
    def install_additional_files(self):
        spec = self.spec
        prefix = self.prefix

        # Copy the config.h file, as some packages might require it
        source_directory = self.stage.source_path
        config_h = join_path(source_directory, "ADOL-C", "src", "config.h")
        install(config_h, join_path(prefix.include, "adolc"))

        # Install documentation to {prefix}/share
        if "+doc" in spec:
            install_tree(join_path("ADOL-C", "doc"), join_path(prefix.share, "doc"))

        # Install examples to {prefix}/share
        if "+examples" in spec:
            install_tree(join_path("ADOL-C", "examples"), join_path(prefix.share, "examples"))

            # Run some examples that don't require user input
            # TODO: Check that bundled examples produce the correct results
            with working_dir(join_path(source_directory, "ADOL-C", "examples")):
                Executable("./tapeless_scalar")()
                Executable("./tapeless_vector")()

            with working_dir(
                join_path(source_directory, "ADOL-C", "examples", "additional_examples")
            ):
                Executable("./checkpointing/checkpointing")()

            if "+openmp" in spec:
                with working_dir(
                    join_path(source_directory, "ADOL-C", "examples", "additional_examples")
                ):
                    Executable("./checkpointing/checkpointing")()