From c4c25e85fda3579ffdd8b10ffa8742c4bb5275e2 Mon Sep 17 00:00:00 2001 From: Date: Fri, 25 Jan 2013 05:44:43 +0000 Subject: [PATCH] Make glog ABI compatible with gflags 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 | 53 +++++++++++++++++++++++---------------------- src/glog/logging.h.in | 24 ++++++++++---------- src/windows/glog/logging.h | 24 ++++++++++---------- 3 files changed, 51 insertions(+), 50 deletions(-) diff --git a/src/base/commandlineflags.h b/src/base/commandlineflags.h index 53d9485..c8d5089 100644 --- a/src/base/commandlineflags.h +++ b/src/base/commandlineflags.h @@ -61,43 +61,44 @@ #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 diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in index 21f322e..6939e4b 100644 --- a/src/glog/logging.h.in +++ b/src/glog/logging.h.in @@ -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 diff --git a/src/windows/glog/logging.h b/src/windows/glog/logging.h index 8c585bc..ce7e646 100755 --- a/src/windows/glog/logging.h +++ b/src/windows/glog/logging.h @@ -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 -- 2.7.4