Index: third_party/protobuf/patches/03_componentize_protobuf_lite.patch |
diff --git a/third_party/protobuf/patches/03_componentize_protobuf_lite.patch b/third_party/protobuf/patches/03_componentize_protobuf_lite.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dc5f77ddb4e558aa3eb331e42852d398316d1566 |
--- /dev/null |
+++ b/third_party/protobuf/patches/03_componentize_protobuf_lite.patch |
@@ -0,0 +1,253 @@ |
+diff --git a/third_party/protobuf/BUILD.gn b/third_party/protobuf/BUILD.gn |
+index aaeae89..bcfdca1 100644 |
+--- a/third_party/protobuf/BUILD.gn |
++++ b/third_party/protobuf/BUILD.gn |
+@@ -18,6 +18,12 @@ config("protobuf_config") { |
+ } |
+ } |
+ |
++if (is_component_build) { |
++ config("protobuf_use_dlls") { |
++ defines = [ "PROTOBUF_USE_DLLS" ] |
++ } |
++} |
++ |
+ # This config should be applied to targets using generated code from the proto |
+ # compiler. It sets up the include directories properly. |
+ config("using_proto") { |
+@@ -50,6 +56,7 @@ protobuf_lite_sources = [ |
+ "src/google/protobuf/message.h", |
+ "src/google/protobuf/message_lite.cc", |
+ "src/google/protobuf/message_lite.h", |
++ "src/google/protobuf/metadata.cc", |
+ "src/google/protobuf/metadata.h", |
+ "src/google/protobuf/repeated_field.cc", |
+ "src/google/protobuf/repeated_field.h", |
+@@ -125,7 +132,7 @@ if (is_win) { |
+ ] |
+ } |
+ |
+-source_set("protobuf_lite") { |
++component("protobuf_lite") { |
+ sources = protobuf_lite_sources |
+ |
+ configs -= [ "//build/config/compiler:chromium_code" ] |
+@@ -141,6 +148,12 @@ source_set("protobuf_lite") { |
+ ] |
+ |
+ cflags = protobuf_lite_cflags |
++ |
++ # Required for component builds. See http://crbug.com/172800. |
++ if (is_component_build) { |
++ public_configs += [ ":protobuf_use_dlls" ] |
++ defines = [ "LIBPROTOBUF_EXPORTS" ] |
++ } |
+ } |
+ |
+ # This is the full, heavy protobuf lib that's needed for c++ .protos that don't |
+@@ -151,7 +164,8 @@ source_set("protobuf_full") { |
+ # Prevent people from depending on this outside our file. |
+ visibility = [ ":*" ] |
+ |
+- sources = [ |
++ sources = protobuf_lite_sources |
++ sources += [ |
+ "src/google/protobuf/any.cc", |
+ "src/google/protobuf/any.h", |
+ "src/google/protobuf/any.pb.cc", |
+@@ -281,10 +295,6 @@ source_set("protobuf_full") { |
+ ] |
+ |
+ cflags = protobuf_lite_cflags |
+- |
+- deps = [ |
+- ":protobuf_lite", |
+- ] |
+ } |
+ |
+ # Only compile the compiler for the host architecture. |
+diff --git a/third_party/protobuf/README.chromium b/third_party/protobuf/README.chromium |
+index aa428ad..04d1a9b 100644 |
+--- a/third_party/protobuf/README.chromium |
++++ b/third_party/protobuf/README.chromium |
+@@ -28,6 +28,7 @@ Steps used to create the current version: |
+ patch and rebuild protoc; look at step (3) below and the |
+ generate_descriptor_proto.sh script in the protobuf root directory for a |
+ guide. Based on http://crrev.com/62331 and http://crrev.com/173228 . |
++ 03: Convert protobuf_lite to a component. Based on http://crrev.com/179806 . |
+ (3) Generate descriptor_pb2.py using something like the following steps. Make |
+ sure you've regenerated your buildfiles and will build protoc from the |
+ newly-modified sources above. |
+diff --git a/third_party/protobuf/protobuf.gyp b/third_party/protobuf/protobuf.gyp |
+index 9fba350..c7aab98 100644 |
+--- a/third_party/protobuf/protobuf.gyp |
++++ b/third_party/protobuf/protobuf.gyp |
+@@ -94,11 +94,21 @@ |
+ # to your .proto file. |
+ { |
+ 'target_name': 'protobuf_lite', |
+- 'type': 'static_library', |
++ 'type': '<(component)', |
+ 'toolsets': ['host', 'target'], |
+ 'includes': [ |
+ 'protobuf_lite.gypi', |
+ ], |
++ # Required for component builds. See http://crbug.com/172800. |
++ 'defines': [ |
++ 'LIBPROTOBUF_EXPORTS', |
++ 'PROTOBUF_USE_DLLS', |
++ ], |
++ 'direct_dependent_settings': { |
++ 'defines': [ |
++ 'PROTOBUF_USE_DLLS', |
++ ], |
++ }, |
+ }, |
+ # This is the full, heavy protobuf lib that's needed for c++ .protos |
+ # that don't specify the LITE_RUNTIME option. The protocol |
+@@ -109,6 +119,9 @@ |
+ 'target_name': 'protobuf_full_do_not_use', |
+ 'type': 'static_library', |
+ 'toolsets': ['host','target'], |
++ 'includes': [ |
++ 'protobuf_lite.gypi', |
++ ], |
+ 'sources': [ |
+ 'src/google/protobuf/any.cc', |
+ 'src/google/protobuf/any.h', |
+@@ -224,12 +237,6 @@ |
+ 'src/google/protobuf/wrappers.pb.cc', |
+ 'src/google/protobuf/wrappers.pb.h', |
+ ], |
+- 'dependencies': [ |
+- 'protobuf_lite', |
+- ], |
+- 'export_dependent_settings': [ |
+- 'protobuf_lite', |
+- ], |
+ }, |
+ { |
+ 'target_name': 'protoc', |
+diff --git a/third_party/protobuf/protobuf_lite.gypi b/third_party/protobuf/protobuf_lite.gypi |
+index 6415ab2..4d7007a 100644 |
+--- a/third_party/protobuf/protobuf_lite.gypi |
++++ b/third_party/protobuf/protobuf_lite.gypi |
+@@ -26,6 +26,7 @@ |
+ 'src/google/protobuf/message.h', |
+ 'src/google/protobuf/message_lite.cc', |
+ 'src/google/protobuf/message_lite.h', |
++ 'src/google/protobuf/metadata.cc', |
+ 'src/google/protobuf/metadata.h', |
+ 'src/google/protobuf/repeated_field.cc', |
+ 'src/google/protobuf/repeated_field.h', |
+diff --git a/third_party/protobuf/src/google/protobuf/metadata.cc b/third_party/protobuf/src/google/protobuf/metadata.cc |
+new file mode 100644 |
+index 0000000..99d2cf9 |
+--- /dev/null |
++++ b/third_party/protobuf/src/google/protobuf/metadata.cc |
+@@ -0,0 +1,42 @@ |
++// Protocol Buffers - Google's data interchange format |
++// Copyright 2015 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. |
++ |
++#include <google/protobuf/metadata.h> |
++ |
++namespace google { |
++namespace protobuf { |
++namespace internal { |
++ |
++InternalMetadataWithArena::InternalMetadataWithArena(Arena* arena) |
++ : ptr_ (arena) {} |
++ |
++} // namespace internal |
++} // namespace protobuf |
++} // namespace google |
+diff --git a/third_party/protobuf/src/google/protobuf/metadata.h b/third_party/protobuf/src/google/protobuf/metadata.h |
+index 30b2a6e..85065f0 100644 |
+--- a/third_party/protobuf/src/google/protobuf/metadata.h |
++++ b/third_party/protobuf/src/google/protobuf/metadata.h |
+@@ -59,8 +59,7 @@ namespace internal { |
+ class LIBPROTOBUF_EXPORT InternalMetadataWithArena { |
+ public: |
+ InternalMetadataWithArena() : ptr_(NULL) {} |
+- explicit InternalMetadataWithArena(Arena* arena) |
+- : ptr_ (arena) {} |
++ explicit InternalMetadataWithArena(Arena* arena); |
+ |
+ ~InternalMetadataWithArena() { |
+ if (have_unknown_fields() && arena() == NULL) { |
+diff --git a/third_party/protobuf/src/google/protobuf/stubs/port.h b/third_party/protobuf/src/google/protobuf/stubs/port.h |
+index da695ff..a9f5fd9 100644 |
+--- a/third_party/protobuf/src/google/protobuf/stubs/port.h |
++++ b/third_party/protobuf/src/google/protobuf/stubs/port.h |
+@@ -63,18 +63,33 @@ |
+ #define PROTOBUF_LITTLE_ENDIAN 1 |
+ #endif |
+ #endif |
+-#if defined(_MSC_VER) && defined(PROTOBUF_USE_DLLS) |
+- #ifdef LIBPROTOBUF_EXPORTS |
+- #define LIBPROTOBUF_EXPORT __declspec(dllexport) |
+- #else |
+- #define LIBPROTOBUF_EXPORT __declspec(dllimport) |
++// The macros defined below are required in order to make protobuf_lite a |
++// component on all platforms. See http://crbug.com/172800. |
++#if defined(COMPONENT_BUILD) && defined(PROTOBUF_USE_DLLS) |
++ #if defined(_MSC_VER) |
++ #ifdef LIBPROTOBUF_EXPORTS |
++ #define LIBPROTOBUF_EXPORT __declspec(dllexport) |
++ #else |
++ #define LIBPROTOBUF_EXPORT __declspec(dllimport) |
++ #endif |
++ #ifdef LIBPROTOC_EXPORTS |
++ #define LIBPROTOC_EXPORT __declspec(dllexport) |
++ #else |
++ #define LIBPROTOC_EXPORT __declspec(dllimport) |
++ #endif |
++ #else // defined(_MSC_VER) |
++ #ifdef LIBPROTOBUF_EXPORTS |
++ #define LIBPROTOBUF_EXPORT __attribute__((visibility("default"))) |
++ #else |
++ #define LIBPROTOBUF_EXPORT |
++ #endif |
++ #ifdef LIBPROTOC_EXPORTS |
++ #define LIBPROTOC_EXPORT __attribute__((visibility("default"))) |
++ #else |
++ #define LIBPROTOC_EXPORT |
++ #endif |
+ #endif |
+- #ifdef LIBPROTOC_EXPORTS |
+- #define LIBPROTOC_EXPORT __declspec(dllexport) |
+- #else |
+- #define LIBPROTOC_EXPORT __declspec(dllimport) |
+- #endif |
+-#else |
++#else // defined(COMPONENT_BUILD) && defined(PROTOBUF_USE_DLLS) |
+ #define LIBPROTOBUF_EXPORT |
+ #define LIBPROTOC_EXPORT |
+ #endif |