* Incorporate as a patch upstream commit 0c20dbf059 (diff-acb9169b4ccbac494ced5140d285a015)
resolving problems with `-Wno-...` options not being understood by GCC.
* Incorporate as a patch upstream PR https://github.com/ericniebler/range-v3/pull/1202 fixing upstream issue https://github.com/ericniebler/range-v3/issues/1196.
* Compile tests only if we actually want to run them.
* Optionally compile documentation with a `+doc` variant.
* Add `+examples` and `+perf` variants to avoid unnecessary compilation of components usually not required for install.
* Add conditional build-only dependency on Boost when appropriate.
* Install docs, examples and performance tests if built (not part of upstream build instructions).
* Add @chissg as a maintainer.
This commit is contained in:
parent
b6789b2ba3
commit
0c1496896d
@ -0,0 +1,96 @@
|
||||
diff --git a/include/meta/meta_fwd.hpp b/include/meta/meta_fwd.hpp
|
||||
index edfb9068..ac041999 100644
|
||||
--- a/include/meta/meta_fwd.hpp
|
||||
+++ b/include/meta/meta_fwd.hpp
|
||||
@@ -152,6 +152,13 @@
|
||||
#define META_TYPE_CONSTRAINT(...) typename
|
||||
#endif
|
||||
|
||||
+#if (defined(__cpp_lib_type_trait_variable_templates) && \
|
||||
+ __cpp_lib_type_trait_variable_templates > 0)
|
||||
+#define META_CXX_TRAIT_VARIABLE_TEMPLATES 1
|
||||
+#else
|
||||
+#define META_CXX_TRAIT_VARIABLE_TEMPLATES 0
|
||||
+#endif
|
||||
+
|
||||
namespace meta
|
||||
{
|
||||
#if META_CXX_INTEGER_SEQUENCE
|
||||
@@ -208,8 +215,10 @@ namespace meta
|
||||
META_CONCEPT_BARRIER(__is_same(T, U));
|
||||
#elif defined(__GNUC__) && __GNUC__ >= 6
|
||||
META_CONCEPT_BARRIER(__is_same_as(T, U));
|
||||
-#else
|
||||
+#elif defined(META_CXX_TRAIT_VARIABLE_TEMPLATES)
|
||||
META_CONCEPT_BARRIER(std::is_same_v<T, U>);
|
||||
+#else
|
||||
+ META_CONCEPT_BARRIER(std::is_same<T, U>::value);
|
||||
#endif
|
||||
|
||||
template <template <typename...> class C, typename... Ts>
|
||||
@@ -248,7 +257,11 @@ namespace meta
|
||||
typename T::type::value_type;
|
||||
}
|
||||
&& Same<typename T::value_type, typename T::type::value_type>
|
||||
+#if META_CXX_TRAIT_VARIABLE_TEMPLATES
|
||||
&& std::is_integral_v<typename T::value_type>
|
||||
+#else
|
||||
+ && std::is_integral<typename T::value_type>::value
|
||||
+#endif
|
||||
&& requires
|
||||
{
|
||||
// { T::value } -> Same<const typename T::value_type&>;
|
||||
diff --git a/include/range/v3/range_fwd.hpp b/include/range/v3/range_fwd.hpp
|
||||
index 0378a0bd..2fabf26c 100644
|
||||
--- a/include/range/v3/range_fwd.hpp
|
||||
+++ b/include/range/v3/range_fwd.hpp
|
||||
@@ -247,6 +247,16 @@ namespace ranges
|
||||
struct priority_tag<0>
|
||||
{};
|
||||
|
||||
+ template<typename T>
|
||||
+ using is_trivial = meta::bool_<
|
||||
+#if META_CXX_TRAIT_VARIABLE_TEMPLATES
|
||||
+ std::is_trivially_copyable_v<T> &&
|
||||
+ std::is_trivially_default_constructible_v<T>>;
|
||||
+#else
|
||||
+ std::is_trivially_copyable<T>::value &&
|
||||
+ std::is_trivially_default_constructible<T>::value>;
|
||||
+#endif
|
||||
+
|
||||
#if defined(__clang__) && !defined(_LIBCPP_VERSION)
|
||||
template<typename T, typename... Args>
|
||||
using is_trivially_constructible =
|
||||
@@ -272,19 +282,6 @@ namespace ranges
|
||||
template<typename T>
|
||||
using is_trivially_copyable =
|
||||
meta::bool_<__is_trivially_copyable(T)>;
|
||||
- #elif defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5
|
||||
- template<typename T>
|
||||
- using is_trivially_default_constructible = std::is_trivial<T>;
|
||||
- template<typename T>
|
||||
- using is_trivially_copy_constructible = std::is_trivial<T>;
|
||||
- template<typename T>
|
||||
- using is_trivially_move_constructible = std::is_trivial<T>;
|
||||
- template<typename T>
|
||||
- using is_trivially_copy_assignable = std::is_trivial<T>;
|
||||
- template<typename T>
|
||||
- using is_trivially_move_assignable = std::is_trivial<T>;
|
||||
- template<typename T>
|
||||
- using is_trivially_copyable = std::is_trivial<T>;
|
||||
#else
|
||||
template<typename T>
|
||||
using is_trivially_default_constructible =
|
||||
diff --git a/include/range/v3/utility/box.hpp b/include/range/v3/utility/box.hpp
|
||||
index 5e8b90dd..33d674df 100644
|
||||
--- a/include/range/v3/utility/box.hpp
|
||||
+++ b/include/range/v3/utility/box.hpp
|
||||
@@ -128,7 +128,7 @@ namespace ranges
|
||||
// MSVC pukes passing non-constant-expression objects to constexpr
|
||||
// functions, so do not coalesce.
|
||||
template<typename T, typename = meta::if_<
|
||||
- meta::strict_and<std::is_empty<T>, std::is_trivial<T>>>>
|
||||
+ meta::strict_and<std::is_empty<T>, detail::is_trivial<T>>>>
|
||||
constexpr box_compress box_compression_(int)
|
||||
{
|
||||
return box_compress::coalesce;
|
@ -0,0 +1,43 @@
|
||||
From 0c20dbf05973368339aeae0c4e106560e2dcf76b Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Guriev <guriev-ns@ya.ru>
|
||||
Date: Sat, 27 Apr 2019 09:10:38 +0300
|
||||
Subject: [PATCH] Improve check of -Wno-* compiler flags
|
||||
|
||||
The GCC documentation says that unrecognized warning options in
|
||||
the -Wno-* form do not cause errors unless other diagnostics are issued.
|
||||
And thus unsupported flags may be appended. This results in a failed
|
||||
build when there are some false positive warnings. So to check warning
|
||||
options, we strip "no-" prefix.
|
||||
|
||||
The ranges_append_flag macro is no longer variadic and it takes only the
|
||||
first two arguments. Use quotes if you need flags separated by spaces.
|
||||
Example: ranges_append_flag(TEST "-X val").
|
||||
---
|
||||
cmake/ranges_flags.cmake | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/cmake/ranges_flags.cmake b/cmake/ranges_flags.cmake
|
||||
index 00e23179..714968e9 100644
|
||||
--- a/cmake/ranges_flags.cmake
|
||||
+++ b/cmake/ranges_flags.cmake
|
||||
@@ -8,10 +8,14 @@
|
||||
|
||||
# Compilation flags
|
||||
include(CheckCXXCompilerFlag)
|
||||
-macro(ranges_append_flag testname flag ${ARGN})
|
||||
- check_cxx_compiler_flag("${flag} ${ARGN}" ${testname})
|
||||
+macro(ranges_append_flag testname flag)
|
||||
+ # As -Wno-* flags do not lead to build failure when there are no other
|
||||
+ # diagnostics, we check positive option to determine their applicability.
|
||||
+ # Of course, we set the original flag that is requested in the parameters.
|
||||
+ string(REGEX REPLACE "^-Wno-" "-W" alt ${flag})
|
||||
+ check_cxx_compiler_flag(${alt} ${testname})
|
||||
if (${testname})
|
||||
- add_compile_options(${flag} ${ARGN})
|
||||
+ add_compile_options(${flag})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
@ -5,6 +5,9 @@
|
||||
|
||||
from spack import *
|
||||
|
||||
import os
|
||||
import shutil
|
||||
|
||||
|
||||
class RangeV3(CMakePackage):
|
||||
"""Range v3 forms the basis of a proposal to add range support to the
|
||||
@ -16,6 +19,7 @@ class RangeV3(CMakePackage):
|
||||
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 = ['chissg']
|
||||
|
||||
version('develop', branch='master')
|
||||
version('0.5.0', sha256='32e30b3be042246030f31d40394115b751431d9d2b4e0f6d58834b2fd5594280')
|
||||
@ -41,6 +45,18 @@ class RangeV3(CMakePackage):
|
||||
multi=False,
|
||||
description='Use the specified C++ standard when building.')
|
||||
|
||||
variant('doc',
|
||||
default=True,
|
||||
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')
|
||||
@ -49,10 +65,113 @@ class RangeV3(CMakePackage):
|
||||
conflicts('%gcc@:5.99.99', when='cxxstd=17')
|
||||
|
||||
depends_on('cmake@3.6:', type='build')
|
||||
depends_on('doxygen+graphviz', type='build')
|
||||
depends_on('doxygen+graphviz', type='build', when='+doc')
|
||||
depends_on('boost@1.59.0: cxxstd=14', type='build',
|
||||
when='+examples cxxstd=14')
|
||||
depends_on('boost@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(self.spec.variants['cxxstd'].value)
|
||||
'-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')
|
||||
|
Loading…
Reference in New Issue
Block a user