1 /////////////////////////////////////////////////////////////////////////////// 2 // Name: wx/build.h 3 // Purpose: Runtime build options checking 4 // Author: Vadim Zeitlin, Vaclav Slavik 5 // Modified by: 6 // Created: 07.05.02 7 // RCS-ID: $Id: build.h 35858 2005-10-09 15:48:42Z MBN $ 8 // Copyright: (c) 2002 Vadim Zeitlin <vadim@wxwidgets.org> 9 // Licence: wxWindows licence 10 /////////////////////////////////////////////////////////////////////////////// 11 12 #ifndef _WX_BUILD_H_ 13 #define _WX_BUILD_H_ 14 15 #include "wx/version.h" 16 17 // NB: This file contains macros for checking binary compatibility of libraries 18 // in multilib buildm, plugins and user components. 19 // The WX_BUILD_OPTIONS_SIGNATURE macro expands into string that should 20 // uniquely identify binary compatible builds: i.e. if two builds of the 21 // library are binary compatible, their signature string should be the 22 // same; if two builds are binary incompatible, their signatures should 23 // be different. 24 // 25 // Therefore, wxUSE_XXX flags that affect binary compatibility (vtables, 26 // function signatures) should be accounted for here. So should compilers 27 // and compiler versions (but note that binary compatible compiler versions 28 // such as gcc-2.95.2 and gcc-2.95.3 should have same signature!). 29 30 // ---------------------------------------------------------------------------- 31 // WX_BUILD_OPTIONS_SIGNATURE 32 // ---------------------------------------------------------------------------- 33 34 #define __WX_BO_STRINGIZE(x) __WX_BO_STRINGIZE0(x) 35 #define __WX_BO_STRINGIZE0(x) #x 36 37 #if (wxMINOR_VERSION % 2) == 0 38 #define __WX_BO_VERSION(x,y,z) \ 39 __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) 40 #else 41 #define __WX_BO_VERSION(x,y,z) \ 42 __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) "." __WX_BO_STRINGIZE(z) 43 #endif 44 45 #ifdef __WXDEBUG__ 46 #define __WX_BO_DEBUG "debug" 47 #else 48 #define __WX_BO_DEBUG "no debug" 49 #endif 50 51 #if wxUSE_UNICODE 52 #define __WX_BO_UNICODE "Unicode" 53 #else 54 #define __WX_BO_UNICODE "ANSI" 55 #endif 56 57 // GCC and Intel C++ share same C++ ABI (and possibly others in the future), 58 // check if compiler versions are compatible: 59 #if defined(__GXX_ABI_VERSION) 60 #define __WX_BO_COMPILER \ 61 ",compiler with C++ ABI " __WX_BO_STRINGIZE(__GXX_ABI_VERSION) 62 #elif defined(__INTEL_COMPILER) 63 #define __WX_BO_COMPILER ",Intel C++" 64 #elif defined(__GNUG__) 65 #define __WX_BO_COMPILER ",GCC " \ 66 __WX_BO_STRINGIZE(__GNUC__) "." __WX_BO_STRINGIZE(__GNUC_MINOR__) 67 #elif defined(__VISUALC__) 68 #define __WX_BO_COMPILER ",Visual C++" 69 #elif defined(__BORLANDC__) 70 #define __WX_BO_COMPILER ",Borland C++" 71 #elif defined(__DIGITALMARS__) 72 #define __WX_BO_COMPILER ",DigitalMars" 73 #elif defined(__WATCOMC__) 74 #define __WX_BO_COMPILER ",Watcom C++" 75 #else 76 #define __WX_BO_COMPILER 77 #endif 78 79 // WXWIN_COMPATIBILITY macros affect presence of virtual functions 80 #if WXWIN_COMPATIBILITY_2_4 81 #define __WX_BO_WXWIN_COMPAT_2_4 ",compatible with 2.4" 82 #else 83 #define __WX_BO_WXWIN_COMPAT_2_4 84 #endif 85 #if WXWIN_COMPATIBILITY_2_6 86 #define __WX_BO_WXWIN_COMPAT_2_6 ",compatible with 2.6" 87 #else 88 #define __WX_BO_WXWIN_COMPAT_2_6 89 #endif 90 91 // deriving wxWin containers from STL ones changes them completely: 92 #if wxUSE_STL 93 #define __WX_BO_STL ",STL containers" 94 #else 95 #define __WX_BO_STL ",wx containers" 96 #endif 97 98 // This macro is passed as argument to wxConsoleApp::CheckBuildOptions() 99 #define WX_BUILD_OPTIONS_SIGNATURE \ 100 __WX_BO_VERSION(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) \ 101 " (" __WX_BO_DEBUG "," __WX_BO_UNICODE \ 102 __WX_BO_COMPILER \ 103 __WX_BO_STL \ 104 __WX_BO_WXWIN_COMPAT_2_4 __WX_BO_WXWIN_COMPAT_2_6 \ 105 ")" 106 107 108 // ---------------------------------------------------------------------------- 109 // WX_CHECK_BUILD_OPTIONS 110 // ---------------------------------------------------------------------------- 111 112 // Use this macro to check build options. Adding it to a file in DLL will 113 // ensure that the DLL checks build options in same way IMPLEMENT_APP() does. 114 #define WX_CHECK_BUILD_OPTIONS(libName) \ 115 static struct wxBuildOptionsChecker \ 116 { \ 117 wxBuildOptionsChecker() \ 118 { \ 119 wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ 120 libName); \ 121 } \ 122 } gs_buildOptionsCheck; 123 124 125 #if WXWIN_COMPATIBILITY_2_4 126 127 // ---------------------------------------------------------------------------- 128 // wxBuildOptions 129 // ---------------------------------------------------------------------------- 130 131 // NB: Don't use this class in new code, it relies on the ctor being always 132 // inlined. WX_BUILD_OPTIONS_SIGNATURE always works. 133 class wxBuildOptions 134 { 135 public: 136 // the ctor must be inline to get the compilation settings of the code 137 // which included this header wxBuildOptions()138 wxBuildOptions() : m_signature(WX_BUILD_OPTIONS_SIGNATURE) {} 139 140 private: 141 const char *m_signature; 142 143 // actually only CheckBuildOptions() should be our friend but well... 144 friend class wxAppConsole; 145 }; 146 147 #endif // WXWIN_COMPATIBILITY_2_4 148 149 #endif // _WX_BUILD_H_ 150