From f48dca504443c17c2bf86104754c405b503073cc Mon Sep 17 00:00:00 2001 From: Jisi Liu Date: Fri, 12 Jun 2015 15:49:21 -0700 Subject: Make pbconfig.h independent of config.h Change-Id: I31ead985b4ac5b02fb7558d34c1da19fd837b50a --- .gitignore | 1 - src/Makefile.am | 21 +----- src/google/protobuf/stubs/pbconfig.h | 142 +++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 19 deletions(-) create mode 100644 src/google/protobuf/stubs/pbconfig.h diff --git a/.gitignore b/.gitignore index 8ea85af0..52c92dfb 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,6 @@ src/Makefile /config.h config.log config.status -pbconfig.h libtool protobuf-lite.pc diff --git a/src/Makefile.am b/src/Makefile.am index 6affcbf4..c3e22327 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -41,24 +41,12 @@ nobase_dist_proto_DATA = google/protobuf/descriptor.proto \ clean-local: rm -f *.loT -public_config = google/protobuf/stubs/pbconfig.h - -CLEANFILES = $(protoc_outputs) $(public_config) unittest_proto_middleman \ +CLEANFILES = $(protoc_outputs) unittest_proto_middleman \ testzip.jar testzip.list testzip.proto testzip.zip MAINTAINERCLEANFILES = \ Makefile.in -# Generate and distribute a minimum config.h file to make hash_map work. -# The autoheader config has too much info, which might conflict with other -# macros applications might include. Thus, we create a stubs/pbconfig.h, that -# only #defines what we really need, and prefix it with GOOGLE_PROTOBUF_ to -# avoid conflicts. -$(public_config): $(top_builddir)/config.h $(top_srcdir)/config.h.include - echo "// Note: Google Protobuf internal only. Do NOT include." > $@ - cat $(top_builddir)/config.h | grep -f $(top_srcdir)/config.h.include | \ - sed 's,#define , #define GOOGLE_PROTOBUF_,' >> $@ - nobase_include_HEADERS = \ google/protobuf/stubs/atomic_sequence_num.h \ google/protobuf/stubs/atomicops.h \ @@ -80,6 +68,7 @@ nobase_include_HEADERS = \ google/protobuf/stubs/fastmem.h \ google/protobuf/stubs/hash.h \ google/protobuf/stubs/once.h \ + google/protobuf/stubs/pbconfig.h \ google/protobuf/stubs/platform_macros.h \ google/protobuf/stubs/shared_ptr.h \ google/protobuf/stubs/singleton.h \ @@ -152,9 +141,6 @@ nobase_include_HEADERS = \ google/protobuf/compiler/ruby/ruby_generator.h \ google/protobuf/compiler/csharp/csharp_generator.h -nobase_nodist_include_HEADERS = \ - $(public_config) - lib_LTLIBRARIES = libprotobuf-lite.la libprotobuf.la libprotoc.la libprotobuf_lite_la_LIBADD = $(PTHREAD_LIBS) @@ -180,7 +166,6 @@ libprotobuf_lite_la_SOURCES = \ google/protobuf/io/coded_stream_inl.h \ google/protobuf/io/zero_copy_stream.cc \ google/protobuf/io/zero_copy_stream_impl_lite.cc -nodist_libprotobuf_lite_la_SOURCES = $(public_config) libprotobuf_la_LIBADD = $(PTHREAD_LIBS) libprotobuf_la_LDFLAGS = -version-info 10:0:0 -export-dynamic -no-undefined @@ -517,7 +502,7 @@ protoc_outputs = \ google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.cc \ google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h -BUILT_SOURCES = $(public_config) $(protoc_outputs) +BUILT_SOURCES = $(protoc_outputs) if USE_EXTERNAL_PROTOC diff --git a/src/google/protobuf/stubs/pbconfig.h b/src/google/protobuf/stubs/pbconfig.h new file mode 100644 index 00000000..0f21c560 --- /dev/null +++ b/src/google/protobuf/stubs/pbconfig.h @@ -0,0 +1,142 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_PROTOBUF_STUBS_PBCONFIG_H__ +#define GOOGLE_PROTOBUF_STUBS_PBCONFIG_H__ + +#define GOOGLE_PROTOBUF_HAVE_HASH_MAP 1 +#define GOOGLE_PROTOBUF_HAVE_HASH_SET 1 + +// Use C++11 unordered_{map|set} if available. +#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X) +# define GOOGLE_PROTOBUF_HAS_CXX11_HASH + +// For XCode >= 4.6: the compiler is clang with libc++. +// For earlier XCode version: the compiler is gcc-4.2.1 with libstdc++. +// libc++ provides and friends even in non C++11 mode, +// and it does not provide the tr1 library. Therefore the following macro +// checks against this special case. +// Note that we should not test the __APPLE_CC__ version number or the +// __clang__ macro, since the new compiler can still use -stdlib=libstdc++, in +// which case is not compilable without -std=c++11 +#elif defined(__APPLE_CC__) +# if defined(_LIBCPP_VERSION) +# define GOOGLE_PROTOBUF_HAS_CXX11_HASH +# elif __GNUC__ >= 4 +# define GOOGLE_PROTOBUF_HAS_TR1 +# else +// Not tested for gcc < 4... These setting can compile under 4.2.1 though. +# define GOOGLE_PROTOBUF_HASH_NAMESPACE __gnu_cxx +# define GOOGLE_PROTOBUF_HASH_MAP_H +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map +# define GOOGLE_PROTOBUF_HASH_SET_H +# define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set +# endif + +// Version checks for gcc. +#elif defined(__GNUC__) +// For GCC 4.x+, use tr1::unordered_map/set; otherwise, follow the +// instructions from: +// https://gcc.gnu.org/onlinedocs/libstdc++/manual/backwards.html +# if __GNUC__ >= 4 +# define GOOGLE_PROTOBUF_HAS_TR1 +# elif __GNUC__ >= 3 +# define GOOGLE_PROTOBUF_HASH_MAP_H +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map +# define GOOGLE_PROTOBUF_HASH_SET_H +# define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set +# if __GNUC__ == 3 && __GNUC_MINOR__ == 0 +# define GOOGLE_PROTOBUF_HASH_NAMESPACE std // GCC 3.0 +# else +# define GOOGLE_PROTOBUF_HASH_NAMESPACE __gnu_cxx // GCC 3.1 and later +# endif +# else +# define GOOGLE_PROTOBUF_HASH_NAMESPACE +# define GOOGLE_PROTOBUF_HASH_MAP_H +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map +# define GOOGLE_PROTOBUF_HASH_SET_H +# define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set +# endif + +// Version checks for MSC. +// Apparently Microsoft decided to move hash_map *back* to the std namespace in +// MSVC 2010: +// http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx +// And.. they are moved back to stdext in MSVC 2013 (haven't checked 2012). That +// said, use unordered_map for MSVC 2010 and beyond is our safest bet. +#elif defined(_MSC_VER) +# if _MSC_VER >= 1600 // Since Visual Studio 2010 +# define GOOGLE_PROTOBUF_HAS_CXX11_HASH +# define GOOGLE_PROTOBUF_HASH_COMPARE std::hash_compare +# elif _MSC_VER >= 1500 // Since Visual Studio 2008 +# define GOOGLE_PROTOBUF_HAS_TR1 +# define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare +# elif _MSC_VER >= 1310 +# define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext +# define GOOGLE_PROTOBUF_HASH_MAP_H +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map +# define GOOGLE_PROTOBUF_HASH_SET_H +# define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set +# define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare +# else +# define GOOGLE_PROTOBUF_HASH_NAMESPACE std +# define GOOGLE_PROTOBUF_HASH_MAP_H +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map +# define GOOGLE_PROTOBUF_HASH_SET_H +# define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set +# define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare +# endif + +// **ADD NEW COMPILERS SUPPORT HERE.** +// For other compilers, undefine the macro and fallback to use std::map, in +// google/protobuf/stubs/hash.h +#else +# undef GOOGLE_PROTOBUF_HAVE_HASH_MAP +# undef GOOGLE_PROTOBUF_HAVE_HASH_SET +#endif + +#if defined(GOOGLE_PROTOBUF_HAS_CXX11_HASH) +# define GOOGLE_PROTOBUF_HASH_NAMESPACE std +# define GOOGLE_PROTOBUF_HASH_MAP_H +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS unordered_map +# define GOOGLE_PROTOBUF_HASH_SET_H +# define GOOGLE_PROTOBUF_HASH_SET_CLASS unordered_set +#elif defined(GOOGLE_PROTOBUF_HAS_TR1) +# define GOOGLE_PROTOBUF_HASH_NAMESPACE std::tr1 +# define GOOGLE_PROTOBUF_HASH_MAP_H +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS unordered_map +# define GOOGLE_PROTOBUF_HASH_SET_H +# define GOOGLE_PROTOBUF_HASH_SET_CLASS unordered_set +#endif + +#undef GOOGLE_PROTOBUF_HAS_CXX11_HASH +#undef GOOGLE_PROTOBUF_HAS_TR1 + +#endif // GOOGLE_PROTOBUF_STUBS_PBCONFIG_H__ -- cgit v1.2.3