]> git.saurik.com Git - wxWidgets.git/commitdiff
reworked wxBuildOptions code to work even w/o function inlining
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 4 Aug 2003 13:17:17 +0000 (13:17 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 4 Aug 2003 13:17:17 +0000 (13:17 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22576 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/app.h
include/wx/build.h
src/common/appbase.cpp

index 755a3f25e9a3979e2dfb201c4720cb916b2b1f0d..d5f4c70b71510cfb8186bd92dcd4c6b6ad4e6e71 100644 (file)
@@ -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                                                        \
index 620282e074e862ebb93f4bedce07f52c0da8aecf..a9bf3923ab8f70d6b6f428d453dbb077fc23fa26 100644 (file)
@@ -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$
 
 #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
+#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
+    #define __WX_BO_VERSION(x,y,z) \
+        __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) "." __WX_BO_STRINGIZE(z)
+#endif
+
 #ifdef __WXDEBUG__
-        m_isDebug = TRUE;
+    #define __WX_BO_DEBUG "debug"
 #else
-        m_isDebug = FALSE;
+    #define __WX_BO_DEBUG "no debug"
 #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;
-    }
+#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 ")"
 
-private:
-    // the version
-    int m_verMaj,
-        m_verMin;
 
-    // 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_
-
index 40747cb053edfc32d2d92538f5f7b8beba292f12..2091e12a70196af8179ec2d5290fa1fe13aa90ac 100644 (file)
@@ -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);