1 /* 2 * Copyright Andrey Semashev 2007 - 2015. 3 * Distributed under the Boost Software License, Version 1.0. 4 * (See accompanying file LICENSE_1_0.txt or copy at 5 * http://www.boost.org/LICENSE_1_0.txt) 6 */ 7 /*! 8 * \file config.hpp 9 * \author Andrey Semashev 10 * \date 08.03.2007 11 * 12 * \brief This header is the Boost.Log library implementation, see the library documentation 13 * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html. In this file 14 * internal configuration macros are defined. 15 */ 16 17 #ifndef BOOST_LOG_DETAIL_CONFIG_HPP_INCLUDED_ 18 #define BOOST_LOG_DETAIL_CONFIG_HPP_INCLUDED_ 19 20 // This check must be before any system headers are included, or __MSVCRT_VERSION__ may get defined to 0x0600 21 #if defined(__MINGW32__) && !defined(__MSVCRT_VERSION__) 22 // Target MinGW headers to at least MSVC 7.0 runtime by default. This will enable some useful functions. 23 #define __MSVCRT_VERSION__ 0x0700 24 #endif 25 26 #include <boost/predef/os.h> 27 28 // Try including WinAPI config as soon as possible so that any other headers don't include Windows SDK headers 29 #if defined(BOOST_OS_WINDOWS_AVAILABLE) 30 #include <boost/detail/winapi/config.hpp> 31 #endif 32 33 #include <limits.h> // To bring in libc macros 34 #include <boost/config.hpp> 35 36 // The library requires dynamic_cast in a few places 37 #if defined(BOOST_NO_RTTI) 38 # error Boost.Log: RTTI is required by the library 39 #endif 40 41 #if defined(_MSC_VER) && _MSC_VER >= 1600 42 # define BOOST_LOG_HAS_PRAGMA_DETECT_MISMATCH 43 #endif 44 45 #if defined(BOOST_LOG_HAS_PRAGMA_DETECT_MISMATCH) 46 #include <boost/preprocessor/stringize.hpp> 47 #endif 48 49 #if !defined(BOOST_WINDOWS) 50 # ifndef BOOST_LOG_WITHOUT_DEBUG_OUTPUT 51 # define BOOST_LOG_WITHOUT_DEBUG_OUTPUT 52 # endif 53 # ifndef BOOST_LOG_WITHOUT_EVENT_LOG 54 # define BOOST_LOG_WITHOUT_EVENT_LOG 55 # endif 56 #endif 57 58 #ifdef BOOST_HAS_PRAGMA_ONCE 59 #pragma once 60 #endif 61 62 #if defined(BOOST_MSVC) 63 // For some reason MSVC 9.0 fails to link the library if static integral constants are defined in cpp 64 # define BOOST_LOG_BROKEN_STATIC_CONSTANTS_LINKAGE 65 # if _MSC_VER <= 1310 66 // MSVC 7.1 sometimes fails to match out-of-class template function definitions with 67 // their declarations if the return type or arguments of the functions involve typename keyword 68 // and depend on the template parameters. 69 # define BOOST_LOG_BROKEN_TEMPLATE_DEFINITION_MATCHING 70 # endif 71 # if _MSC_VER <= 1400 72 // Older MSVC versions reject friend declarations for class template specializations 73 # define BOOST_LOG_BROKEN_FRIEND_TEMPLATE_SPECIALIZATIONS 74 # endif 75 # if _MSC_VER <= 1600 76 // MSVC up to 10.0 attempts to invoke copy constructor when initializing a const reference from rvalue returned from a function. 77 // This fails when the returned value cannot be copied (only moved): 78 // 79 // class base {}; 80 // class derived : public base { BOOST_MOVABLE_BUT_NOT_COPYABLE(derived) }; 81 // derived foo(); 82 // base const& var = foo(); // attempts to call copy constructor of derived 83 # define BOOST_LOG_BROKEN_REFERENCE_FROM_RVALUE_INIT 84 # endif 85 # if !defined(_STLPORT_VERSION) 86 // MSVC 9.0 mandates packaging of STL classes, which apparently affects alignment and 87 // makes alignment_of< T >::value no longer be a power of 2 for types that derive from STL classes. 88 // This breaks type_with_alignment and everything that relies on it. 89 // This doesn't happen with non-native STLs, such as STLPort. Strangely, this doesn't show with 90 // STL classes themselves or most of the user-defined derived classes. 91 // Not sure if that happens with other MSVC versions. 92 // See: http://svn.boost.org/trac/boost/ticket/1946 93 # define BOOST_LOG_BROKEN_STL_ALIGNMENT 94 # endif 95 #endif 96 97 #if defined(BOOST_INTEL) || defined(__SUNPRO_CC) 98 // Intel compiler and Sun Studio 12.3 have problems with friend declarations for nested class templates 99 # define BOOST_LOG_NO_MEMBER_TEMPLATE_FRIENDS 100 #endif 101 102 #if defined(BOOST_MSVC) && BOOST_MSVC <= 1600 103 // MSVC cannot interpret constant expressions in certain contexts, such as non-type template parameters 104 # define BOOST_LOG_BROKEN_CONSTANT_EXPRESSIONS 105 #endif 106 107 #if defined(BOOST_NO_CXX11_HDR_CODECVT) 108 // The compiler does not support std::codecvt<char16_t> and std::codecvt<char32_t> specializations. 109 // The BOOST_NO_CXX11_HDR_CODECVT means there's no usable <codecvt>, which is slightly different from this macro. 110 // But in order for <codecvt> to be implemented the std::codecvt specializations have to be implemented as well. 111 # define BOOST_LOG_NO_CXX11_CODECVT_FACETS 112 #endif 113 114 #if defined(__CYGWIN__) 115 // Boost.ASIO is broken on Cygwin 116 # define BOOST_LOG_NO_ASIO 117 #endif 118 119 #if !defined(BOOST_LOG_USE_NATIVE_SYSLOG) && defined(BOOST_LOG_NO_ASIO) 120 # ifndef BOOST_LOG_WITHOUT_SYSLOG 121 # define BOOST_LOG_WITHOUT_SYSLOG 122 # endif 123 #endif 124 125 #if defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ <= 2) 126 // GCC 4.1 and 4.2 have buggy anonymous namespaces support, which interferes with symbol linkage 127 # define BOOST_LOG_ANONYMOUS_NAMESPACE namespace anonymous {} using namespace anonymous; namespace anonymous 128 #else 129 # define BOOST_LOG_ANONYMOUS_NAMESPACE namespace 130 #endif 131 132 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || (defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ <= 6)) 133 // GCC up to 4.6 (inclusively) did not support expanding template argument packs into non-variadic template arguments 134 #define BOOST_LOG_NO_CXX11_ARG_PACKS_TO_NON_VARIADIC_ARGS_EXPANSION 135 #endif 136 137 #if defined(BOOST_NO_CXX11_CONSTEXPR) || (defined(BOOST_GCC) && ((BOOST_GCC+0) / 100) <= 406) 138 // GCC 4.6 does not support in-class brace initializers for static constexpr array members 139 #define BOOST_LOG_NO_CXX11_CONSTEXPR_DATA_MEMBER_BRACE_INITIALIZERS 140 #endif 141 142 #if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || (defined(BOOST_GCC) && ((BOOST_GCC+0) / 100) <= 406) 143 // GCC 4.6 cannot handle a defaulted function with noexcept specifier 144 #define BOOST_LOG_NO_CXX11_DEFAULTED_NOEXCEPT_FUNCTIONS 145 #endif 146 147 #if defined(_MSC_VER) 148 # define BOOST_LOG_NO_VTABLE __declspec(novtable) 149 #elif defined(__GNUC__) 150 # define BOOST_LOG_NO_VTABLE 151 #else 152 # define BOOST_LOG_NO_VTABLE 153 #endif 154 155 // An MS-like compilers' extension that allows to optimize away the needless code 156 #if defined(_MSC_VER) 157 # define BOOST_LOG_ASSUME(expr) __assume(expr) 158 #else 159 # define BOOST_LOG_ASSUME(expr) 160 #endif 161 162 // The statement marking unreachable branches of code to avoid warnings 163 #if defined(BOOST_CLANG) 164 # if __has_builtin(__builtin_unreachable) 165 # define BOOST_LOG_UNREACHABLE() __builtin_unreachable() 166 # endif 167 #elif defined(__GNUC__) 168 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) 169 # define BOOST_LOG_UNREACHABLE() __builtin_unreachable() 170 # endif 171 #elif defined(_MSC_VER) 172 # define BOOST_LOG_UNREACHABLE() __assume(0) 173 #endif 174 #if !defined(BOOST_LOG_UNREACHABLE) 175 # define BOOST_LOG_UNREACHABLE() 176 # define BOOST_LOG_UNREACHABLE_RETURN(r) return r 177 #else 178 # define BOOST_LOG_UNREACHABLE_RETURN(r) BOOST_LOG_UNREACHABLE() 179 #endif 180 181 // The macro efficiently returns a local lvalue from a function. 182 // It employs NRVO, if supported by compiler, or uses a move constructor otherwise. 183 #if defined(BOOST_HAS_NRVO) 184 #define BOOST_LOG_NRVO_RESULT(x) x 185 #else 186 #define BOOST_LOG_NRVO_RESULT(x) boost::move(x) 187 #endif 188 189 // Some compilers support a special attribute that shows that a function won't return 190 #if defined(__GNUC__) || (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x590) 191 // GCC and Sun Studio 12 support attribute syntax 192 # define BOOST_LOG_NORETURN __attribute__((noreturn)) 193 #elif defined (_MSC_VER) 194 // Microsoft-compatible compilers go here 195 # define BOOST_LOG_NORETURN __declspec(noreturn) 196 #else 197 // The rest compilers might emit bogus warnings about missing return statements 198 // in functions with non-void return types when throw_exception is used. 199 # define BOOST_LOG_NORETURN 200 #endif 201 202 // GCC and compatible compilers may require marking types that may alias other types 203 #if defined(__GNUC__) 204 # define BOOST_LOG_MAY_ALIAS __attribute__ ((__may_alias__)) 205 #else 206 # define BOOST_LOG_MAY_ALIAS 207 #endif 208 209 #if !defined(BOOST_LOG_BUILDING_THE_LIB) 210 211 // Detect if we're dealing with dll 212 # if defined(BOOST_LOG_DYN_LINK) || defined(BOOST_ALL_DYN_LINK) 213 # define BOOST_LOG_DLL 214 # endif 215 216 # if defined(BOOST_LOG_DLL) 217 # define BOOST_LOG_API BOOST_SYMBOL_IMPORT 218 # else 219 # define BOOST_LOG_API 220 # endif 221 // 222 // Automatically link to the correct build variant where possible. 223 // 224 # if !defined(BOOST_ALL_NO_LIB) 225 # if !defined(BOOST_LOG_NO_LIB) 226 # define BOOST_LIB_NAME boost_log 227 # if defined(BOOST_LOG_DLL) 228 # define BOOST_DYN_LINK 229 # endif 230 # include <boost/config/auto_link.hpp> 231 # endif 232 // In static-library builds compilers ignore auto-link comments from Boost.Log binary to 233 // other Boost libraries. We explicitly add comments here for other libraries. 234 // In dynamic-library builds this is not needed. 235 # if !defined(BOOST_LOG_DLL) 236 # include <boost/system/config.hpp> 237 # include <boost/filesystem/config.hpp> 238 # if !defined(BOOST_DATE_TIME_NO_LIB) && !defined(BOOST_DATE_TIME_SOURCE) 239 # define BOOST_LIB_NAME boost_date_time 240 # if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_DATE_TIME_DYN_LINK) 241 # define BOOST_DYN_LINK 242 # endif 243 # include <boost/config/auto_link.hpp> 244 # endif 245 // Boost.Thread's config is included below, if needed 246 # endif 247 # endif // auto-linking disabled 248 249 #else // !defined(BOOST_LOG_BUILDING_THE_LIB) 250 251 # if defined(BOOST_LOG_DLL) 252 # define BOOST_LOG_API BOOST_SYMBOL_EXPORT 253 # else 254 # define BOOST_LOG_API BOOST_SYMBOL_VISIBLE 255 # endif 256 257 #endif // !defined(BOOST_LOG_BUILDING_THE_LIB) 258 259 // By default we provide support for both char and wchar_t 260 #if !defined(BOOST_LOG_WITHOUT_CHAR) 261 # define BOOST_LOG_USE_CHAR 262 #endif 263 #if !defined(BOOST_LOG_WITHOUT_WCHAR_T) 264 # define BOOST_LOG_USE_WCHAR_T 265 #endif 266 267 #if !defined(BOOST_LOG_DOXYGEN_PASS) 268 // Check if multithreading is supported 269 # if !defined(BOOST_LOG_NO_THREADS) && !defined(BOOST_HAS_THREADS) 270 # define BOOST_LOG_NO_THREADS 271 # endif // !defined(BOOST_LOG_NO_THREADS) && !defined(BOOST_HAS_THREADS) 272 #endif // !defined(BOOST_LOG_DOXYGEN_PASS) 273 274 #if !defined(BOOST_LOG_NO_THREADS) 275 // We need this header to (i) enable auto-linking with Boost.Thread and 276 // (ii) to bring in configuration macros of Boost.Thread. 277 # include <boost/thread/detail/config.hpp> 278 #endif // !defined(BOOST_LOG_NO_THREADS) 279 280 #if !defined(BOOST_LOG_NO_THREADS) 281 # define BOOST_LOG_EXPR_IF_MT(expr) expr 282 #else 283 # undef BOOST_LOG_USE_COMPILER_TLS 284 # define BOOST_LOG_EXPR_IF_MT(expr) 285 #endif // !defined(BOOST_LOG_NO_THREADS) 286 287 #if defined(BOOST_LOG_USE_COMPILER_TLS) 288 # if defined(__GNUC__) || defined(__SUNPRO_CC) 289 # define BOOST_LOG_TLS __thread 290 # elif defined(BOOST_MSVC) 291 # define BOOST_LOG_TLS __declspec(thread) 292 # else 293 # undef BOOST_LOG_USE_COMPILER_TLS 294 # endif 295 #endif // defined(BOOST_LOG_USE_COMPILER_TLS) 296 297 #ifndef BOOST_LOG_CPU_CACHE_LINE_SIZE 298 //! The macro defines the CPU cache line size for the target architecture. This is mostly used for optimization. 299 #define BOOST_LOG_CPU_CACHE_LINE_SIZE 64 300 #endif 301 302 namespace boost { 303 304 // Setup namespace name 305 #if !defined(BOOST_LOG_DOXYGEN_PASS) 306 # if defined(BOOST_LOG_DLL) 307 # if defined(BOOST_LOG_NO_THREADS) 308 # define BOOST_LOG_VERSION_NAMESPACE v2_st 309 # else 310 # if defined(BOOST_THREAD_PLATFORM_PTHREAD) 311 # define BOOST_LOG_VERSION_NAMESPACE v2_mt_posix 312 # elif defined(BOOST_THREAD_PLATFORM_WIN32) 313 # if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 314 # define BOOST_LOG_VERSION_NAMESPACE v2_mt_nt6 315 # else 316 # define BOOST_LOG_VERSION_NAMESPACE v2_mt_nt5 317 # endif 318 # else 319 # define BOOST_LOG_VERSION_NAMESPACE v2_mt 320 # endif 321 # endif // defined(BOOST_LOG_NO_THREADS) 322 # else 323 # if defined(BOOST_LOG_NO_THREADS) 324 # define BOOST_LOG_VERSION_NAMESPACE v2s_st 325 # else 326 # if defined(BOOST_THREAD_PLATFORM_PTHREAD) 327 # define BOOST_LOG_VERSION_NAMESPACE v2s_mt_posix 328 # elif defined(BOOST_THREAD_PLATFORM_WIN32) 329 # if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 330 # define BOOST_LOG_VERSION_NAMESPACE v2s_mt_nt6 331 # else 332 # define BOOST_LOG_VERSION_NAMESPACE v2s_mt_nt5 333 # endif 334 # else 335 # define BOOST_LOG_VERSION_NAMESPACE v2s_mt 336 # endif 337 # endif // defined(BOOST_LOG_NO_THREADS) 338 # endif // defined(BOOST_LOG_DLL) 339 340 341 namespace log { 342 343 # if !defined(BOOST_NO_CXX11_INLINE_NAMESPACES) 344 345 inline namespace BOOST_LOG_VERSION_NAMESPACE {} 346 } 347 348 # define BOOST_LOG_OPEN_NAMESPACE namespace log { inline namespace BOOST_LOG_VERSION_NAMESPACE { 349 # define BOOST_LOG_CLOSE_NAMESPACE }} 350 351 # else 352 353 namespace BOOST_LOG_VERSION_NAMESPACE {} 354 355 using namespace BOOST_LOG_VERSION_NAMESPACE 356 # if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && !defined(__clang__) 357 __attribute__((__strong__)) 358 # endif 359 ; 360 361 } 362 363 # define BOOST_LOG_OPEN_NAMESPACE namespace log { namespace BOOST_LOG_VERSION_NAMESPACE { 364 # define BOOST_LOG_CLOSE_NAMESPACE }} 365 # endif 366 367 #else // !defined(BOOST_LOG_DOXYGEN_PASS) 368 369 namespace log {} 370 # define BOOST_LOG_OPEN_NAMESPACE namespace log { 371 # define BOOST_LOG_CLOSE_NAMESPACE } 372 373 #endif // !defined(BOOST_LOG_DOXYGEN_PASS) 374 375 #if defined(BOOST_LOG_HAS_PRAGMA_DETECT_MISMATCH) 376 #pragma detect_mismatch("boost_log_abi", BOOST_PP_STRINGIZE(BOOST_LOG_VERSION_NAMESPACE)) 377 #endif 378 379 } // namespace boost 380 381 #endif // BOOST_LOG_DETAIL_CONFIG_HPP_INCLUDED_ 382