0029251: Configuration - problem compiling OCCT 7.2 with glibc 2.26
authorkgv <kgv@opencascade.com>
Sat, 21 Oct 2017 17:46:59 +0000 (20:46 +0300)
committerbugmaster <bugmaster@opencascade.com>
Tue, 24 Oct 2017 15:32:01 +0000 (18:32 +0300)
Standard_CLocaleSentry does not include xlocale.h when using glibc anymore.
HAVE_XLOCALE_H has been renamed to OCCT_CLOCALE_POSIX2008 to avoid confusion.

Renamed macros OCC_CHECK_BASE_CLASS -> OCCT_CHECK_BASE_CLASS.

src/Standard/Standard_CLocaleSentry.cxx
src/Standard/Standard_CLocaleSentry.hxx
src/Standard/Standard_CString.cxx
src/Standard/Standard_Type.hxx

index ce3212f..8b30c2c 100644 (file)
@@ -30,7 +30,7 @@ namespace
   public:
 
     CLocalePtr()
-    #ifdef HAVE_XLOCALE_H
+    #ifdef OCCT_CLOCALE_POSIX2008
     : myLocale (newlocale (LC_ALL_MASK, "C", NULL))
     #elif defined(_MSC_VER)
     : myLocale (_create_locale (LC_ALL, "C"))
