diff --git a/include/wx/app.h b/include/wx/app.h index 755a3f25e9..d5f4c70b71 100644 --- a/include/wx/app.h +++ b/include/wx/app.h @@ -257,12 +257,12 @@ public: const wxChar *cond, const wxChar *msg); #endif // __WXDEBUG__ - + // check that the wxBuildOptions object (constructed in the application // itself, usually the one from IMPLEMENT_APP() macro) matches the build // options of the library and abort if it doesn't - static bool CheckBuildOptions(const wxBuildOptions& buildOptions); - + static bool CheckBuildOptions(const char *optionsSignature, + const char *componentName); // implementation only from now on // ------------------------------- @@ -628,7 +628,8 @@ public: #define IMPLEMENT_APP_NO_MAIN(appname) \ wxAppConsole *wxCreateApp() \ { \ - wxAppConsole::CheckBuildOptions(wxBuildOptions()); \ + wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ + wxT("your program")); \ return new appname; \ } \ wxAppInitializer \ diff --git a/include/wx/build.h b/include/wx/build.h index 620282e074..a9bf3923ab 100644 --- a/include/wx/build.h +++ b/include/wx/build.h @@ -1,7 +1,7 @@ /////////////////////////////////////////////////////////////////////////////// // Name: wx/build.h -// Purpose: wxBuildOptions class declaration -// Author: Vadim Zeitlin +// Purpose: Runtime build options checking +// Author: Vadim Zeitlin, Vaclav Slavik // Modified by: // Created: 07.05.02 // RCS-ID: $Id$ @@ -14,44 +14,48 @@ #include "wx/version.h" -class WXDLLIMPEXP_BASE wxAppConsole; - // ---------------------------------------------------------------------------- -// wxBuildOptions +// WX_BUILD_OPTIONS_SIGNATURE // ---------------------------------------------------------------------------- -class wxBuildOptions -{ -public: - // the ctor must be inline to get the compilation settings of the code - // which included this header - wxBuildOptions() - { - // debug/release -#ifdef __WXDEBUG__ - m_isDebug = TRUE; +#define __WX_BO_STRINGIZE(x) #x + +#if (wxMINOR_VERSION % 2) == 0 + #define __WX_BO_VERSION(x,y,z) \ + __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) #else - m_isDebug = FALSE; + #define __WX_BO_VERSION(x,y,z) \ + __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) "." __WX_BO_STRINGIZE(z) #endif - // version: we don't test the micro version as hopefully changes - // between 2 micro versions don't result in fatal compatibility - // problems - m_verMaj = wxMAJOR_VERSION; - m_verMin = wxMINOR_VERSION; - } +#ifdef __WXDEBUG__ + #define __WX_BO_DEBUG "debug" +#else + #define __WX_BO_DEBUG "no debug" +#endif -private: - // the version - int m_verMaj, - m_verMin; +#if wxUSE_UNICODE + #define __WX_BO_UNICODE "Unicode" +#else + #define __WX_BO_UNICODE "ANSI" +#endif + +// This macro is passed as argument to wxConsoleApp::CheckBuildOptions() +#define WX_BUILD_OPTIONS_SIGNATURE \ + __WX_BO_VERSION(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) \ + " (" __WX_BO_DEBUG "," __WX_BO_UNICODE ")" - // compiled with __WXDEBUG__? - bool m_isDebug; - // actually only CheckBuildOptions() should be our friend but well... - friend class wxAppConsole; -}; + +// Use this macro to check build options. Adding it to a file in DLL will +// ensure that the DLL checks build options in same way IMPLEMENT_APP() does. +#define WX_CHECK_BUILD_OPTIONS(libName) \ + static bool wxCheckBuildOptions() \ + { \ + wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ + libName); \ + return true; \ + }; \ + static bool gs_buildOptionsCheck = wxCheckBuildOptions(); #endif // _WX_BUILD_H_ - diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index 40747cb053..2091e12a70 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -357,37 +357,23 @@ bool wxAppConsole::OnCmdLineError(wxCmdLineParser& parser) // ---------------------------------------------------------------------------- /* static */ -bool wxAppConsole::CheckBuildOptions(const wxBuildOptions& opts) +bool wxAppConsole::CheckBuildOptions(const char *optionsSignature, + const char *componentName) { -#define wxCMP(what) (what == opts.m_ ## what) - - bool -#ifdef __WXDEBUG__ - isDebug = TRUE; -#else - isDebug = FALSE; +#if 0 // can't use wxLogTrace, not up and running yet + printf("checking build options object '%s' (ptr %p) in '%s'\n", + optionsSignature, optionsSignature, componentName); #endif - int verMaj = wxMAJOR_VERSION, - verMin = wxMINOR_VERSION; - - if ( !(wxCMP(isDebug) && wxCMP(verMaj) && wxCMP(verMin)) ) + if ( strcmp(optionsSignature, WX_BUILD_OPTIONS_SIGNATURE) != 0 ) { + wxString lib = wxString::FromAscii(WX_BUILD_OPTIONS_SIGNATURE); + wxString prog = wxString::FromAscii(optionsSignature); + wxString progName = wxString::FromAscii(componentName); wxString msg; - wxString libDebug, progDebug; - - if (isDebug) - libDebug = wxT("debug"); - else - libDebug = wxT("no debug"); - - if (opts.m_isDebug) - progDebug = wxT("debug"); - else - progDebug = wxT("no debug"); - msg.Printf(_T("Mismatch between the program and library build versions detected.\nThe library used %d.%d (%s), and your program used %d.%d (%s)."), - verMaj, verMin, libDebug.c_str(), opts.m_verMaj, opts.m_verMin, progDebug.c_str()); + msg.Printf(_T("Mismatch between the program and library build versions detected.\nThe library used %s, and %s used %s."), + lib.c_str(), progName.c_str(), prog.c_str()); wxLogFatalError(msg);