diff --git a/src/common/time.cpp b/src/common/time.cpp index b9ccf39b43..6c42da537a 100644 --- a/src/common/time.cpp +++ b/src/common/time.cpp @@ -22,23 +22,6 @@ #pragma hdrstop #endif -// This is a horrible hack which only works because we don't currently include -// from wx/wxprec.h. It is needed because we need timezone-related -// stuff from MinGW time.h, but it is not compiled in strict ANSI mode and it -// is too complicated to be dealt with using wxDECL_FOR_STRICT_MINGW32(). So we -// just include the header after undefining __STRICT_ANSI__ to get all the -// declarations we need -- and then define it back to avoid inconsistencies in -// all our other headers. -// -// Note that the same hack is used for "environ" in utilscmn.cpp, so if the -// code here is modified because this hack becomes unnecessary or a better -// solution is found, the code there should be updated as well. -#ifdef wxNEEDS_STRICT_ANSI_WORKAROUNDS - #undef __STRICT_ANSI__ - #include - #define __STRICT_ANSI__ -#endif - #include "wx/time.h" #ifndef WX_PRECOMP @@ -59,6 +42,7 @@ #include +wxDECL_FOR_STRICT_MINGW32(void, tzset, (void)); #if !defined(__WXMAC__) #include // for time_t diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index fbf933fa94..7394fe3c85 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -23,12 +23,27 @@ #pragma hdrstop #endif -// See comment about this hack in time.cpp: here we do it for environ external -// variable which can't be easily declared when using MinGW in strict ANSI mode. +// This is a needed to get the declaration of the global "environ" variable +// from MinGW headers which don't declare it there when in strict ANSI mode. We +// can't use the usual wxDECL_FOR_STRICT_MINGW32() hack for it because it's not +// even a variable, but a macro expanding to a function or a variable depending +// on the build and this is horribly brittle but there just doesn't seem to be +// any other alternative. #ifdef wxNEEDS_STRICT_ANSI_WORKAROUNDS - #undef __STRICT_ANSI__ + // Notice that undefining __STRICT_ANSI__ and including it here doesn't + // work because it could have been already included, e.g. when using PCH. #include - #define __STRICT_ANSI__ + + #ifndef environ + // This just reproduces what stdlib.h does in MinGW 4.8.1. + #ifdef __MSVCRT__ + wxDECL_FOR_STRICT_MINGW32(char ***, __p__environ, (void)); + #define environ (*__p__environ()) + #else + extern char *** _imp___environ_dll; + #define environ (*_imp___environ_dll) + #endif + #endif // defined(environ) #endif #ifndef WX_PRECOMP