Make glog ABI compatible with gflags
author <shinichiro.hamaji@gmail.com> <>
Fri, 25 Jan 2013 05:44:43 +0000 (05:44 +0000)
committer <shinichiro.hamaji@gmail.com> <>
Fri, 25 Jan 2013 05:44:43 +0000 (05:44 +0000)
The ABI incompatibility is bad when

- Build glog without gflags (glog package in most distributions doesn't
  depend on gflags)
- Use both glog and gflags

git-svn-id: https://google-glog.googlecode.com/svn/trunk@125 eb4d4688-79bd-11dd-afb4-1d65580434c0

src/base/commandlineflags.h
src/glog/logging.h.in
src/windows/glog/logging.h

index 53d9485..c8d5089 100644 (file)
 
 #include "glog/logging.h"
 
-#define DECLARE_VARIABLE(type, name, tn)                                      \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \
-  extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                              \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name
-#define DEFINE_VARIABLE(type, name, value, meaning, tn) \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \
-  GOOGLE_GLOG_DLL_DECL type FLAGS_##name(value);                              \
-  char FLAGS_no##name;                                                        \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name
+#define DECLARE_VARIABLE(type, shorttype, name, tn)                     \
+  namespace fL##shorttype {                                             \
+    extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                      \
+  }                                                                     \
+  using fL##shorttype::FLAGS_##name
+#define DEFINE_VARIABLE(type, shorttype, name, value, meaning, tn)      \
+  namespace fL##shorttype {                                             \
+    GOOGLE_GLOG_DLL_DECL type FLAGS_##name(value);                      \
+    char FLAGS_no##name;                                                \
+  }                                                                     \
+  using fL##shorttype::FLAGS_##name
 
 // bool specialization
 #define DECLARE_bool(name) \
-  DECLARE_VARIABLE(bool, name, bool)
+  DECLARE_VARIABLE(bool, B, name, bool)
 #define DEFINE_bool(name, value, meaning) \
-  DEFINE_VARIABLE(bool, name, value, meaning, bool)
+  DEFINE_VARIABLE(bool, B, name, value, meaning, bool)
 
 // int32 specialization
 #define DECLARE_int32(name) \
-  DECLARE_VARIABLE(GOOGLE_NAMESPACE::int32, name, int32)
+  DECLARE_VARIABLE(GOOGLE_NAMESPACE::int32, I, name, int32)
 #define DEFINE_int32(name, value, meaning) \
-  DEFINE_VARIABLE(GOOGLE_NAMESPACE::int32, name, value, meaning, int32)
+  DEFINE_VARIABLE(GOOGLE_NAMESPACE::int32, I, name, value, meaning, int32)
 
 // Special case for string, because we have to specify the namespace
 // std::string, which doesn't play nicely with our FLAG__namespace hackery.
-#define DECLARE_string(name)                                          \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \
-  extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name;                       \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name
-#define DEFINE_string(name, value, meaning)                                   \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \
-  GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name(value);                       \
-  char FLAGS_no##name;                                                        \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name
+#define DECLARE_string(name)                                            \
+  namespace fLS {                                                       \
+    extern GOOGLE_GLOG_DLL_DECL std::string& FLAGS_##name;              \
+  }                                                                     \
+  using fLS::FLAGS_##name
+#define DEFINE_string(name, value, meaning)                             \
+  namespace fLS {                                                       \
+    std::string FLAGS_##name##_buf(value);                              \
+    GOOGLE_GLOG_DLL_DECL std::string& FLAGS_##name = FLAGS_##name##_buf; \
+    char FLAGS_no##name;                                                \
+  }                                                                     \
+  using fLS::FLAGS_##name
 
 #endif  // HAVE_LIB_GFLAGS
 
index 21f322e..6939e4b 100644 (file)
@@ -293,27 +293,27 @@ typedef unsigned __int64 uint64;
 
 #ifndef DECLARE_VARIABLE
 #define MUST_UNDEF_GFLAGS_DECLARE_MACROS
-#define DECLARE_VARIABLE(type, name, tn)                                      \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \
-  extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                              \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name
+#define DECLARE_VARIABLE(type, shorttype, name, tn)                     \
+  namespace fL##shorttype {                                             \
+    extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                      \
+  }                                                                     \
+  using fL##shorttype::FLAGS_##name
 
 // bool specialization
 #define DECLARE_bool(name) \
-  DECLARE_VARIABLE(bool, name, bool)
+  DECLARE_VARIABLE(bool, B, name, bool)
 
 // int32 specialization
 #define DECLARE_int32(name) \
-  DECLARE_VARIABLE(@ac_google_namespace@::int32, name, int32)
+  DECLARE_VARIABLE(@ac_google_namespace@::int32, I, name, int32)
 
 // Special case for string, because we have to specify the namespace
 // std::string, which doesn't play nicely with our FLAG__namespace hackery.
-#define DECLARE_string(name)                                          \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \
-  extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name;                       \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name
+#define DECLARE_string(name)                                            \
+  namespace fLS {                                                       \
+    extern GOOGLE_GLOG_DLL_DECL std::string& FLAGS_##name;              \
+  }                                                                     \
+  using fLS::FLAGS_##name
 #endif
 
 // Set whether log messages go to stderr instead of logfiles
index 8c585bc..ce7e646 100755 (executable)
@@ -297,27 +297,27 @@ typedef unsigned __int64 uint64;
 
 #ifndef DECLARE_VARIABLE
 #define MUST_UNDEF_GFLAGS_DECLARE_MACROS
-#define DECLARE_VARIABLE(type, name, tn)                                      \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \
-  extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                              \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name
+#define DECLARE_VARIABLE(type, shorttype, name, tn)                     \
+  namespace fL##shorttype {                                             \
+    extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                      \
+  }                                                                     \
+  using fL##shorttype::FLAGS_##name
 
 // bool specialization
 #define DECLARE_bool(name) \
-  DECLARE_VARIABLE(bool, name, bool)
+  DECLARE_VARIABLE(bool, B, name, bool)
 
 // int32 specialization
 #define DECLARE_int32(name) \
-  DECLARE_VARIABLE(google::int32, name, int32)
+  DECLARE_VARIABLE(google::int32, I, name, int32)
 
 // Special case for string, because we have to specify the namespace
 // std::string, which doesn't play nicely with our FLAG__namespace hackery.
-#define DECLARE_string(name)                                          \
-  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \
-  extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name;                       \
-  }                                                                           \
-  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name
+#define DECLARE_string(name)                                            \
+  namespace fLS {                                                       \
+    extern GOOGLE_GLOG_DLL_DECL std::string& FLAGS_##name;              \
+  }                                                                     \
+  using fLS::FLAGS_##name
 #endif
 
 // Set whether log messages go to stderr instead of logfiles