]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/platform.h
Fix build with Sun CC under Linux.
[wxWidgets.git] / include / wx / platform.h
index 642fdaeb964b7a4d29b620aa162d260b8460eed6..6f2601ff46fe31b10cdb70491c08d306f1584f3b 100644 (file)
 #ifndef _WX_PLATFORM_H_
 #define _WX_PLATFORM_H_
 
+/* GUI build by default */
+#if !defined(wxUSE_GUI)
+#   define wxUSE_GUI 1
+#endif /* !defined(wxUSE_GUI) */
+
 
 /*
     Codewarrior doesn't define any Windows symbols until some headers
 #  endif
 #endif
 
-/*
-    WXOSX targets
-    __WXOSX_MAC__ means Mac OS X, non embedded
-    __WXOSX_IPHONE__ means OS X iPhone
-*/
-
-/* backwards compatible define, until configure gets updated */
-#if defined __WXMAC__
-#define __WXOSX_CARBON__ 1
+#ifdef __WXMAC_XCODE__
+#    include <unistd.h>
+#    include <TargetConditionals.h>
+#    include <AvailabilityMacros.h>
+#    include "wx/osx/config_xcode.h"
 #endif
 
-#if defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__) || defined(__WXOSX_IPHONE__) 
-#   define __WXOSX__ 1
+/*
+ Handle Darwin gcc universal compilation.  Don't do this in an Apple-
+ specific case since no sane compiler should be defining either
+ __BIG_ENDIAN__ or __LITTLE_ENDIAN__ unless it really is generating
+ code that will be hosted on a machine with the appropriate endianness.
+ If a compiler defines neither, assume the user or configure set
+ WORDS_BIGENDIAN appropriately.
+ */
+#if defined(__BIG_ENDIAN__)
+#    undef WORDS_BIGENDIAN
+#    define WORDS_BIGENDIAN 1
+#elif defined(__LITTLE_ENDIAN__)
+#    undef WORDS_BIGENDIAN
+#elif defined(__WXMAC__) && !defined(WORDS_BIGENDIAN)
+/*  According to Stefan even ancient Mac compilers defined __BIG_ENDIAN__ */
+#    warning "Compiling wxMac with probably wrong endianness"
+#endif
+/* also the 32/64 bit universal builds must be handled accordingly */
+#ifdef __DARWIN__
+#    ifdef __LP64__
+#        undef SIZEOF_VOID_P
+#        undef SIZEOF_LONG
+#        undef SIZEOF_SIZE_T
+#        define SIZEOF_VOID_P 8
+#        define SIZEOF_LONG 8
+#        define SIZEOF_SIZE_T 8
+#    else
+#        undef SIZEOF_VOID_P
+#        undef SIZEOF_LONG
+#        undef SIZEOF_SIZE_T
+#        define SIZEOF_VOID_P 4
+#        define SIZEOF_LONG 4
+#        define SIZEOF_SIZE_T 4
+#    endif
 #endif
 
-#ifdef __WXOSX__
-/* for backwards compatibility of code (including our own) define __WXMAC__ */
+/*
+ Define various OS X symbols before including wx/chkconf.h which uses them.
+ __WXOSX_MAC__ means Mac OS X, non embedded
+ __WXOSX_IPHONE__ means OS X iPhone
+ */
+
+/*
+ Normally all of __WXOSX_XXX__, __WXOSX__ and __WXMAC__ are defined by
+ configure but ensure that we also define them if configure was not used for
+ whatever reason.
+ The primary symbol remains __WXOSX_XXX__ one, __WXOSX__ exists to allow
+ checking for any OS X port (Carbon and Cocoa) and __WXMAC__ is an old name
+ for it.
+ */
+#if defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__) || defined(__WXOSX_IPHONE__) \
+|| (defined(__DARWIN__) && !wxUSE_GUI)
+#   ifndef __WXOSX__
+#       define __WXOSX__ 1
+#   endif
 #   ifndef __WXMAC__
 #       define __WXMAC__ 1
 #   endif
