spack/var/spack/repos/builtin/packages/range-v3/package.py
Chris Green 09d9b48957
range-v3: remove overbroad boost dependence (#38539)
Co-authored-by: greenc-FNAL <greenc-FNAL@users.noreply.github.com>
2023-06-24 10:25:39 +02:00

175 lines
7.2 KiB
Python

# 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)
import os
import shutil
from spack.package import *
class RangeV3(CMakePackage):
"""Range v3 forms the basis of a proposal to add range support to the
standard library (N4128: Ranges for the Standard Library). It also will
be the reference implementation for an upcoming Technical
Specification. These are the first steps toward turning ranges into an
international standard."""
homepage = "https://github.com/ericniebler/range-v3"
url = "https://github.com/ericniebler/range-v3/archive/0.3.6.tar.gz"
git = "https://github.com/ericniebler/range-v3.git"
maintainers("greenc-FNAL")
version("master", branch="master")
version("0.11.0", sha256="376376615dbba43d3bef75aa590931431ecb49eb36d07bb726a19f680c75e20c")
version("0.10.0", sha256="5a1cd44e7315d0e8dcb1eee4df6802221456a9d1dbeac53da02ac7bd4ea150cd")
version("0.5.0", sha256="32e30b3be042246030f31d40394115b751431d9d2b4e0f6d58834b2fd5594280")
version("0.4.0", sha256="5dbc878b7dfc500fb04b6b9f99d63993a2731ea34b0a4b8d5f670a5a71a18e39")
version("0.3.7", sha256="e6b0fb33bfd07ec32d54bcddd3e8d62e995a3cf0b64b34788ec264da62581207")
version("0.3.6", sha256="ce6e80c6b018ca0e03df8c54a34e1fd04282ac1b068cd39e902e2e5201ac117f")
version("0.3.5", sha256="0a0094b450fe17e1454468bef5b6bf60e73ef100aebe1663daf6fbdf2c353836")
version("0.3.0", sha256="cc29fbed5b06b11e7f9a732f7e1211483ebbd3cfe29d86e40c93209014790d74")
version("0.2.6", sha256="b1b448ead59bd726248bcb607b4a47335a00bed1c74630e09d550da3ff72d02c")
version("0.2.5", sha256="4125089da83dec3f0ed676066f0cf583fe55dd9270bc62f1736907f57656ca7e")
version("0.2.4", sha256="6fc4f9e80ee8eb22302db45c5648c665817aeeeee7f99b7effdf6a38a1be9a75")
version("0.2.3", sha256="214a3f0ea70d479ca58f0af8938de49a9ed476564213431ab3b8e02a849b8098")
version("0.2.2", sha256="01a7bee222570a55a79c84a54b2997ed718dac06f43a82122ff0150a11477f9d")
version("0.2.1", sha256="25d5e3dad8052d668873e960bd78f068bebfba3bd28a278f805ea386f9438790")
version("0.2.0", sha256="49b1a62a7a36dab582521c8034d8e736a8922af664d007c1529d3162b1294331")
# Note that as of 0.3.6 range is a header-only library so it is not
# necessary to match standards with packages using this
# one. Eventually range-v3 will be obsoleted by the C++ standard.
variant(
"cxxstd",
default="11",
values=("11", "14", "17"),
multi=False,
description="Use the specified C++ standard when building.",
)
variant("doc", default=False, description="Build and install documentation.")
variant("examples", default=False, description="Build and install examples.")
variant("perf", default=False, description="Build performance benchmarks")
# Known compiler conflicts. Your favorite compiler may also conflict
# depending on its C++ standard support.
conflicts("%clang@:3.6.1")
conflicts("%clang@:3.9", when="@0.11.0:")
conflicts("%gcc@:4.9.0")
conflicts("%gcc@:5.2.0", when="cxxstd=14")
conflicts("%gcc@:5", when="cxxstd=17")
depends_on("cmake@3.6:", type="build")
depends_on("doxygen+graphviz", type="build", when="+doc")
depends_on(
"boost+date_time+program_options@1.59.0: cxxstd=14",
type="build",
when="+examples cxxstd=14",
)
depends_on(
"boost+date_time+program_options@1.59.0: cxxstd=17",
type="build",
when="+examples cxxstd=17",
)
# Fix reported upstream issue
# https://github.com/ericniebler/range-v3/issues/1196 per PR
# https://github.com/ericniebler/range-v3/pull/1202.
patch("fix-is_trivial.patch", level=1, when="@0.5.0")
# Some -Wno-... options unknown to GCC were being checked as OK to
# use but causing problems during the build. Patch from
# https://github.com/ericniebler/range-v3/commit/0c20dbf05973368339aeae0c4e106560e2dcf76b#diff-acb9169b4ccbac494ced5140d285a015
patch("gcc-compile-opt-check.patch", level=1, when="@0.5.0%gcc")
def _remove_cmake_subdir(self, subdir):
filter_file(
r"^(\s*add_subdirectory\s*\(\s*{0}\s*\))".format(subdir), r"#\1", "CMakeLists.txt"
)
# Deal with variant choices for versions that don't have applicable
# CMake switches.
def patch(self):
spec = self.spec
if spec.satisfies("@:0.3.0"):
if not self.run_tests:
self._remove_cmake_subdir("test")
if "+examples" not in spec:
self._remove_cmake_subdir("example")
if "+perf" not in spec:
self._remove_cmake_subdir("perf")
if spec.satisfies("@:0.3.6~doc"):
self._remove_cmake_subdir("doc")
def cmake_args(self):
spec = self.spec
cxxstd = self.spec.variants["cxxstd"].value
on_or_off = lambda opt: "ON" if "+" + opt in spec else "OFF"
args = ["-DRANGES_CXX_STD={0}".format(cxxstd)]
if spec.satisfies("@0.3.7:"):
args.append("-DRANGE_V3_DOCS=" + on_or_off("doc"))
if spec.satisfies("@0.3.6:"):
args.append("-DRANGE_V3_TESTS=" + ("ON" if self.run_tests else "OFF"))
args.append("-DRANGE_V3_EXAMPLES=" + on_or_off("examples"))
args.append("-DRANGE_V3_PERF=" + on_or_off("perf"))
elif spec.satisfies("@0.3.1:"):
args.append("-DRANGE_V3_NO_TESTING=" + ("OFF" if self.run_tests else "ON"))
args.append("-DRANGE_V3_NO_EXAMPLE=" + ("OFF" if "+examples" in spec else "ON"))
args.append("-DRANGE_V3_NO_PERF=" + ("OFF" if "+perf" in spec else "ON"))
else:
# Older versions don't have the right switches. See patch() above.
pass
if not self.run_tests:
args.append("-DRANGE_V3_NO_HEADER_CHECK=ON")
if "+examples" in spec:
args.append(
"-DRANGES_BUILD_CALENDAR_EXAMPLE=" + ("ON" if cxxstd in ["14", "17"] else "OFF")
)
return args
@property
def build_targets(self):
spec = self.spec
targets = []
if "+doc" in spec:
targets.extend(["all", "doc"])
return targets
def _copy_and_clean_dirs(self, subdir):
install_tree(subdir, os.path.join(self.prefix, subdir))
with working_dir(self.build_directory):
install_tree(subdir, os.path.join(self.prefix, subdir))
with working_dir(os.path.join(self.prefix, subdir)):
shutil.rmtree("CMakeFiles")
for f in ("cmake_install.cmake", "CTestTestfile.cmake", "Makefile", "CMakeLists.txt"):
if os.path.exists(f):
os.remove(f)
@run_after("install")
def install_extra(self):
spec = self.spec
# Install docs.
if "+doc" in spec:
with working_dir(self.build_directory):
install_tree(os.path.join("doc", "html"), os.path.join(self.prefix, "doc", "html"))
# Install examples.
if "+examples" in spec:
self._copy_and_clean_dirs("example")
# Install performance benchmarks.
if "+perf" in spec:
self._copy_and_clean_dirs("perf")