123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- // Copyright 2011 John Maddock
- // Copyright 2013, 2017-2018 Cray, Inc.
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0. (See accompanying file
- // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- // See http://www.boost.org for most recent version.
- // Cray C++ compiler setup.
- //
- // There are a few parameters that affect the macros defined in this file:
- //
- // - What version of CCE (Cray Compiling Environment) are we running? This
- // comes from the '_RELEASE_MAJOR', '_RELEASE_MINOR', and
- // '_RELEASE_PATCHLEVEL' macros.
- // - What C++ standards conformance level are we using (e.g. '-h
- // std=c++14')? This comes from the '__cplusplus' macro.
- // - Are we using GCC extensions ('-h gnu' or '-h nognu')? If we have '-h
- // gnu' then CCE emulates GCC, and the macros '__GNUC__',
- // '__GNUC_MINOR__', and '__GNUC_PATCHLEVEL__' are defined.
- //
- // This file is organized as follows:
- //
- // - Verify that the combination of parameters listed above is supported.
- // If we have an unsupported combination, we abort with '#error'.
- // - Establish baseline values for all Boost macros.
- // - Apply changes to the baseline macros based on compiler version. These
- // changes are cummulative so each version section only describes the
- // changes since the previous version.
- // - Within each version section, we may also apply changes based on
- // other parameters (i.e. C++ standards conformance level and GCC
- // extensions).
- //
- // To test changes to this file:
- //
- // ```
- // module load cce/8.6.5 # Pick the version you want to test.
- // cd boost/libs/config/test/all
- // b2 -j 8 toolset=cray cxxstd=03 cxxstd=11 cxxstd=14 cxxstd-dialect=gnu linkflags=-lrt
- // ```
- // Note: Using 'cxxstd-dialect=iso' is not supported at this time (the
- // tests run, but many tests fail).
- //
- // Note: 'linkflags=-lrt' is needed in Cray Linux Environment. Otherwise
- // you get an 'undefined reference to clock_gettime' error.
- //
- // Note: If a test '*_fail.cpp' file compiles, but fails to run, then it is
- // reported as a defect. However, this is not actually a defect. This is an
- // area where the test system is somewhat broken. Tests that are failing
- // because of this problem are noted in the comments.
- //
- // Pay attention to the macro definitions for the macros you wish to
- // modify. For example, only macros categorized as compiler macros should
- // appear in this file; platform macros should not appear in this file.
- // Also, some macros have to be defined to specific values; it is not
- // always enough to define or undefine a macro.
- //
- // Macro definitions are available in the source code at:
- //
- // `boost/libs/config/doc/html/boost_config/boost_macro_reference.html`
- //
- // Macro definitions are also available online at:
- //
- // http://www.boost.org/doc/libs/master/libs/config/doc/html/boost_config/boost_macro_reference.html
- //
- // Typically, if you enable a feature, and the tests pass, then you have
- // nothing to worry about. However, it's sometimes hard to figure out if a
- // disabled feature needs to stay disabled. To get a list of disabled
- // features, run 'b2' in 'boost/libs/config/checks'. These are the macros
- // you should pay attention to (in addition to macros that cause test
- // failures).
- ////
- //// Front matter
- ////
- // In a developer build of the Cray compiler (i.e. a compiler built by a
- // Cray employee), the release patch level is reported as "x". This gives
- // versions that look like e.g. "8.6.x".
- //
- // To accomplish this, the the Cray compiler preprocessor inserts:
- //
- // #define _RELEASE_PATCHLEVEL x
- //
- // If we are using a developer build of the compiler, we want to use the
- // configuration macros for the most recent patch level of the release. To
- // accomplish this, we'll pretend that _RELEASE_PATCHLEVEL is 99.
- //
- // However, it's difficult to detect if _RELEASE_PATCHLEVEL is x. We must
- // consider that the x will be expanded if x is defined as a macro
- // elsewhere. For example, imagine if someone put "-D x=3" on the command
- // line, and _RELEASE_PATCHLEVEL is x. Then _RELEASE_PATCHLEVEL would
- // expand to 3, and we could not distinguish it from an actual
- // _RELEASE_PATCHLEVEL of 3. This problem only affects developer builds; in
- // production builds, _RELEASE_PATCHLEVEL is always an integer.
- //
- // IMPORTANT: In developer builds, if x is defined as a macro, you will get
- // an incorrect configuration. The behavior in this case is undefined.
- //
- // Even if x is not defined, we have to use some trickery to detect if
- // _RELEASE_PATCHLEVEL is x. First we define BOOST_CRAY_x to some arbitrary
- // magic value, 9867657. Then we use BOOST_CRAY_APPEND to append the
- // expanded value of _RELEASE_PATCHLEVEL to the string "BOOST_CRAY_".
- //
- // - If _RELEASE_PATCHLEVEL is undefined, we get "BOOST_CRAY_".
- // - If _RELEASE_PATCHLEVEL is 5, we get "BOOST_CRAY_5".
- // - If _RELEASE_PATCHLEVEL is x (and x is not defined) we get
- // "BOOST_CRAY_x":
- //
- // Then we check if BOOST_CRAY_x is equal to the output of
- // BOOST_CRAY_APPEND. In other words, the output of BOOST_CRAY_APPEND is
- // treated as a macro name, and expanded again. If we can safely assume
- // that BOOST_CRAY_ is not a macro defined as our magic number, and
- // BOOST_CRAY_5 is not a macro defined as our magic number, then the only
- // way the equality test can pass is if _RELEASE_PATCHLEVEL expands to x.
- //
- // So, that is how we detect if we are using a developer build of the Cray
- // compiler.
- #define BOOST_CRAY_x 9867657 // Arbitrary number
- #define BOOST_CRAY_APPEND(MACRO) BOOST_CRAY_APPEND_INTERNAL(MACRO)
- #define BOOST_CRAY_APPEND_INTERNAL(MACRO) BOOST_CRAY_##MACRO
- #if BOOST_CRAY_x == BOOST_CRAY_APPEND(_RELEASE_PATCHLEVEL)
- // This is a developer build.
- //
- // - _RELEASE_PATCHLEVEL is defined as x, and x is not defined as a macro.
- // Pretend _RELEASE_PATCHLEVEL is 99, so we get the configuration for the
- // most recent patch level in this release.
- #define BOOST_CRAY_VERSION (_RELEASE_MAJOR * 10000 + _RELEASE_MINOR * 100 + 99)
- #else
- // This is a production build.
- //
- // _RELEASE_PATCHLEVEL is not defined as x, or x is defined as a macro.
- #define BOOST_CRAY_VERSION (_RELEASE_MAJOR * 10000 + _RELEASE_MINOR * 100 + _RELEASE_PATCHLEVEL)
- #endif // BOOST_CRAY_x == BOOST_CRAY_APPEND(_RELEASE_PATCHLEVEL)
- #undef BOOST_CRAY_APPEND_INTERNAL
- #undef BOOST_CRAY_APPEND
- #undef BOOST_CRAY_x
- #ifdef __GNUC__
- # define BOOST_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
- #endif
- #ifndef BOOST_COMPILER
- # define BOOST_COMPILER "Cray C++ version " BOOST_STRINGIZE(_RELEASE_MAJOR) "." BOOST_STRINGIZE(_RELEASE_MINOR) "." BOOST_STRINGIZE(_RELEASE_PATCHLEVEL)
- #endif
- // Since the Cray compiler defines '__GNUC__', we have to emulate some
- // additional GCC macros in order to make everything work.
- //
- // FIXME: Perhaps Cray should fix the compiler to define these additional
- // macros for GCC emulation?
- #if __cplusplus >= 201103L && defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)
- # define __GXX_EXPERIMENTAL_CXX0X__ 1
- #endif
- ////
- //// Parameter validation
- ////
- // FIXME: Do we really need to support compilers before 8.5? Do they pass
- // the Boost.Config tests?
- #if BOOST_CRAY_VERSION < 80000
- # error "Boost is not configured for Cray compilers prior to version 8, please try the configure script."
- #endif
- // We only support recent EDG based compilers.
- #ifndef __EDG__
- # error "Unsupported Cray compiler, please try running the configure script."
- #endif
- ////
- //// Baseline values
- ////
- #include <boost/config/compiler/common_edg.hpp>
- #define BOOST_HAS_NRVO
- #define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
- #define BOOST_NO_CXX11_AUTO_DECLARATIONS
- #define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
- #define BOOST_NO_CXX11_CHAR16_T
- #define BOOST_NO_CXX11_CHAR32_T
- #define BOOST_NO_CXX11_CONSTEXPR
- #define BOOST_NO_CXX11_DECLTYPE
- #define BOOST_NO_CXX11_DECLTYPE_N3276
- #define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #define BOOST_NO_CXX11_DELETED_FUNCTIONS
- #define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- #define BOOST_NO_CXX11_FINAL
- #define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
- #define BOOST_NO_CXX11_LAMBDAS
- #define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
- #define BOOST_NO_CXX11_NOEXCEPT
- #define BOOST_NO_CXX11_NULLPTR
- #define BOOST_NO_CXX11_RANGE_BASED_FOR
- #define BOOST_NO_CXX11_RAW_LITERALS
- #define BOOST_NO_CXX11_REF_QUALIFIERS
- #define BOOST_NO_CXX11_RVALUE_REFERENCES
- #define BOOST_NO_CXX11_SCOPED_ENUMS
- #define BOOST_NO_CXX11_SFINAE_EXPR
- #define BOOST_NO_CXX11_STATIC_ASSERT
- #define BOOST_NO_CXX11_TEMPLATE_ALIASES
- #define BOOST_NO_CXX11_THREAD_LOCAL
- #define BOOST_NO_CXX11_UNICODE_LITERALS
- #define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
- #define BOOST_NO_CXX11_USER_DEFINED_LITERALS
- #define BOOST_NO_CXX11_VARIADIC_MACROS
- #define BOOST_NO_CXX11_VARIADIC_TEMPLATES
- #define BOOST_NO_SFINAE_EXPR
- #define BOOST_NO_TWO_PHASE_NAME_LOOKUP
- //#define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG
- #define BOOST_MATH_DISABLE_STD_FPCLASSIFY
- //#define BOOST_HAS_FPCLASSIFY
- #define BOOST_SP_USE_PTHREADS
- #define BOOST_AC_USE_PTHREADS
- //
- // Everything that follows is working around what are thought to be
- // compiler shortcomings. Revist all of these regularly.
- //
- //#define BOOST_USE_ENUM_STATIC_ASSERT
- //#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS //(this may be implied by the previous #define
- // These constants should be provided by the compiler.
- #ifndef __ATOMIC_RELAXED
- #define __ATOMIC_RELAXED 0
- #define __ATOMIC_CONSUME 1
- #define __ATOMIC_ACQUIRE 2
- #define __ATOMIC_RELEASE 3
- #define __ATOMIC_ACQ_REL 4
- #define __ATOMIC_SEQ_CST 5
- #endif
- ////
- //// Version changes
- ////
- //
- // 8.5.0
- //
- #if BOOST_CRAY_VERSION >= 80500
- #if __cplusplus >= 201103L
- #undef BOOST_HAS_NRVO
- #undef BOOST_NO_COMPLETE_VALUE_INITIALIZATION
- #undef BOOST_NO_CXX11_AUTO_DECLARATIONS
- #undef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
- #undef BOOST_NO_CXX11_CHAR16_T
- #undef BOOST_NO_CXX11_CHAR32_T
- #undef BOOST_NO_CXX11_CONSTEXPR
- #undef BOOST_NO_CXX11_DECLTYPE
- #undef BOOST_NO_CXX11_DECLTYPE_N3276
- #undef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #undef BOOST_NO_CXX11_DELETED_FUNCTIONS
- #undef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- #undef BOOST_NO_CXX11_FINAL
- #undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
- #undef BOOST_NO_CXX11_LAMBDAS
- #undef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
- #undef BOOST_NO_CXX11_NOEXCEPT
- #undef BOOST_NO_CXX11_NULLPTR
- #undef BOOST_NO_CXX11_RANGE_BASED_FOR
- #undef BOOST_NO_CXX11_RAW_LITERALS
- #undef BOOST_NO_CXX11_REF_QUALIFIERS
- #undef BOOST_NO_CXX11_RVALUE_REFERENCES
- #undef BOOST_NO_CXX11_SCOPED_ENUMS
- #undef BOOST_NO_CXX11_SFINAE_EXPR
- #undef BOOST_NO_CXX11_STATIC_ASSERT
- #undef BOOST_NO_CXX11_TEMPLATE_ALIASES
- #undef BOOST_NO_CXX11_THREAD_LOCAL
- #undef BOOST_NO_CXX11_UNICODE_LITERALS
- #undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
- #undef BOOST_NO_CXX11_USER_DEFINED_LITERALS
- #undef BOOST_NO_CXX11_VARIADIC_MACROS
- #undef BOOST_NO_CXX11_VARIADIC_TEMPLATES
- #undef BOOST_NO_SFINAE_EXPR
- #undef BOOST_NO_TWO_PHASE_NAME_LOOKUP
- #undef BOOST_MATH_DISABLE_STD_FPCLASSIFY
- #undef BOOST_SP_USE_PTHREADS
- #undef BOOST_AC_USE_PTHREADS
- #define BOOST_HAS_VARIADIC_TMPL
- #define BOOST_HAS_UNISTD_H
- #define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG
- #define BOOST_HAS_TR1_COMPLEX_OVERLOADS
- #define BOOST_HAS_STDINT_H
- #define BOOST_HAS_STATIC_ASSERT
- #define BOOST_HAS_SIGACTION
- #define BOOST_HAS_SCHED_YIELD
- #define BOOST_HAS_RVALUE_REFS
- #define BOOST_HAS_PTHREADS
- #define BOOST_HAS_PTHREAD_YIELD
- #define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
- #define BOOST_HAS_PARTIAL_STD_ALLOCATOR
- #define BOOST_HAS_NRVO
- #define BOOST_HAS_NL_TYPES_H
- #define BOOST_HAS_NANOSLEEP
- #define BOOST_NO_CXX11_SMART_PTR
- #define BOOST_NO_CXX11_HDR_FUNCTIONAL
- #define BOOST_NO_CXX14_CONSTEXPR
- #define BOOST_HAS_LONG_LONG
- #define BOOST_HAS_FLOAT128
- #if __cplusplus < 201402L
- #define BOOST_NO_CXX11_DECLTYPE_N3276
- #endif // __cplusplus < 201402L
- #endif // __cplusplus >= 201103L
- #endif // BOOST_CRAY_VERSION >= 80500
- //
- // 8.6.4
- // (versions prior to 8.6.5 do not define _RELEASE_PATCHLEVEL)
- //
- #if BOOST_CRAY_VERSION >= 80600
- #if __cplusplus >= 199711L
- #define BOOST_HAS_FLOAT128
- #define BOOST_HAS_PTHREAD_YIELD // This is a platform macro, but it improves test results.
- #define BOOST_NO_COMPLETE_VALUE_INITIALIZATION // This is correct. Test compiles, but fails to run.
- #undef BOOST_NO_CXX11_CHAR16_T
- #undef BOOST_NO_CXX11_CHAR32_T
- #undef BOOST_NO_CXX11_INLINE_NAMESPACES
- #undef BOOST_NO_CXX11_FINAL
- #undef BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS
- #undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
- #define BOOST_NO_CXX11_SFINAE_EXPR // This is correct, even though '*_fail.cpp' test fails.
- #undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
- #undef BOOST_NO_CXX11_VARIADIC_MACROS
- #undef BOOST_NO_CXX11_VARIADIC_TEMPLATES
- // 'BOOST_NO_DEDUCED_TYPENAME' test is broken. The test files are enabled /
- // disabled with an '#ifdef BOOST_DEDUCED_TYPENAME'. However,
- // 'boost/libs/config/include/boost/config/detail/suffix.hpp' ensures that
- // 'BOOST_DEDUCED_TYPENAME' is always defined (the value it is defined as
- // depends on 'BOOST_NO_DEDUCED_TYPENAME'). So, modifying
- // 'BOOST_NO_DEDUCED_TYPENAME' has no effect on which tests are run.
- //
- // The 'no_ded_typename_pass.cpp' test should always compile and run
- // successfully, because 'BOOST_DEDUCED_TYPENAME' must always have an
- // appropriate value (it's not just something that you turn on or off).
- // Therefore, if you wish to test changes to 'BOOST_NO_DEDUCED_TYPENAME',
- // you have to modify 'no_ded_typename_pass.cpp' to unconditionally include
- // 'boost_no_ded_typename.ipp'.
- #undef BOOST_NO_DEDUCED_TYPENAME // This is correct. Test is broken.
- #undef BOOST_NO_SFINAE_EXPR
- #undef BOOST_NO_TWO_PHASE_NAME_LOOKUP
- #endif // __cplusplus >= 199711L
- #if __cplusplus >= 201103L
- #undef BOOST_NO_CXX11_ALIGNAS
- #undef BOOST_NO_CXX11_DECLTYPE_N3276
- #define BOOST_NO_CXX11_HDR_ATOMIC
- #undef BOOST_NO_CXX11_HDR_FUNCTIONAL
- #define BOOST_NO_CXX11_HDR_REGEX // This is correct. Test compiles, but fails to run.
- #undef BOOST_NO_CXX11_SFINAE_EXPR
- #undef BOOST_NO_CXX11_SMART_PTR
- #undef BOOST_NO_CXX11_TRAILING_RESULT_TYPES
- #endif // __cplusplus >= 201103L
- #if __cplusplus >= 201402L
- #undef BOOST_NO_CXX14_CONSTEXPR
- #define BOOST_NO_CXX14_DIGIT_SEPARATORS
- #endif // __cplusplus == 201402L
- #endif // BOOST_CRAY_VERSION >= 80600
- //
- // 8.6.5
- // (no change from 8.6.4)
- //
- //
- // 8.7.0
- //
- #if BOOST_CRAY_VERSION >= 80700
- #if __cplusplus >= 199711L
- #endif // __cplusplus >= 199711L
- #if __cplusplus >= 201103L
- #undef BOOST_NO_CXX11_HDR_ATOMIC
- #undef BOOST_NO_CXX11_HDR_REGEX
- #endif // __cplusplus >= 201103L
- #if __cplusplus >= 201402L
- #endif // __cplusplus == 201402L
- #endif // BOOST_CRAY_VERSION >= 80700
- //
- // Next release
- //
- #if BOOST_CRAY_VERSION > 80799
- #if __cplusplus >= 199711L
- #endif // __cplusplus >= 199711L
- #if __cplusplus >= 201103L
- #endif // __cplusplus >= 201103L
- #if __cplusplus >= 201402L
- #endif // __cplusplus == 201402L
- #endif // BOOST_CRAY_VERSION > 80799
- ////
- //// Remove temporary macros
- ////
- // I've commented out some '#undef' statements to signify that we purposely
- // want to keep certain macros.
- //#undef __GXX_EXPERIMENTAL_CXX0X__
- //#undef BOOST_COMPILER
- #undef BOOST_GCC_VERSION
- #undef BOOST_CRAY_VERSION
|