Преглед на файлове

Merge pull request #1029 from keveman/master

Enable fast cpp protos in the python interface.
Joshua Haberman преди 9 години
родител
ревизия
014b9012d3

+ 58 - 7
BUILD

@@ -54,9 +54,9 @@ cc_library(
         "src/google/protobuf/stubs/time.cc",
         "src/google/protobuf/wire_format_lite.cc",
     ],
+    hdrs = glob(["src/google/protobuf/**/*.h"]),
     copts = COPTS,
     includes = ["src/"],
-    hdrs = glob(["src/google/protobuf/**/*.h"]),
     linkopts = LINK_OPTS,
     visibility = ["//visibility:public"],
 )
@@ -156,9 +156,9 @@ cc_proto_library(
     name = "cc_wkt_protos",
     srcs = WELL_KNOWN_PROTOS,
     include = "src",
+    default_runtime = ":protobuf",
     internal_bootstrap_hack = 1,
     protoc = ":protoc",
-    default_runtime = ":protobuf",
     visibility = ["//visibility:public"],
 )
 
@@ -336,8 +336,8 @@ cc_proto_library(
     name = "cc_test_protos",
     srcs = LITE_TEST_PROTOS + TEST_PROTOS,
     include = "src",
-    protoc = ":protoc",
     default_runtime = ":protobuf",
+    protoc = ":protoc",
     deps = [":cc_wkt_protos"],
 )
 
@@ -509,15 +509,66 @@ internal_copied_filegroup(
     include = "python",
 )
 
+cc_binary(
+    name = "internal/_api_implementation.so",
+    srcs = ["python/google/protobuf/internal/api_implementation.cc"],
+    copts = COPTS + [
+        "-DPYTHON_PROTO2_CPP_IMPL_V2",
+    ],
+    linkshared = 1,
+    linkstatic = 1,
+    deps = select({
+        "//conditions:default": [],
+        ":use_fast_cpp_protos": ["//util/python:python_headers"],
+    }),
+)
+
+cc_binary(
+    name = "pyext/_message.so",
+    srcs = glob([
+        "python/google/protobuf/pyext/*.cc",
+        "python/google/protobuf/pyext/*.h",
+    ]),
+    copts = COPTS + [
+        "-DGOOGLE_PROTOBUF_HAS_ONEOF=1",
+    ],
+    includes = [
+        "python/",
+        "src/",
+    ],
+    linkshared = 1,
+    linkstatic = 1,
+    deps = [
+        ":protobuf",
+    ] + select({
+        "//conditions:default": [],
+        ":use_fast_cpp_protos": ["//util/python:python_headers"],
+    }),
+)
+
+config_setting(
+    name = "use_fast_cpp_protos",
+    values = {
+        "define": "use_fast_cpp_protos=true",
+    },
+)
+
 py_proto_library(
     name = "protobuf_python",
     srcs = WELL_KNOWN_PROTOS,
-    srcs_version = "PY2AND3",
     include = "src",
+    data = select({
+        "//conditions:default": [],
+        ":use_fast_cpp_protos": [
+            ":internal/_api_implementation.so",
+            ":pyext/_message.so",
+        ],
+    }),
+    default_runtime = "",
     protoc = ":protoc",
     py_extra_srcs = [":python_srcs"],
     py_libs = ["//external:six"],
-    default_runtime = "",
+    srcs_version = "PY2AND3",
     visibility = ["//visibility:public"],
 )
 
@@ -536,9 +587,9 @@ py_proto_library(
     name = "python_common_test_protos",
     srcs = LITE_TEST_PROTOS + TEST_PROTOS,
     include = "src",
+    default_runtime = "",
     protoc = ":protoc",
     deps = [":protobuf_python"],
-    default_runtime = "",
 )
 
 py_proto_library(
@@ -548,9 +599,9 @@ py_proto_library(
         "python/google/protobuf/internal/import_test_package/*.proto",
     ]),
     include = "python",
+    default_runtime = ":protobuf_python",
     protoc = ":protoc",
     deps = [":python_common_test_protos"],
-    default_runtime = ":protobuf_python",
 )
 
 py_library(

+ 4 - 0
python/google/protobuf/pyext/extension_dict.h

@@ -47,7 +47,11 @@ namespace protobuf {
 class Message;
 class FieldDescriptor;
 
+#ifdef _SHARED_PTR_H
+using std::shared_ptr;
+#else
 using internal::shared_ptr;
+#endif
 
 namespace python {
 

+ 5 - 0
python/google/protobuf/pyext/message.h

@@ -52,7 +52,12 @@ class Descriptor;
 class DescriptorPool;
 class MessageFactory;
 
+#ifdef _SHARED_PTR_H
+using std::shared_ptr;
+using std::string;
+#else
 using internal::shared_ptr;
+#endif
 
 namespace python {
 

+ 4 - 0
python/google/protobuf/pyext/message_map_container.h

@@ -45,7 +45,11 @@ namespace protobuf {
 
 class Message;
 
+#ifdef _SHARED_PTR_H
+using std::shared_ptr;
+#else
 using internal::shared_ptr;
+#endif
 
 namespace python {
 

+ 4 - 0
python/google/protobuf/pyext/repeated_composite_container.h

@@ -49,7 +49,11 @@ namespace protobuf {
 class FieldDescriptor;
 class Message;
 
+#ifdef _SHARED_PTR_H
+using std::shared_ptr;
+#else
 using internal::shared_ptr;
+#endif
 
 namespace python {
 

+ 4 - 0
python/google/protobuf/pyext/repeated_scalar_container.h

@@ -48,7 +48,11 @@ namespace protobuf {
 
 class Message;
 
+#ifdef _SHARED_PTR_H
+using std::shared_ptr;
+#else
 using internal::shared_ptr;
+#endif
 
 namespace python {
 

+ 4 - 0
python/google/protobuf/pyext/scalar_map_container.h

@@ -45,7 +45,11 @@ namespace protobuf {
 
 class Message;
 
+#ifdef _SHARED_PTR_H
+using std::shared_ptr;
+#else
 using internal::shared_ptr;
+#endif
 
 namespace python {
 

+ 8 - 0
util/python/BUILD

@@ -0,0 +1,8 @@
+# This is a placeholder for python headers. Projects needing to use
+# fast cpp protos in protobuf's python interface should build with
+# --define=use_fast_cpp_protos=true, and in addition, provide
+# //util/python:python_headers dependency that in turn provides Python.h.
+cc_library(
+    name = "python_headers",
+    visibility = ["//visibility:public"],
+)