+#endif
+
+#ifdef __WXOSX__
 /* setup precise defines according to sdk used */
 #   include <TargetConditionals.h>
-#   if defined(__WXOSX_IPHONE__) 
+#   if defined(__WXOSX_IPHONE__)
 #       if !( defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE )
 #           error "incorrect SDK for an iPhone build"
 #       endif
-#   elif defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__)
+#   else
+#       if wxUSE_GUI && !(defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__))
+#           error "one of __WXOSX_IPHONE__, __WXOSX_CARBON__ or __WXOSX_COCOA__ must be defined for the GUI build"
+#       endif
 #       if !( defined(TARGET_OS_MAC) && TARGET_OS_MAC )
 #           error "incorrect SDK for a Mac OS X build"
 #       endif
 #       define __WXOSX_MAC__ 1
-#   else
-#       error "one of __WXOSX_IPHONE__, __WXOSX_CARBON__ or __WXOSX_COCOA__ must be defined"
 #   endif
 #endif
 
 #endif
 
 /*
   __WXOSX_OR_COCOA__ is a common define to wxOSX (Carbon or Cocoa) and wxCocoa ports under OS X.
-
   DO NOT use this define in base library code.  Although wxMac has its own
   private base library (and thus __WXOSX_OR_COCOA__,__WXMAC__ and related defines are
   valid there), wxCocoa shares its library with other ports like wxGTK and wxX11.
-
   To keep wx authors from screwing this up, only enable __WXOSX_OR_COCOA__ for wxCocoa when
   not compiling the base library.  We determine this by first checking if
   wxUSE_BASE is not defined.  If it is not defined, then we're not buildling
   the base library, and possibly not building wx at all (but actually building
   user code that's using wx). If it is defined then we must check to make sure
   it is not true.  If it is true, we're building base.
-
   If you want it in the common darwin base library then use __DARWIN__.  You
   can use any Darwin-available libraries like CoreFoundation but please avoid
   using OS X libraries like Carbon or CoreServices.
-
+ __WXOSX_OR_COCOA__ is a common define to wxOSX (Carbon or Cocoa) and wxCocoa ports under OS X.
+ DO NOT use this define in base library code.  Although wxMac has its own
+ private base library (and thus __WXOSX_OR_COCOA__,__WXMAC__ and related defines are
+ valid there), wxCocoa shares its library with other ports like wxGTK and wxX11.
+ To keep wx authors from screwing this up, only enable __WXOSX_OR_COCOA__ for wxCocoa when
+ not compiling the base library.  We determine this by first checking if
+ wxUSE_BASE is not defined.  If it is not defined, then we're not buildling
+ the base library, and possibly not building wx at all (but actually building
+ user code that's using wx). If it is defined then we must check to make sure
+ it is not true.  If it is true, we're building base.
+ If you want it in the common darwin base library then use __DARWIN__.  You
+ can use any Darwin-available libraries like CoreFoundation but please avoid
+ using OS X libraries like Carbon or CoreServices.
  */
 #if defined(__WXOSX__) || (defined(__WXCOCOA__) && (!defined(wxUSE_BASE) || !wxUSE_BASE))
 #   define __WXOSX_OR_COCOA__ 1
 #endif
 
-#ifdef __WXOSX_OR_COCOA__
-#    ifdef __WXMAC_XCODE__
-#        include <unistd.h>
-#        include <TargetConditionals.h>
-#        include <AvailabilityMacros.h>
-#        include "wx/osx/config_xcode.h"
-#    endif
-#endif
 /*
    first define Windows symbols if they're not defined on the command line: we
    can autodetect everything we need if _WIN32 is defined
 #   endif
 #endif
 
+#if defined(__WXWINCE__) && defined(_MSC_VER) && (_MSC_VER == 1201)
+    #define __EVC4__
+#endif
+
 #if defined(__POCKETPC__) || defined(__SMARTPHONE__) || defined(__WXGPE__)
 #   define __WXHANDHELD__
 #endif
    Note that it must be included before defining hardware symbols below as they
    could be already defined by configure
  */
