From c827f9d0b6935cb4cb939fe0100e95ea165e6708 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Tue, 13 Dec 2016 22:37:14 +0100 Subject: [PATCH] build system: require more C++14 features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The source will start using the following features from the C++14 standard: • the "std::make_unique()" Standard Library function • digit separators • binary literals • generic lambdas gcc's v4.9.x and clang's v3.4 are the oldest releases to support all of them. --- ChangeLog | 8 +++ README.Windows.md | 6 +- README.md | 12 ++-- ac/c++-features.m4 | 118 ++++++++++++++++++++++++++++++++------- src/common/common.h | 1 - src/common/make_unique.h | 37 ------------ 6 files changed, 117 insertions(+), 65 deletions(-) delete mode 100644 src/common/make_unique.h diff --git a/ChangeLog b/ChangeLog index 4b44564f0..1c39cf521 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2016-12-13 Moritz Bunkus + + * build system: MKVToolNix now requires a compiler that supports + the following features of the C++14 standard: + "std::make_unique()", "digit separators", "binary literals" and + "generic lambdas". For the GNU Compiler Collection (gcc) this + means v4.9.x or newer; for clang it means v3.4 or newer. + 2016-12-11 Moritz Bunkus * mkvmerge: MPEG TS/MPLS reader improvements: added support for diff --git a/README.Windows.md b/README.Windows.md index 17f7c6985..60e94ae5e 100644 --- a/README.Windows.md +++ b/README.Windows.md @@ -9,9 +9,9 @@ that's not supported officially as I don't have such a setup myself. Earlier versions could still be built with Microsoft's Visual Studio / Visual C++ programs, and those steps were described here as well. However, current MKVToolNix versions require many features of -the new C++11 standard which haven't been supported by Microsoft's -compilers for a long time. Additionally the author doesn't use Visual -C++ himself and couldn't provide project files for it. +the C++11 and C++14 standards which Microsoft's compilers have had +spotty support for for a long time. Additionally the author doesn't +use Visual C++ himself and couldn't provide project files for it. # 1. Building with a mingw cross compiler diff --git a/README.md b/README.md index c8c37ef94..a35318e1c 100644 --- a/README.md +++ b/README.md @@ -66,11 +66,13 @@ In order to compile MKVToolNix you need a couple of libraries. Most of them should be available pre-compiled for your distribution. The programs and libraries you absolutely need are: -- A C++ compiler that supports several features of the C++11 standard: - initializer lists, range-based "for" loops, right angle brackets, - the "auto" keyword, lambda functions, the "nullptr" key word, tuples - and alias declarations. Others may be needed, too. For GCC this means - at least v4.8.0; for clang v3.4 or later. +- A C++ compiler that supports several features of the C++11 and C++14 + standards: initializer lists, range-based "for" loops, right angle + brackets, the "auto" keyword, lambda functions, the "nullptr" key + word, tuples, alias declarations, std::make_unique(), digit + separators, binary literals and generic lambdas. Others may be + needed, too. For GCC this means at least v4.9.x; for clang v3.4 or + later. - [libEBML v1.3.4](http://dl.matroska.org/downloads/libebml/) or later and [libMatroska v1.4.5](http://dl.matroska.org/downloads/libmatroska/) diff --git a/ac/c++-features.m4 b/ac/c++-features.m4 index d38ba326f..886f77ae3 100644 --- a/ac/c++-features.m4 +++ b/ac/c++-features.m4 @@ -51,7 +51,7 @@ AC_DEFUN([AX_CXX11_INITIALIZER_LISTS],[ ]) if ! test x"$ax_cv_cxx11_initializer_lists" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * initializer lists" + missing_cxx_features="$missing_cxx_features\n * initializer lists (C++11)" fi ]) @@ -81,7 +81,7 @@ for (std::string &s : listy) ]) if ! test x"$ax_cv_cxx11_range_based_for" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * range-based 'for'" + missing_cxx_features="$missing_cxx_features\n * range-based 'for' (C++11)" fi ]) @@ -109,7 +109,7 @@ typedef std::map> unicorn; ]) if ! test x"$ax_cv_cxx11_right_angle_brackets" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * right angle brackets" + missing_cxx_features="$missing_cxx_features\n * right angle brackets (C++11)" fi ]) @@ -138,7 +138,7 @@ AC_DEFUN([AX_CXX11_AUTO_KEYWORD],[ ]) if ! test x"$ax_cv_cxx11_auto_keyword" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * 'auto' keyword" + missing_cxx_features="$missing_cxx_features\n * 'auto' keyword (C++11)" fi ]) @@ -168,7 +168,7 @@ std::for_each(listy.begin(), listy.end(), [&](unsigned int i) { sum += i; }); ]) if ! test x"$ax_cv_cxx11_lambda_functions" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * lambda functions" + missing_cxx_features="$missing_cxx_features\n * lambda functions (C++11)" fi ]) @@ -191,7 +191,7 @@ AC_DEFUN([AX_CXX11_NULLPTR],[ ]) if ! test x"$ax_cv_cxx11_nullptr" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * nullptr" + missing_cxx_features="$missing_cxx_features\n * nullptr (C++11)" fi ]) @@ -217,7 +217,7 @@ AC_DEFUN([AX_CXX11_TUPLES],[ ]) if ! test x"$ax_cv_cxx11_tuples" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * tuples" + missing_cxx_features="$missing_cxx_features\n * tuples (C++11)" fi ]) @@ -245,7 +245,7 @@ using thingy = std::vector; ]) if ! test x"$ax_cv_cxx11_alias_declarations" = xyes ; then - missing_cxx_features="$missing_cxx_features\n * alias declarations" + missing_cxx_features="$missing_cxx_features\n * alias declarations (C++11)" fi ]) @@ -267,13 +267,90 @@ AC_DEFUN([AX_CXX14_MAKE_UNIQUE],[ CXXFLAGS="$CXXFLAGS_SAVED" ]) - if test x"$ax_cv_cxx14_make_unique" = xyes ; then - AC_DEFINE(HAVE_STD_MAKE_UNIQUE, 1, [Define if std::make_unique exists]) + if ! test x"$ax_cv_cxx14_make_unique" = xyes ; then + missing_cxx_features="$missing_cxx_features\n * std::make_unique function (C++14)" fi ]) -dnl AC_DEFUN([AX_CXX11_DEF_NAME],[ -dnl AC_CACHE_CHECK([for support for C++11 feature "human"], [ax_cv_cxx11_def_name],[ +AC_DEFUN([AX_CXX14_DIGIT_SEPARATORS],[ + AC_CACHE_CHECK([for support for C++14 feature "digit separators"], [ax_cv_cxx14_digit_separators],[ + + CXXFLAGS_SAVED=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $STD_CXX" + export CXXFLAGS + + AC_LANG_PUSH(C++) + AC_TRY_COMPILE( + [], + [auto num = 10'000'000'000ll;], + [ax_cv_cxx14_digit_separators="yes"], + [ax_cv_cxx14_digit_separators="no"]) + AC_LANG_POP + + CXXFLAGS="$CXXFLAGS_SAVED" + ]) + + if ! test x"$ax_cv_cxx14_digit_separators" = xyes ; then + missing_cxx_features="$missing_cxx_features\n * digit separators (C++14)" + fi +]) + +AC_DEFUN([AX_CXX14_BINARY_LITERALS],[ + AC_CACHE_CHECK([for support for C++14 feature "binary literals"], [ax_cv_cxx14_binary_literals],[ + + CXXFLAGS_SAVED=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $STD_CXX" + export CXXFLAGS + + AC_LANG_PUSH(C++) + AC_TRY_COMPILE( + [], + [auto num1 = 0b00101010; + auto num2 = 0B00101010; + auto num3 = 0b0010'1010;], + [ax_cv_cxx14_binary_literals="yes"], + [ax_cv_cxx14_binary_literals="no"]) + AC_LANG_POP + + CXXFLAGS="$CXXFLAGS_SAVED" + ]) + + if ! test x"$ax_cv_cxx14_binary_literals" = xyes ; then + missing_cxx_features="$missing_cxx_features\n * binary literals (C++14)" + fi +]) + +AC_DEFUN([AX_CXX14_GENERIC_LAMBDAS],[ + AC_CACHE_CHECK([for support for C++14 feature "generic lambdas"], [ax_cv_cxx14_generic_lambdas],[ + + CXXFLAGS_SAVED=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $STD_CXX" + export CXXFLAGS + + AC_LANG_PUSH(C++) + AC_TRY_COMPILE( + [ + #include + #include + ], + [ + std::vector vv; + std::sort(vv.begin(), vv.end(), [](auto &a, auto &b) { return b < a; }); + ], + [ax_cv_cxx14_generic_lambdas="yes"], + [ax_cv_cxx14_generic_lambdas="no"]) + AC_LANG_POP + + CXXFLAGS="$CXXFLAGS_SAVED" + ]) + + if ! test x"$ax_cv_cxx14_generic_lambdas" = xyes ; then + missing_cxx_features="$missing_cxx_features\n * generic lambdas (C++14)" + fi +]) + +dnl AC_DEFUN([AX_CXX14_DEF_NAME],[ +dnl AC_CACHE_CHECK([for support for C++14 feature "human"], [ax_cv_cxx14_def_name],[ dnl dnl CXXFLAGS_SAVED=$CXXFLAGS dnl CXXFLAGS="$CXXFLAGS $STD_CXX" @@ -283,15 +360,15 @@ dnl AC_LANG_PUSH(C++) dnl AC_TRY_COMPILE( dnl [], dnl [], -dnl [ax_cv_cxx11_def_name="yes"], -dnl [ax_cv_cxx11_def_name="no"]) +dnl [ax_cv_cxx14_def_name="yes"], +dnl [ax_cv_cxx14_def_name="no"]) dnl AC_LANG_POP dnl dnl CXXFLAGS="$CXXFLAGS_SAVED" dnl ]) dnl -dnl if ! test x"$ax_cv_cxx11_def_name" = xyes ; then -dnl missing_cxx_features="$missing_cxx_features\n * human" +dnl if ! test x"$ax_cv_cxx14_def_name" = xyes ; then +dnl missing_cxx_features="$missing_cxx_features\n * human (C++14)" dnl fi dnl ]) @@ -305,10 +382,13 @@ AX_CXX11_NULLPTR AX_CXX11_TUPLES AX_CXX11_ALIAS_DECLARATIONS AX_CXX14_MAKE_UNIQUE +AX_CXX14_DIGIT_SEPARATORS +AX_CXX14_BINARY_LITERALS +AX_CXX14_GENERIC_LAMBDAS if test x"$missing_cxx_features" != x ; then - printf "The following features of the C++11 standard are not supported by $CXX:$missing_cxx_features\n" + printf "The following features of the C++11/C++14 standards are not supported by $CXX:$missing_cxx_features\n" printf "If you are using the GNU C compiler collection (gcc) then you need\n" - printf "at least v4.6.\n" - AC_MSG_ERROR([support for required C++11 features incomplete]) + printf "at least v4.9.x.\n" + AC_MSG_ERROR([support for required C++11/C++14 features incomplete]) fi diff --git a/src/common/common.h b/src/common/common.h index a7a6ed449..0fddd67fb 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -91,7 +91,6 @@ namespace brng = boost::range; #include "common/debugging.h" #include "common/error.h" -#include "common/make_unique.h" #include "common/memory.h" #include "common/mm_io.h" #include "common/output.h" diff --git a/src/common/make_unique.h b/src/common/make_unique.h deleted file mode 100644 index d4fa6e648..000000000 --- a/src/common/make_unique.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - mkvmerge -- utility for splicing together matroska files - from component media subtypes - - Distributed under the GPL v2 - see the file COPYING for details - or visit http://www.gnu.org/copyleft/gpl.html - - A definition for std::make_unique for compilers that don't have it - yet (C++14). - - Written by Moritz Bunkus . -*/ - -#ifndef MTX_COMMON_MAKE_UNIQUE_H -#define MTX_COMMON_MAKE_UNIQUE_H - -#include "config.h" - -#if !defined(HAVE_STD_MAKE_UNIQUE) - -# include -# include - -namespace std { - -template -std::unique_ptr make_unique(Targs &&... args) { - return std::unique_ptr(new Ttype(std::forward(args)...)); -} - -} - -#endif // !HAVE_STD_MAKE_UNIQUE - -#endif // MTX_COMMON_MAKE_UNIQUE_H