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")()
|