@@ -41,7 +41,7 @@ namespace
 
     ~CLocalePtr()
     {
-    #ifdef HAVE_XLOCALE_H
+    #ifdef OCCT_CLOCALE_POSIX2008
       freelocale (myLocale);
     #elif defined(_MSC_VER)
       _free_locale (myLocale);
@@ -72,7 +72,7 @@ Standard_CLocaleSentry::clocale_t Standard_CLocaleSentry::GetCLocale()
 // purpose  :
 // =======================================================================
 Standard_CLocaleSentry::Standard_CLocaleSentry()
-#ifdef HAVE_XLOCALE_H
+#ifdef OCCT_CLOCALE_POSIX2008
 : myPrevLocale (uselocale (theCLocale.myLocale)) // switch to C locale within this thread only using xlocale API
 #else
 : myPrevLocale (setlocale (LC_ALL, 0))
@@ -81,7 +81,7 @@ Standard_CLocaleSentry::Standard_CLocaleSentry()
 #endif
 #endif
 {
-#if !defined(HAVE_XLOCALE_H)
+#if !defined(OCCT_CLOCALE_POSIX2008)
   const char* aPrevLocale = (const char* )myPrevLocale;
   if (myPrevLocale == NULL
    || (aPrevLocale[0] == 'C' && aPrevLocale[1] == '\0'))
@@ -104,7 +104,7 @@ Standard_CLocaleSentry::Standard_CLocaleSentry()
 // =======================================================================
 Standard_CLocaleSentry::~Standard_CLocaleSentry()
 {
-#if defined(HAVE_XLOCALE_H)
+#if defined(OCCT_CLOCALE_POSIX2008)
   uselocale ((locale_t )myPrevLocale);
 #else
   if (myPrevLocale != NULL)
index a94ade7..3b3beba 100755 (executable)
 
 #include <locale.h>
 
-#ifndef HAVE_XLOCALE_H
-  //! "xlocale.h" available in Mac OS X and glibc (Linux) for a long time as an extension
-  //! and become part of POSIX since '2008.
-  //! Notice that this is impossible to test (_POSIX_C_SOURCE >= 200809L)
-  //! since POSIX didn't declared such identifier.
+#if defined(__APPLE__)
+  #include <xlocale.h>
+#endif
+
+#ifndef OCCT_CLOCALE_POSIX2008
+  //! @def OCCT_CLOCALE_POSIX2008
+  //!
+  //! POSIX.1-2008 extends C locale API by providing methods like newlocale/freelocale/uselocale.
+  //! Presence of this extension cannot be checked in straightforward way (like (_POSIX_C_SOURCE >= 200809L))
+  //! due to missing such declarations in standard.
+  //! On macOS new functions are declared within "xlocale.h" header (the same is for glibc, but this header has been removed since glibc 2.26).
   #if defined(__APPLE__)
-    #define HAVE_XLOCALE_H
+    #define OCCT_CLOCALE_POSIX2008
   #endif
 
   //! We check _GNU_SOURCE for glibc extensions here and it is always defined by g++ compiler.
   #if defined(_GNU_SOURCE) && !defined(__ANDROID__)
-    #define HAVE_XLOCALE_H
+    #define OCCT_CLOCALE_POSIX2008
   #endif
-#endif // ifndef HAVE_LOCALE_H
-
-#if defined(HAVE_XLOCALE_H) && !(defined(__GLIBC__) && (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 24))
-  // xlocale.h is actually a non-standard header file; glibc 2.26 has removed it altogether (all definition comes from locale.h)
-  #include <xlocale.h>
 #endif
 
 #if !defined(__ANDROID__)
@@ -64,7 +65,7 @@ public:
 
 public:
 
-#ifdef HAVE_XLOCALE_H
+#ifdef OCCT_CLOCALE_POSIX2008
   typedef  locale_t clocale_t;
 #elif defined(_MSC_VER)
   typedef _locale_t clocale_t;
index dc0a222..d10974f 100755 (executable)
@@ -76,7 +76,7 @@ Standard_Integer HashCodes (const Standard_CString Value,
   // and newlocale/uselocale/freelocale to switch locale within current thread only.
   // So we switch to C locale temporarily
   #define SAVE_TL() Standard_CLocaleSentry aLocaleSentry;
-  #ifndef HAVE_XLOCALE_H
+  #ifndef OCCT_CLOCALE_POSIX2008
     // glibc version for android platform use locale-independent implementation of
     // strtod, strtol, strtoll functions. For other system with locale-depended
     // implementations problems may appear if "C" locale is not set explicitly.
index b21ba3a..9fcdf55 100644 (file)
@@ -24,7 +24,7 @@
 
 // Auxiliary tools to check at compile time that class declared as base in 
 // DEFINE_STANDARD_RTTI* macro is actually a base class.
-#if ! defined(OCC_CHECK_BASE_CLASS)
+#if ! defined(OCCT_CHECK_BASE_CLASS)
 
 #if (defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || (__GNUC__ > 4)))
 
@@ -58,7 +58,7 @@ namespace opencascade
   struct has_type<T, std::tuple<T, Ts...> > : std::true_type {};
 }
 
-#define OCC_CHECK_BASE_CLASS(Class,Base) \
+#define OCCT_CHECK_BASE_CLASS(Class,Base) \
   using direct_base_classes = opencascade::direct_base_class_as_tuple<std::tr2::direct_bases<Class>::type>::type; \
   static_assert(opencascade::has_type<Base, direct_base_classes>::type::value, "OCCT RTTI definition is incorrect: " #Base " is not direct base class of " #Class); \
   static_assert(&get_type_name == &Class::get_type_name, "OCCT RTTI definition is misplaced: current class is not " #Class);
@@ -66,25 +66,25 @@ namespace opencascade
 #elif (defined(_MSC_VER) && (_MSC_VER < 1600))
 
 // VC9 does not support static_assert and decltype at all
-#define OCC_CHECK_BASE_CLASS(Class,Base)
+#define OCCT_CHECK_BASE_CLASS(Class,Base)
 
 #elif (defined(_MSC_VER) && (_MSC_VER >= 1900))
 
 // VC14+ allow using address of member functions in static checks,
 // that allows checking for the current type being correctly named in the macro
-#define OCC_CHECK_BASE_CLASS(Class,Base) \
+#define OCCT_CHECK_BASE_CLASS(Class,Base) \
   static_assert(opencascade::is_base_but_not_same<Base, Class>::value, "OCCT RTTI definition is incorrect: " #Base " is not base class of " #Class); \
   static_assert(&get_type_name == &Class::get_type_name, "OCCT RTTI definition is misplaced: current class is not " #Class);
 
 #else
 
 // by default, check only the base class
-#define OCC_CHECK_BASE_CLASS(Class,Base) \
+#define OCCT_CHECK_BASE_CLASS(Class,Base) \
   static_assert(opencascade::is_base_but_not_same<Base, Class>::value, "OCCT RTTI definition is incorrect: " #Base " is not base class of " #Class);
 
 #endif
 
-#endif /* ! defined(OCC_CHECK_BASE_CLASS) */
+#endif /* ! defined(OCCT_CHECK_BASE_CLASS) */
 
 //! Helper macro to get instance of a type descriptor for a class in a legacy way.
 #define STANDARD_TYPE(theType) theType::get_type_descriptor()
@@ -97,7 +97,7 @@ namespace opencascade
 #define DEFINE_STANDARD_RTTI_INLINE(Class,Base) \
 public: \
   typedef Base base_type; \
-  static const char* get_type_name () { return #Class; OCC_CHECK_BASE_CLASS(Class,Base) } \
+  static const char* get_type_name () { return #Class; OCCT_CHECK_BASE_CLASS(Class,Base) } \
   static const Handle(Standard_Type)& get_type_descriptor () { return Standard_Type::Instance<Class>(); } \
   virtual const Handle(Standard_Type)& DynamicType() const Standard_OVERRIDE { return get_type_descriptor (); }
 
@@ -108,7 +108,7 @@ public: \
 #define DEFINE_STANDARD_RTTIEXT(Class,Base) \
 public: \
   typedef Base base_type; \
-  static const char* get_type_name () { return #Class; OCC_CHECK_BASE_CLASS(Class,Base) } \
+  static const char* get_type_name () { return #Class; OCCT_CHECK_BASE_CLASS(Class,Base) } \
   Standard_EXPORT static const Handle(Standard_Type)& get_type_descriptor (); \
   Standard_EXPORT virtual const Handle(Standard_Type)& DynamicType() const Standard_OVERRIDE;