diff --git a/cmake/Modules/FindCXX11Features.cmake b/cmake/Modules/FindCXX11Features.cmake deleted file mode 100644 index e06e8f714..000000000 --- a/cmake/Modules/FindCXX11Features.cmake +++ /dev/null @@ -1,468 +0,0 @@ -# -# Module that checks for supported C++11 (former C++0x) features. -# -# Sets the follwing variable: -# -# HAVE_FINAL True if the compiler supports the "final" quantifier -# HAVE_TYPE_TRAITS True if the header is available and implements sufficient functionality -# HAVE_SHARED_PTR True if std::shared_ptr is available -# HAVE_UNIQUE_PTR True if std::unique_ptr is available -# HAVE_NULLPTR True if nullptr is available -# HAVE_ARRAY True if header and fill() are available -# HAVE_ATTRIBUTE_ALWAYS_INLINE True if attribute always inline is supported -# HAS_ATTRIBUTE_UNUSED True if attribute unused is supported -# HAS_ATTRIBUTE_DEPRECATED True if attribute deprecated is supported -# HAS_ATTRIBUTE_DEPRECATED_MSG True if attribute deprecated("msg") is supported -# HAVE_CONSTEXPR True if constexpr attribute is available -# HAVE_INTEGRAL_CONSTANT True if compiler supports integral_constant -# HAVE_STATIC_ASSERT True if static_assert is available -# HAVE_AUTO True if the compiler supports the auto keyword -# HAVE_VARIADIC_TEMPLATES True if variadic templates are supported -# HAVE_VARIADIC_CONSTRUCTOR_SFINAE True if variadic constructor sfinae is supported -# HAVE_RVALUE_REFERENCES True if rvalue references are supported -# HAVE_TUPLE True if std::tuple is available -# HAVE_TR1_TUPLE True if std::tr1::tuple is available - -include(CheckCXXSourceCompiles) -include(CheckCXXSourceRuns) - -# test for C++11 flags -include(TestCXXAcceptsFlag) -include(CheckIncludeFileCXX) - -# macro to only add option once -include(AddOptions) - -# Force CXX Standard cross platfrom for CMakeVersion >=3.1 -set(CMAKE_CXX_EXTENSIONS OFF) - -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 11) - - - if(NOT MSVC) - foreach(_flag "14" "11") - set(_FLAG "CXX_FLAG_CXX${_flag}") - string(TOUPPER ${_FLAG} _FLAG) - # try to use compiler flag -std=c++${_flag} - CHECK_CXX_ACCEPTS_FLAG("-std=c++${_flag}" ${_FLAG}) - - if(${_FLAG}) - if(CMAKE_VERSION VERSION_LESS 3.1) - add_options (CXX ALL_BUILDS "-std=c++${_flag}") - endif() - set(CXX_STD0X_FLAGS "-std=c++${_flag}") - #Use vriables for CMake > 3.1 set the standard with no extensions - set(CMAKE_CXX_STANDARD ${_flag}) - break() - endif() - endforeach() - endif(NOT MSVC) -endif() - -if(CMAKE_VERSION VERSION_LESS 3.1) - # if we are building with an Apple toolchain in MacOS X, - # we cannot use the old GCC 4.2 fork, but must use the - # new runtime library - set (CXX_STDLIB_FLAGS) - string (TOUPPER "${CMAKE_CXX_COMPILER_ID}" _comp_id) - if (APPLE AND (_comp_id MATCHES "CLANG")) - CHECK_CXX_ACCEPTS_FLAG ("-stdlib=libc++" CXX_FLAG_STDLIB_LIBCXX) - if (CXX_FLAG_STDLIB_LIBCXX) - add_options (CXX ALL_BUILDS "-stdlib=libc++") - set (CXX_STDLIB_FLAGS "-stdlib=libc++") - endif (CXX_FLAG_STDLIB_LIBCXX) - endif (APPLE AND (_comp_id MATCHES "CLANG")) - - # to format the command-line options pretty, we have an optional space - if (CXX_STD0X_FLAGS AND CXX_STDLIB_FLAGS) - set (CXX_SPACE " ") - else (CXX_STD0X_FLAGS AND CXX_STDLIB_FLAGS) - set (CXX_SPACE) - endif (CXX_STD0X_FLAGS AND CXX_STDLIB_FLAGS) -endif() - -if(NOT CMAKE_VERSION VERSION_LESS 3.1) - # Workaround bug in cmake: - # cxx standard flags are not applied in CheckCXXSourceCompiles - if (CMAKE_CXX_STANDARD EQUAL 14) - add_options(CXX ALL_BUILDS ${CMAKE_CXX14_STANDARD_COMPILE_OPTION}) - else() - add_options(CXX ALL_BUILDS ${CMAKE_CXX11_STANDARD_COMPILE_OPTION}) - endif() -endif() - - -# perform tests -include(CheckCXXSourceCompiles) - -# the "final" method specifier -CHECK_CXX_SOURCE_COMPILES(" -struct Base { - virtual void foo() = 0; -}; -struct Derived : public Base { - virtual void foo() final {}; -}; - -int main() -{ - return 0; -} -" HAVE_FINAL -) - -# std::is_convertible, std::is_base_of -CHECK_CXX_SOURCE_COMPILES(" -#include - -class Base {}; -class Derived : public Base {}; - -int main() -{ - bool foo = std::is_convertible::value; - bool bar = std::is_base_of::value; - bool foobar = std::is_integral::value; - return 0; -} -" HAVE_TYPE_TRAITS -) - -# nullptr -CHECK_CXX_SOURCE_COMPILES(" - #include - - int main(void) - { - std::shared_ptr foo(new int(123)); - return 0; - } -" HAVE_SHARED_PTR -) - -# this is required by dune-common to avoid linker errors. "fun"! -if (HAVE_SHARED_PTR) - set(HAVE_MAKE_SHARED 1) - set(SHARED_PTR_HEADER "") - set(SHARED_PTR_NAMESPACE "std") -endif() - -# nullptr -CHECK_CXX_SOURCE_COMPILES(" - #include - - int main(void) - { - std::unique_ptr foo(new int(123)); - return 0; - } -" HAVE_UNIQUE_PTR -) - -# nullptr -CHECK_CXX_SOURCE_COMPILES(" - int main(void) - { - char* ch = nullptr; - return 0; - } -" HAVE_NULLPTR -) - -# constexpr -CHECK_CXX_SOURCE_COMPILES(" - template - inline constexpr int foo(T bar) { return bar*2; } - int main(void) - { - constexpr int foobar = foo(100); - return 0; - } -" HAVE_CONSTEXPR -) - -# array and fill -CHECK_CXX_SOURCE_COMPILES(" - #include - - int main(void) - { - std::array a; - a.fill(9); - return 0; - } -" HAVE_ARRAY -) - -# Check whether if std::integral_constant< T, v > is supported and casts into T -CHECK_CXX_SOURCE_COMPILES(" - #include - void f( int ){} - - int main(void){ - f( std::integral_constant< int, 42 >() ); - } -" HAVE_INTEGRAL_CONSTANT -) - -# Check whether if is available -check_include_file_cxx("tuple" HAVE_TUPLE) - -# Check whether if is available -check_include_file_cxx("tr1/tuple" HAVE_TR1_TUPLE) - -# __attribute__((always_inline)) -CHECK_CXX_SOURCE_COMPILES(" - void __attribute__((always_inline)) foo(void) {} - int main(void) - { - foo(); - return 0; - }; -" HAVE_ATTRIBUTE_ALWAYS_INLINE -) - -# __attribute__((unused)) -CHECK_CXX_SOURCE_COMPILES(" - int main(void) - { - int __attribute__((unused)) foo; - return 0; - }; -" HAS_ATTRIBUTE_UNUSED -) - -# __attribute__((deprecated)) -CHECK_CXX_SOURCE_COMPILES(" -#define DEP __attribute__((deprecated)) - class bar - { - bar() DEP; - }; - - class peng { } DEP; - - template - class t_bar - { - t_bar() DEP; - }; - - template - class t_peng { - t_peng() {}; - } DEP; - - void foo() DEP; - - void foo() {}; - - int main(void) - { - return 0; - }; -" HAS_ATTRIBUTE_DEPRECATED -) - -# __attribute__((deprecated("msg"))) -CHECK_CXX_SOURCE_COMPILES(" -#define DEP __attribute__((deprecated(\"message\"))) - class bar { - bar() DEP; - }; - - class peng { } DEP; - - template - class t_bar - { - t_bar() DEP; - }; - - template - class t_peng - { - t_peng() {}; - } DEP; - - void foo() DEP; - - void foo() {}; - - int main(void) - { - return 0; - }; -" HAS_ATTRIBUTE_DEPRECATED_MSG -) - -# static assert -CHECK_CXX_SOURCE_COMPILES(" - int main(void) - { - static_assert(true,\"MSG\"); - return 0; - } -" HAVE_STATIC_ASSERT -) - -# auto keyword -CHECK_CXX_SOURCE_COMPILES(" - int main(void) - { - auto foo = 1.23; - return 0; - } -" HAVE_AUTO -) - -# variadic template support -CHECK_CXX_SOURCE_COMPILES(" - #include - - template - int addints(T... x); - - int add_ints() - { - return 0; - } - - template - int add_ints(T1 t1, T... t) - { - return t1 + add_ints(t...); - } - - int main(void) - { - assert( 5 == add_ints(9,3,-5,-2) ); - return 0; - } -" HAVE_VARIADIC_TEMPLATES -) - -# SFINAE on variadic template constructors within template classes -CHECK_CXX_SOURCE_COMPILES(" - #include - - template - struct A - { - template::type - > - A(T... t) - : i(1) - {} - - template= 2)>::type, - typename = void - > - A(T... t) - : i(-1) - {} - - A() - : i(1) - {} - - int i; - }; - - int main(void) - { - return (A().i + A(2).i + A(\"foo\",3.4).i + A(8,'a',A()).i == 0 ? 0 : 1); - } -" HAVE_VARIADIC_CONSTRUCTOR_SFINAE -) - -# rvalue references -CHECK_CXX_SOURCE_COMPILES(" - #include - #include - int foo(int&& x) { return 1; } - int foo(const int& x) { return -1; } - - template - int forward(T&& x) - { - return foo(std::forward(x)); - } - - int main(void) - { - int i = 0; - assert( forward(i) + forward(int(2)) == 0); - return 0; - } -" HAVE_RVALUE_REFERENCES -) -include(CheckIncludeFile) -include(CheckIncludeFileCXX) -# Search for some tr1 headers -foreach(_HEADER tuple tr1/tuple type_traits tr1/type_traits) - string(REPLACE "/" "_" _HEADER_VAR ${_HEADER}) - string(TOUPPER ${_HEADER_VAR} _HEADER_VAR ) - check_include_file_cxx(${_HEADER} "HAVE_${_HEADER_VAR}") -endforeach(_HEADER tuple tr1/tuple tr1/type_traits) - -# make sure that the C++-11 features implemented by the compiler are a -# superset of those provided by GCC 4.4. This makes the test fail on -# all GCC compilers before 4.4. -set(CXX_FEATURES_MISSING "") -if (NOT HAVE_TYPE_TRAITS) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Sufficiently conformant type traits (defined by the 'type_traits' header file)\n") -endif() -if (NOT HAVE_SHARED_PTR) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Shared pointers (the std::shared_ptr class)\n") -endif() -if (NOT HAVE_UNIQUE_PTR) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Unique pointers (the std::unique_ptr class)\n") -endif() -if (NOT HAVE_ARRAY) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Statically sized arrays (the std::array class)\n") -endif() -if (NOT HAVE_STATIC_ASSERT) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Static assertations (the static_assert() mechanism)\n") -endif() -if (NOT HAVE_AUTO) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Automatically typed variables (the 'auto' keyword)\n") -endif() -if (NOT HAVE_VARIADIC_TEMPLATES) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Variable number of template arguments\n") -endif() -if (NOT HAVE_VARIADIC_CONSTRUCTOR_SFINAE) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Constructors with variable number of template arguments obeying the SFINAE (specialization failure is not an error) rule\n") -endif() -if (NOT HAVE_RVALUE_REFERENCES) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - References to rvalue objects\n") -endif() -if (NOT HAVE_TUPLE) - set(CXX_FEATURES_MISSING - "${CXX_FEATURES_MISSING} - Tuples (the std::tuple class)\n") -endif() - -if(CXX_FEATURES_MISSING) - set (CXX11FEATURES_FOUND FALSE) - if (CXX11Features_FIND_REQUIRED) - message(FATAL_ERROR - "Your C++ compiler does not support the minimum set of C++-2011 features required. " - "Make sure to use a compiler which implements all C++-2011 features provided by GCC 4.4. " - "Your compiler does not seem to implement the following features:\n" - "${CXX_FEATURES_MISSING}") - endif() -else () - set (CXX11FEATURES_FOUND TRUE) -endif() diff --git a/cmake/Modules/Finddune-alugrid.cmake b/cmake/Modules/Finddune-alugrid.cmake index bf1224794..99927bf27 100644 --- a/cmake/Modules/Finddune-alugrid.cmake +++ b/cmake/Modules/Finddune-alugrid.cmake @@ -20,8 +20,7 @@ find_opm_package ( # TODO: we should probe for all the HAVE_* values listed below; # however, we don't actually use them in our implementation, so # we just include them to forward here in case anyone else does - "CXX11Features REQUIRED; - dune-grid REQUIRED; + "dune-grid REQUIRED; ZLIB; ZOLTAN; METIS diff --git a/cmake/Modules/Finddune-common.cmake b/cmake/Modules/Finddune-common.cmake index 2b3d147fc..ce275490e 100644 --- a/cmake/Modules/Finddune-common.cmake +++ b/cmake/Modules/Finddune-common.cmake @@ -16,8 +16,7 @@ find_opm_package ( "dune-common" # dependencies - "CXX11Features REQUIRED; - BLAS REQUIRED; + "BLAS REQUIRED; LAPACK REQUIRED; CxaDemangle; MPI diff --git a/cmake/Modules/Finddune-fem.cmake b/cmake/Modules/Finddune-fem.cmake index 42eda51ea..35f8f7cd6 100644 --- a/cmake/Modules/Finddune-fem.cmake +++ b/cmake/Modules/Finddune-fem.cmake @@ -19,8 +19,7 @@ find_opm_package ( # TODO: we should probe for all the HAVE_* values listed below; # however, we don't actually use them in our implementation, so # we just include them to forward here in case anyone else does - "CXX11Features REQUIRED; - dune-common REQUIRED; + "dune-common REQUIRED; dune-grid REQUIRED; dune-alugrid; ZLIB; diff --git a/cmake/Modules/Finddune-geometry.cmake b/cmake/Modules/Finddune-geometry.cmake index 9ef1f9809..ff6bd1fb6 100644 --- a/cmake/Modules/Finddune-geometry.cmake +++ b/cmake/Modules/Finddune-geometry.cmake @@ -19,8 +19,7 @@ find_opm_package ( # TODO: we should probe for all the HAVE_* values listed below; # however, we don't actually use them in our implementation, so # we just include them to forward here in case anyone else does - "CXX11Features REQUIRED; - dune-common REQUIRED + "dune-common REQUIRED " # header to search for "dune/geometry/quadraturerules.hh" diff --git a/cmake/Modules/Finddune-grid.cmake b/cmake/Modules/Finddune-grid.cmake index be6f4e4c2..dc2a03390 100644 --- a/cmake/Modules/Finddune-grid.cmake +++ b/cmake/Modules/Finddune-grid.cmake @@ -22,8 +22,7 @@ find_opm_package ( # TODO: we should probe for all the HAVE_* values listed below; # however, we don't actually use them in our implementation, so # we just include them to forward here in case anyone else does - "CXX11Features REQUIRED; - dune-common REQUIRED; + "dune-common REQUIRED; dune-geometry REQUIRED; dune-uggrid; MPI; diff --git a/cmake/Modules/Finddune-uggrid.cmake b/cmake/Modules/Finddune-uggrid.cmake index 77fdf5c5f..e758444c7 100644 --- a/cmake/Modules/Finddune-uggrid.cmake +++ b/cmake/Modules/Finddune-uggrid.cmake @@ -7,8 +7,7 @@ find_opm_package ( # dependencies # TODO: we should probe for all the HAVE_* values listed below; # however, we don't actually use them in our implementation, so - "CXX11Features REQUIRED; - dune-common REQUIRED + "dune-common REQUIRED " # header to search for "" diff --git a/cmake/Modules/OpmCompilerChecks.cmake b/cmake/Modules/OpmCompilerChecks.cmake new file mode 100644 index 000000000..fe2387b07 --- /dev/null +++ b/cmake/Modules/OpmCompilerChecks.cmake @@ -0,0 +1,93 @@ +# Check for various compiler extensions + +# HAVE_ATTRIBUTE_ALWAYS_INLINE True if attribute always inline is supported +# HAS_ATTRIBUTE_UNUSED True if attribute unused is supported +# HAS_ATTRIBUTE_DEPRECATED True if attribute deprecated is supported +# HAS_ATTRIBUTE_DEPRECATED_MSG True if attribute deprecated("msg") is supported + +include(CheckCXXSourceCompiles) + +# __attribute__((always_inline)) +CHECK_CXX_SOURCE_COMPILES(" + void __attribute__((always_inline)) foo(void) {} + int main(void) + { + foo(); + return 0; + }; +" HAVE_ATTRIBUTE_ALWAYS_INLINE +) + +# __attribute__((unused)) +CHECK_CXX_SOURCE_COMPILES(" + int main(void) + { + int __attribute__((unused)) foo; + return 0; + }; +" HAS_ATTRIBUTE_UNUSED +) + +# __attribute__((deprecated)) +CHECK_CXX_SOURCE_COMPILES(" +#define DEP __attribute__((deprecated)) + class bar + { + bar() DEP; + }; + + class peng { } DEP; + + template + class t_bar + { + t_bar() DEP; + }; + + template + class t_peng { + t_peng() {}; + } DEP; + + void foo() DEP; + + void foo() {}; + + int main(void) + { + return 0; + }; +" HAS_ATTRIBUTE_DEPRECATED +) + +# __attribute__((deprecated("msg"))) +CHECK_CXX_SOURCE_COMPILES(" +#define DEP __attribute__((deprecated(\"message\"))) + class bar { + bar() DEP; + }; + + class peng { } DEP; + + template + class t_bar + { + t_bar() DEP; + }; + + template + class t_peng + { + t_peng() {}; + } DEP; + + void foo() DEP; + + void foo() {}; + + int main(void) + { + return 0; + }; +" HAS_ATTRIBUTE_DEPRECATED_MSG +) diff --git a/cmake/Modules/OpmLibMain.cmake b/cmake/Modules/OpmLibMain.cmake index e22de6e85..8ef30026c 100644 --- a/cmake/Modules/OpmLibMain.cmake +++ b/cmake/Modules/OpmLibMain.cmake @@ -64,6 +64,14 @@ project (${${project}_NAME}) enable_language (C) enable_language (CXX) +# Languages and global compiler settings +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Various compiler extension checks +include(OpmCompilerChecks) + # print system information to better pinpoint issues from log alone include (UseSystemInfo) system_info () diff --git a/cmake/Templates/opm-project-config.cmake.in b/cmake/Templates/opm-project-config.cmake.in index 36b8d0e9b..976bfe613 100644 --- a/cmake/Templates/opm-project-config.cmake.in +++ b/cmake/Templates/opm-project-config.cmake.in @@ -69,12 +69,6 @@ if(NOT @opm-project_NAME@_FOUND) endif() endif (NOT "@opm-project_TARGET@" STREQUAL "") - # ensure that we build with support for C++11 to preserve ABI - string (REPLACE "@CXX_STD0X_FLAGS@" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - string (REPLACE "@CXX_STDLIB_FLAGS@" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - string (STRIP "${CMAKE_CXX_FLAGS}" CMAKE_CXX_FLAGS) - set (CMAKE_CXX_FLAGS "@CXX_STD0X_FLAGS@@CXX_SPACE@@CXX_STDLIB_FLAGS@ ${CMAKE_CXX_FLAGS}") - # same as above, but for C99 string (REPLACE "@C_STD99_FLAGS@" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") string (STRIP "${CMAKE_C_FLAGS}" CMAKE_C_FLAGS) diff --git a/opm-common-prereqs.cmake b/opm-common-prereqs.cmake index c20c44e4d..987e86436 100644 --- a/opm-common-prereqs.cmake +++ b/opm-common-prereqs.cmake @@ -9,8 +9,6 @@ set (opm-common_CONFIG_VAR set (opm-common_DEPS # compile with C99 support if available "C99" - # compile with C++0x/11 support if available - "CXX11Features REQUIRED" ) if(ENABLE_ECL_INPUT) diff --git a/python/setup.py b/python/setup.py index d94d57936..f1bd269e2 100644 --- a/python/setup.py +++ b/python/setup.py @@ -57,7 +57,8 @@ ext_modules = [ libraries=['opmcommon', 'boost_filesystem', 'boost_regex'], language='c++', undef_macros=["NDEBUG"], - include_dirs=["pybind11/include"] + include_dirs=["pybind11/include"], + extra_compile_args=['-std=c++17'] ) ]