core_prerequisites.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. /************************************************************************************
  2. * *
  3. * Copyright (c) 2014 - 2018 Axel Menzel <info@rttr.org> *
  4. * *
  5. * This file is part of RTTR (Run Time Type Reflection) *
  6. * License: MIT License *
  7. * *
  8. * Permission is hereby granted, free of charge, to any person obtaining *
  9. * a copy of this software and associated documentation files (the "Software"), *
  10. * to deal in the Software without restriction, including without limitation *
  11. * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  12. * and/or sell copies of the Software, and to permit persons to whom the *
  13. * Software is furnished to do so, subject to the following conditions: *
  14. * *
  15. * The above copyright notice and this permission notice shall be included in *
  16. * all copies or substantial portions of the Software. *
  17. * *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  19. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  20. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
  21. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  22. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
  23. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE *
  24. * SOFTWARE. *
  25. * *
  26. *************************************************************************************/
  27. #ifndef RTTR_CORE_PREREQUISITES_H_
  28. #define RTTR_CORE_PREREQUISITES_H_
  29. #include "rttr/detail/base/version.h"
  30. namespace rttr
  31. {
  32. #define RTTR_PLATFORM_WINDOWS 1
  33. #define RTTR_PLATFORM_LINUX 2
  34. #define RTTR_PLATFORM_APPLE 3
  35. #define RTTR_COMPILER_MSVC 1
  36. #define RTTR_COMPILER_GNUC 2
  37. #define RTTR_COMPILER_CLANG 3
  38. #define RTTR_COMPILER_APPLECLANG 4
  39. #define RTTR_ENDIAN_LITTLE 1
  40. #define RTTR_ENDIAN_BIG 2
  41. #define RTTR_ARCH_32 1
  42. #define RTTR_ARCH_64 2
  43. /////////////////////////////////////////////////////////////////////////////////////////
  44. // Platform
  45. /////////////////////////////////////////////////////////////////////////////////////////
  46. #if defined( __WIN32__ ) || defined( _WIN32 )
  47. # define RTTR_PLATFORM RTTR_PLATFORM_WINDOWS
  48. #elif defined( __APPLE_CC__)
  49. # define RTTR_PLATFORM RTTR_PLATFORM_APPLE
  50. #else
  51. # define RTTR_PLATFORM RTTR_PLATFORM_LINUX
  52. #endif
  53. /////////////////////////////////////////////////////////////////////////////////////////
  54. // Compiler
  55. /////////////////////////////////////////////////////////////////////////////////////////
  56. #if defined( __clang__ )
  57. #if defined __apple_build_version__
  58. # define RTTR_COMPILER RTTR_COMPILER_APPLECLANG
  59. #else
  60. # define RTTR_COMPILER RTTR_COMPILER_CLANG
  61. #endif
  62. # define RTTR_COMP_VER (((__clang_major__)*100) + \
  63. (__clang_minor__*10) + \
  64. __clang_patchlevel__)
  65. #elif defined( __GNUC__ )
  66. # define RTTR_COMPILER RTTR_COMPILER_GNUC
  67. # define RTTR_COMP_VER (((__GNUC__)*100) + \
  68. (__GNUC_MINOR__*10) + \
  69. __GNUC_PATCHLEVEL__)
  70. #elif defined( _MSC_VER )
  71. # define RTTR_COMPILER RTTR_COMPILER_MSVC
  72. # define RTTR_COMP_VER _MSC_VER
  73. #else
  74. # error "No known compiler. Abort! Abort!"
  75. #endif
  76. /////////////////////////////////////////////////////////////////////////////////////////
  77. // Architecture
  78. /////////////////////////////////////////////////////////////////////////////////////////
  79. #if defined(__x86_64__) || defined(_M_X64) || defined(__powerpc64__) || defined(__alpha__) ||\
  80. defined(__ia64__) || defined(__s390__) || defined(__s390x__) || defined(_LP64) || defined(__LP64__)
  81. # define RTTR_ARCH_TYPE RTTR_ARCH_64
  82. #else
  83. # define RTTR_ARCH_TYPE RTTR_ARCH_32
  84. #endif
  85. #if RTTR_COMPILER == RTTR_COMPILER_MSVC
  86. # define RTTR_INLINE inline
  87. # define RTTR_FORCE_INLINE __forceinline
  88. #elif RTTR_COMPILER == RTTR_COMPILER_GNUC
  89. # define RTTR_INLINE inline
  90. # define RTTR_FORCE_INLINE inline __attribute__((always_inline))
  91. #elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG
  92. # define RTTR_INLINE inline
  93. # define RTTR_FORCE_INLINE inline __attribute__((always_inline))
  94. #else
  95. # define RTTR_INLINE inline
  96. # define RTTR_FORCE_INLINE inline // no force inline for other platforms possible
  97. #endif
  98. /////////////////////////////////////////////////////////////////////////////////////////
  99. // Compiler specific cmds for export and import code to DLL
  100. /////////////////////////////////////////////////////////////////////////////////////////
  101. #if RTTR_COMPILER == RTTR_COMPILER_MSVC || __MINGW32__ || __CYGWIN__
  102. # define RTTR_HELPER_DLL_IMPORT __declspec( dllimport )
  103. # define RTTR_HELPER_DLL_EXPORT __declspec( dllexport )
  104. # define RTTR_HELPER_DLL_LOCAL
  105. #elif RTTR_COMPILER == RTTR_COMPILER_GNUC
  106. # if RTTR_COMP_VER >= 400
  107. # define RTTR_HELPER_DLL_IMPORT __attribute__ ((visibility ("default")))
  108. # define RTTR_HELPER_DLL_EXPORT __attribute__ ((visibility ("default")))
  109. # define RTTR_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden")))
  110. # else
  111. # define RTTR_HELPER_DLL_IMPORT
  112. # define RTTR_HELPER_DLL_EXPORT
  113. # define RTTR_HELPER_DLL_LOCAL
  114. # endif
  115. #elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG
  116. # define RTTR_HELPER_DLL_IMPORT __attribute__ ((visibility ("default")))
  117. # define RTTR_HELPER_DLL_EXPORT __attribute__ ((visibility ("default")))
  118. # define RTTR_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden")))
  119. #else
  120. # error "Do not know how to export classes for this platform"
  121. #endif
  122. #ifdef RTTR_DLL // compiled as a DLL
  123. # ifdef RTTR_DLL_EXPORTS // defined if we are building the DLL
  124. # define RTTR_API RTTR_HELPER_DLL_EXPORT
  125. # else
  126. # define RTTR_API RTTR_HELPER_DLL_IMPORT
  127. # endif
  128. # define RTTR_LOCAL RTTR_HELPER_DLL_LOCAL
  129. #else // it's a static lib.
  130. # define RTTR_API
  131. # define RTTR_LOCAL
  132. #endif
  133. /////////////////////////////////////////////////////////////////////////////////////////
  134. // Macros for some C++11 features, which are not available on every compiler
  135. /////////////////////////////////////////////////////////////////////////////////////////
  136. #if RTTR_COMPILER == RTTR_COMPILER_MSVC
  137. # if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
  138. # define RTTR_NO_CXX11_CONSTEXPR
  139. # define RTTR_NO_CXX14_CONSTEXPR
  140. # endif
  141. # if !defined(_MSVC_LANG) || (_MSVC_LANG < 201703L)
  142. # define RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE
  143. # endif
  144. #endif
  145. #if RTTR_COMPILER == RTTR_COMPILER_GNUC || RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG
  146. # if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
  147. # define RTTR_NO_CXX14_CONSTEXPR
  148. # endif
  149. # if !defined(cpp_noexcept)
  150. # define RTTR_NO_CXX11_NOEXCEPT
  151. # endif
  152. # if !defined(__cpp_noexcept_function_type) || (__cpp_noexcept_function_type < 201510)
  153. # define RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE
  154. # endif
  155. #endif
  156. /////////////////////////////////////////////////////////////////////////////////////////
  157. #if defined(RTTR_NO_CXX11_CONSTEXPR)
  158. # define RTTR_CONSTEXPR
  159. # define RTTR_CONSTEXPR_OR_CONST const
  160. #else
  161. # define RTTR_CONSTEXPR constexpr
  162. # define RTTR_CONSTEXPR_OR_CONST constexpr
  163. #endif
  164. #if defined(RTTR_NO_CXX14_CONSTEXPR)
  165. # define RTTR_CXX14_CONSTEXPR
  166. #else
  167. # define RTTR_CXX14_CONSTEXPR constexpr
  168. #endif
  169. #ifdef RTTR_NO_CXX11_NOEXCEPT
  170. # define RTTR_NOEXCEPT
  171. # define RTTR_NOEXCEPT_OR_NOTHROW throw()
  172. #else
  173. # define RTTR_NOEXCEPT noexcept
  174. # define RTTR_NOEXCEPT_OR_NOTHROW noexcept
  175. #endif
  176. #define RTTR_STATIC_CONSTEXPR static RTTR_CONSTEXPR_OR_CONST
  177. /////////////////////////////////////////////////////////////////////////////////////////
  178. // deprecated macro
  179. #if RTTR_COMPILER == RTTR_COMPILER_GNUC || RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG
  180. # define RTTR_DEPRECATED __attribute__ ((deprecated))
  181. # define RTTR_DEPRECATED_WITH_MSG(msg) __attribute__ ((deprecated(msg)))
  182. #elif RTTR_COMPILER == RTTR_COMPILER_MSVC
  183. # define RTTR_DEPRECATED __declspec(deprecated)
  184. # define RTTR_DEPRECATED_WITH_MSG(msg) __declspec(deprecated(msg))
  185. #else
  186. # pragma message("WARNING: You need to implement DEPRECATED for this compiler")
  187. # define RTTR_DEPRECATED(func) func
  188. # define RTTR_DEPRECATED_MSG(func) func
  189. #endif
  190. /////////////////////////////////////////////////////////////////////////////////////////
  191. // Disable some MSVC compile warnings
  192. /////////////////////////////////////////////////////////////////////////////////////////
  193. #if RTTR_COMPILER == RTTR_COMPILER_MSVC
  194. // Save warnings state
  195. # pragma warning (push)
  196. // Turn off warnings generated by long std templates
  197. // This warns about truncation to 255 characters in debug/browse info
  198. # pragma warning (disable : 4786)
  199. // Turn off warnings generated by long std templates
  200. // This warns about truncation to 255 characters in debug/browse info
  201. # pragma warning (disable : 4503)
  202. // disable: "<type> needs to have dll-interface to be used by clients'
  203. // Happens on STL member variables which are not public therefore is ok
  204. # pragma warning (disable : 4251)
  205. // disable: "non dll-interface class used as base for dll-interface class"
  206. // Happens when deriving from Singleton because bug in compiler ignores
  207. // template export
  208. # pragma warning (disable : 4275)
  209. // disable: "C++ Exception Specification ignored"
  210. // This is because MSVC 6 did not implement all the C++ exception
  211. // specifications in the ANSI C++ draft.
  212. # pragma warning( disable : 4290 )
  213. // disable: "no suitable definition provided for explicit template
  214. // instantiation request" Occurs in VC7 for no justifiable reason on all
  215. // #includes of Singleton
  216. # pragma warning( disable: 4661)
  217. // disable: "unreferenced formal parameter"
  218. // Many versions of VC have bugs which generate this error in cases where they shouldn't
  219. # pragma warning (disable : 4100)
  220. #endif
  221. #if RTTR_COMPILER == RTTR_COMPILER_GNUC
  222. # define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING _Pragma ("GCC diagnostic push") \
  223. _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
  224. # define RTTR_END_DISABLE_DEPRECATED_WARNING _Pragma ("GCC diagnostic pop")
  225. # define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING
  226. # define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING
  227. #if RTTR_COMP_VER >= 700
  228. #define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("GCC diagnostic push") \
  229. _Pragma ("GCC diagnostic ignored \"-Wnoexcept-type\"")
  230. #define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("GCC diagnostic pop")
  231. #else
  232. #define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING
  233. #define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING
  234. #endif
  235. #if RTTR_COMP_VER >= 510
  236. # define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING _Pragma ("GCC diagnostic push") \
  237. _Pragma ("GCC diagnostic ignored \"-Wsuggest-override\"")
  238. # define RTTR_END_DISABLE_OVERRIDE_WARNING _Pragma ("GCC diagnostic pop")
  239. # else
  240. # define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING
  241. # define RTTR_END_DISABLE_OVERRIDE_WARNING
  242. #endif
  243. #if RTTR_COMP_VER >= 900
  244. # define RTTR_BEGIN_DISABLE_INIT_LIST_WARNING _Pragma ("GCC diagnostic push") \
  245. _Pragma ("GCC diagnostic ignored \"-Winit-list-lifetime\"")
  246. # define RTTR_END_DISABLE_INIT_LIST_WARNING _Pragma ("GCC diagnostic pop")
  247. # else
  248. # define RTTR_BEGIN_DISABLE_INIT_LIST_WARNING
  249. # define RTTR_END_DISABLE_INIT_LIST_WARNING
  250. #endif
  251. # define RTTR_DECLARE_PLUGIN_CTOR __attribute__((constructor))
  252. # define RTTR_DECLARE_PLUGIN_DTOR __attribute__((destructor))
  253. #elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG
  254. #if defined(__has_warning) && __has_warning("-Wdeprecated-declarations")
  255. # define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING _Pragma ("clang diagnostic push") \
  256. _Pragma ("clang diagnostic ignored \"-Wdeprecated-declarations\"")
  257. # define RTTR_END_DISABLE_DEPRECATED_WARNING _Pragma ("clang diagnostic pop")
  258. #else
  259. # define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING
  260. # define RTTR_END_DISABLE_DEPRECATED_WARNING
  261. #endif
  262. # define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING
  263. # define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING
  264. #if defined(__has_warning) && __has_warning("-Wnoexcept-type")
  265. # define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("clang diagnostic push") \
  266. _Pragma ("clang diagnostic ignored \"-Wnoexcept-type\"")
  267. # define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("clang diagnostic pop")
  268. #else
  269. # define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING
  270. # define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING
  271. #endif
  272. #if defined(__has_warning) && __has_warning("-Winconsistent-missing-override")
  273. # define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING _Pragma ("clang diagnostic push") \
  274. _Pragma ("clang diagnostic ignored \"-Winconsistent-missing-override\"")
  275. # define RTTR_END_DISABLE_OVERRIDE_WARNING _Pragma ("clang diagnostic pop")
  276. #else
  277. # define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING
  278. # define RTTR_END_DISABLE_OVERRIDE_WARNING
  279. #endif
  280. # define RTTR_BEGIN_DISABLE_INIT_LIST_WARNING
  281. # define RTTR_END_DISABLE_INIT_LIST_WARNING
  282. # define RTTR_DECLARE_PLUGIN_CTOR __attribute__((__constructor__))
  283. # define RTTR_DECLARE_PLUGIN_DTOR __attribute__((__destructor__))
  284. #elif RTTR_COMPILER == RTTR_COMPILER_MSVC
  285. # define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING __pragma( warning( push )) \
  286. __pragma( warning( disable: 4996))
  287. # define RTTR_END_DISABLE_DEPRECATED_WARNING __pragma( warning( pop ))
  288. # define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING __pragma( warning( push )) \
  289. __pragma( warning( disable: 4127))
  290. # define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING __pragma( warning( pop ))
  291. # define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING
  292. # define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING
  293. # define RTTR_DECLARE_PLUGIN_CTOR
  294. # define RTTR_DECLARE_PLUGIN_DTOR
  295. # define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING
  296. # define RTTR_END_DISABLE_OVERRIDE_WARNING
  297. # define RTTR_BEGIN_DISABLE_INIT_LIST_WARNING
  298. # define RTTR_END_DISABLE_INIT_LIST_WARNING
  299. #else
  300. # pragma message("WARNING: unknown compiler, don't know how to disable deprecated warnings")
  301. #endif
  302. } // end namespace rttr
  303. #endif // RTTR_CORE_PREREQUISITES_H_