+#include "wx/setup.h"
+
 #ifdef __GCCXML__
     /*
         we're using gccxml to create an XML representation of the entire
-        wxWidgets interface; pass it a special setup.h file
+        wxWidgets interface; use a special setup_gccxml.h file to fix some
+        of the stuff #defined by the real setup.h
     */
     #include "wx/setup_gccxml.h"
-#else
-    #include "wx/setup.h"
 #endif
 
+/*
+   Convenience for any optional classes that use the wxAnyButton base class.
+ */
+#if wxUSE_TOGGLEBTN || wxUSE_BUTTON
+    #define wxHAS_ANY_BUTTON
+#endif
+
+
 /*
    Hardware platform detection.
 
    test for old versions of Borland C, normally need at least 5.82, Turbo
    explorer, available for free at http://www.turboexplorer.com/downloads
 */
-#if defined(__BORLANDC__) && (__BORLANDC__ < 0x550)
-#   error "wxWidgets requires a newer version of Borland, we recommend upgrading to 5.82 (Turbo Explorer). You may at your own risk remove this line and try building but be prepared to get build errors."
-#endif /* __BORLANDC__ */
 
-#if defined(__BORLANDC__) && (__BORLANDC__ < 0x582) && (__BORLANDC__ > 0x559)
-#   ifndef _USE_OLD_RW_STL
-#       error "wxWidgets is incompatible with default Borland C++ 5.6 STL library, please add -D_USE_OLD_RW_STL to your bcc32.cfg to use RogueWave STL implementation."
-#   endif
-#endif /* __BORLANDC__ */
 
+/*
+    Older versions of Borland C have some compiler bugs that need
+    workarounds. Mostly pertains to the free command line compiler 5.5.1.
+*/
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x551)
+    /*
+        The Borland free compiler is unable to handle overloaded enum
+        comparisons under certain conditions e.g. when any class has a
+        conversion ctor for an integral type and there's an overload to
+        compare between an integral type and that class type.
+    */
+#   define wxCOMPILER_NO_OVERLOAD_ON_ENUM
+
+    /*
+        This is needed to overcome bugs in 5.5.1 STL, linking errors will
+        result if it is not defined.
+     */
+#   define _RWSTD_COMPILE_INSTANTIATE
+
+    /*
+        Preprocessor in older Borland compilers have major problems
+        concatenating with ##. Specifically, if the string operands being
+        concatenated have special meaning (e.g. L"str", 123i64 etc)
+        then ## will not concatenate the operands correctly.
+
+        As a workaround, define wxPREPEND* and wxAPPEND* without using
+        wxCONCAT_HELPER.
+    */
+#   define wxCOMPILER_BROKEN_CONCAT_OPER
+#endif /* __BORLANDC__ */
 
 /*
-   This macro can be used to test the Open Watcom version.
+   Define Watcom-specific macros.
 */
 #ifndef __WATCOMC__
 #   define wxWATCOM_VERSION(major,minor) 0
 #   define wxCHECK_WATCOM_VERSION(major,minor) 0
 #   define wxONLY_WATCOM_EARLIER_THAN(major,minor) 0
-#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
-#   error "Only Open Watcom is supported in this release"
+#   define WX_WATCOM_ONLY_CODE( x )
 #else
+#   if __WATCOMC__ < 1200
+#       error "Only Open Watcom is supported in this release"
+#   endif
+
 #   define wxWATCOM_VERSION(major,minor) ( major * 100 + minor * 10 + 1100 )
 #   define wxCHECK_WATCOM_VERSION(major,minor) ( __WATCOMC__ >= wxWATCOM_VERSION(major,minor) )
 #   define wxONLY_WATCOM_EARLIER_THAN(major,minor) ( __WATCOMC__ < wxWATCOM_VERSION(major,minor) )
+#   define WX_WATCOM_ONLY_CODE( x )  x
 #endif
 
 /*
 #       define __VISUALC8__
 #   elif __VISUALC__ < 1600
 #       define __VISUALC9__
+#   elif __VISUALC__ < 1700
+#       define __VISUALC10__
 #   else
-#       pragma message("Please update this code for the next VC++ version")
+#       pragma message("Please update wx/platform.h to recognize this VC++ version")
 #   endif
 
 #    elif defined(__BCPLUSPLUS__) && !defined(__BORLANDC__)
 #else
 #    undef wxCHECK_W32API_VERSION
 #    define wxCHECK_W32API_VERSION(maj, min) (0)
+#    undef wxCHECK_MINGW32_VERSION
+#    define wxCHECK_MINGW32_VERSION(maj, min) (0)
 #endif
 
 /**
     #define wxCHECK_SUNCC_VERSION(maj, min) (0)
 #endif
 
-/*
-    Handle Darwin gcc universal compilation.  Don't do this in an Apple-
-    specific case since no sane compiler should be defining either
-    __BIG_ENDIAN__ or __LITTLE_ENDIAN__ unless it really is generating
-    code that will be hosted on a machine with the appropriate endianness.
-    If a compiler defines neither, assume the user or configure set
-    WORDS_BIGENDIAN appropriately.
- */
-#if defined(__BIG_ENDIAN__)
-#    undef WORDS_BIGENDIAN
-#    define WORDS_BIGENDIAN 1
-#elif defined(__LITTLE_ENDIAN__)
-#    undef WORDS_BIGENDIAN
-#elif defined(__WXMAC__) && !defined(WORDS_BIGENDIAN)
-/*  According to Stefan even ancient Mac compilers defined __BIG_ENDIAN__ */
-#    warning "Compiling wxMac with probably wrong endianness"
-#endif
-/* also the 32/64 bit universal builds must be handled accordingly */
-#ifdef __DARWIN__
-#      ifdef __LP64__
-#              undef SIZEOF_VOID_P 
-#              undef SIZEOF_LONG 
-#              undef SIZEOF_SIZE_T 
-#              define SIZEOF_VOID_P 8
-#              define SIZEOF_LONG 8
-#              define SIZEOF_SIZE_T 8
-#      else
-#              undef SIZEOF_VOID_P 
-#              undef SIZEOF_LONG 
-#              undef SIZEOF_SIZE_T 
-#              define SIZEOF_VOID_P 4
-#              define SIZEOF_LONG 4
-#              define SIZEOF_SIZE_T 4
-#      endif
-#endif
+
 /*
    check the consistency of the settings in setup.h: note that this must be
    done after setting wxUSE_UNICODE correctly as it is used in wx/chkconf.h
 #    define wxUSE_WXDIB 1
 #endif
 
-/*
-    We need AvailabilityMacros.h for ifdefing out things that don't exist on
-    OSX 10.2 and lower
-    FIXME:  We need a better way to detect for 10.3 then including a system header
-*/
-#ifdef __DARWIN__
-    #include <AvailabilityMacros.h>
-#endif
-
 #if defined (__WXPALMOS__)
 #include "wx/palmos/missing.h"
-#endif // __WXPALMOS__
+#endif /* __WXPALMOS__ */
 
 #if !defined (__WXPALMOS5__)
 #define POSSEC_APPBASE
 #define POSSEC_FILE
 #define POSSEC_FILECONF
 #define POSSEC_FILEFN
-#endif // __WXPALMOS5__
+#endif /* __WXPALMOS5__ */
+
+/*
+    Optionally supported C++ features.
+ */
+
+/*
+    RTTI: if it is disabled in build/msw/makefile.* then this symbol will
+    already be defined but it's also possible to do it from configure (with
+    g++) or by editing project files with MSVC so test for it here too.
+ */
+#ifndef wxNO_RTTI
+    /*
+        Only 4.3 defines __GXX_RTTI by default so its absence is not an
+        indication of disabled RTTI with the previous versions.
+     */
+#   if wxCHECK_GCC_VERSION(4, 3)
+#       ifndef __GXX_RTTI
+#           define wxNO_RTTI
+#       endif
+#   elif defined(_MSC_VER)
+#       ifndef _CPPRTTI
+#           define wxNO_RTTI
+#       endif
+#   endif
+#endif /* wxNO_RTTI */
 
 #endif /* _WX_PLATFORM_H_ */