From 993fb7013e0139ec7b16abcada7995f3a642e331 Mon Sep 17 00:00:00 2001 From: Jisi Liu Date: Mon, 19 Oct 2015 17:19:49 -0700 Subject: Python bazel support. --- BUILD | 149 +++++++++++++++++++++++++++++++++++++++++++++++------------ protobuf.bzl | 99 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 214 insertions(+), 34 deletions(-) diff --git a/BUILD b/BUILD index 69ea6cf3..465628fa 100644 --- a/BUILD +++ b/BUILD @@ -18,7 +18,8 @@ COPTS = [ # Bazel should provide portable link_opts for pthread. LINK_OPTS = ["-lpthread"] -load("protobuf", "cc_proto_library") +load("protobuf", "cc_proto_library", "py_proto_library", "copied_srcs", + "internal_protobuf_py_tests") cc_library( name = "protobuf_lite", @@ -126,7 +127,7 @@ objc_library( visibility = ["//visibility:public"], ) -WELL_KNOWN_PROTOS = [ +RELATIVE_WELL_KNOWN_PROTOS = [ # AUTOGEN(well_known_protos) "google/protobuf/any.proto", "google/protobuf/api.proto", @@ -142,12 +143,14 @@ WELL_KNOWN_PROTOS = [ "google/protobuf/wrappers.proto", ] +WELL_KNOWN_PROTOS = ["src/" + s for s in RELATIVE_WELL_KNOWN_PROTOS] + cc_proto_library( name = "cc_wkt_protos", - srcs = ["src/" + s for s in WELL_KNOWN_PROTOS], - internal_bootstrap_hack = 1, + srcs = WELL_KNOWN_PROTOS, include = "src", cc_libs = [":protobuf"], + internal_bootstrap_hack = 1, ) ################################################################################ @@ -263,32 +266,11 @@ cc_binary( deps = [":protoc_lib"], ) -################################################################################ -# Java support -################################################################################ -genrule( - name = "generate_java_descriptor_proto", - srcs = ["src/google/protobuf/descriptor.proto"], - outs = ["com/google/protobuf/DescriptorProtos.java"], - cmd = "$(location :protoc) --java_out=$(@D)/../../.. $<", - tools = [":protoc"], -) - -java_library( - name = "java_proto", - srcs = glob([ - "java/src/main/java/com/google/protobuf/*.java", - ]) + [ - ":generate_java_descriptor_proto", - ], - visibility = ["//visibility:public"], -) - ################################################################################ # Tests ################################################################################ -LITE_TEST_PROTOS = [ +RELATIVE_LITE_TEST_PROTOS = [ # AUTOGEN(lite_test_protos) "google/protobuf/map_lite_unittest.proto", "google/protobuf/unittest_import_lite.proto", @@ -297,7 +279,9 @@ LITE_TEST_PROTOS = [ "google/protobuf/unittest_no_arena_lite.proto", ] -TEST_PROTOS = [ +LITE_TEST_PROTOS = ["src/" + s for s in RELATIVE_LITE_TEST_PROTOS] + +RELATIVE_TEST_PROTOS = [ # AUTOGEN(test_protos) "google/protobuf/any_test.proto", "google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto", @@ -337,9 +321,11 @@ TEST_PROTOS = [ "google/protobuf/util/json_format_proto3.proto", ] +TEST_PROTOS = ["src/" + s for s in RELATIVE_TEST_PROTOS] + cc_proto_library( name = "cc_test_protos", - srcs = ["src/" + s for s in (LITE_TEST_PROTOS + TEST_PROTOS)], + srcs = LITE_TEST_PROTOS + TEST_PROTOS, include = "src", deps = [":cc_wkt_protos"], ) @@ -445,9 +431,114 @@ cc_test( ], linkopts = LINK_OPTS, deps = [ + ":cc_test_protos", ":protobuf", ":protoc_lib", - ":cc_test_protos", "//external:gtest_main", ], ) + +################################################################################ +# Java support +################################################################################ +genrule( + name = "generate_java_descriptor_proto", + srcs = ["src/google/protobuf/descriptor.proto"], + outs = ["com/google/protobuf/DescriptorProtos.java"], + cmd = "$(location :protoc) --java_out=$(@D)/../../.. $<", + tools = [":protoc"], +) + +java_library( + name = "java_proto", + srcs = glob([ + "java/src/main/java/com/google/protobuf/*.java", + ]) + [ + ":generate_java_descriptor_proto", + ], + visibility = ["//visibility:public"], +) + +################################################################################ +# Python support +################################################################################ + +copied_srcs( + name = "python_srcs", + srcs = glob( + [ + "python/google/protobuf/*.py", + "python/google/protobuf/**/*.py", + ], + exclude = [ + "python/google/protobuf/internal/*_test.py", + "python/google/protobuf/internal/test_util.py", + ], + ), + include = "python", +) + +py_proto_library( + name = "python_proto", + srcs = WELL_KNOWN_PROTOS, + include = "src", + py_extra_srcs = [":python_srcs"], + visibility = ["//visibility:public"], +) + +copied_srcs( + name = "python_test_srcs", + srcs = glob( + [ + "python/google/protobuf/internal/*_test.py", + "python/google/protobuf/internal/test_util.py", + ], + ), + include = "python", +) + +py_proto_library( + name = "python_common_test_protos", + srcs = LITE_TEST_PROTOS + TEST_PROTOS, + include = "src", + deps = [":python_proto"], +) + +py_proto_library( + name = "python_specific_test_protos", + srcs = glob(["python/google/protobuf/internal/*.proto"]), + include = "python", + deps = [":python_common_test_protos"], +) + +py_library( + name = "python_tests", + srcs = [":python_test_srcs"], + deps = [ + ":python_common_test_protos", + ":python_proto", + ":python_specific_test_protos", + ], +) + +internal_protobuf_py_tests( + name = "python_tests", + modules = [ + "descriptor_database_test", + "descriptor_pool_test", + "descriptor_test", + "generator_test", + "json_format_test", + "message_factory_test", + # "message_test", # failed due to testdata path + "proto_builder_test", + # "reflection_test", # failed due to testdata path + "service_reflection_test", + "symbol_database_test", + "text_encoding_test", + # "text_format_test", # failed due to testdata path + "unknown_fields_test", + "wire_format_test", + ], + deps = [":python_tests"], +) diff --git a/protobuf.bzl b/protobuf.bzl index b83f7f5a..87aed9c8 100644 --- a/protobuf.bzl +++ b/protobuf.bzl @@ -1,6 +1,6 @@ # -*- mode: python; -*- PYTHON-PREPROCESSING-REQUIRED -def _gen_dir(ctx): +def _GenDir(ctx): if ctx.attr.include == None: return "" if not ctx.attr.include: @@ -9,19 +9,41 @@ def _gen_dir(ctx): return ctx.attr.include return ctx.label.package + '/' + ctx.attr.include -def _cc_outs(srcs): +def _CcOuts(srcs): return [s[:-len(".proto")] + ".pb.h" for s in srcs] + \ [s[:-len(".proto")] + ".pb.cc" for s in srcs] -def _py_outs(srcs): +def _PyOuts(srcs): return [s[:-len(".proto")] + "_pb2.py" for s in srcs] +def _RelativeOutputPath(path, include): + if include == None: + return path + + if not path.startswith(include): + fail("Include path %s isn't part of the path %s." % (include, path)) + + if include and include[-1] != '/': + include = include + '/' + + path = path[len(include):] + + if not path.startswith(PACKAGE_NAME): + fail("The package %s is not within the path %s" % (PACKAGE_NAME, path)) + + if not PACKAGE_NAME: + return path + + return path[len(PACKAGE_NAME)+1:] + + + def _proto_gen_impl(ctx): """General implementation for generating protos""" srcs = ctx.files.srcs deps = [] deps += ctx.files.srcs - gen_dir = _gen_dir(ctx) + gen_dir = _GenDir(ctx) import_flags = ["-I" + gen_dir] for dep in ctx.attr.deps: import_flags += dep.proto.import_flags @@ -110,7 +132,7 @@ def cc_proto_library( **kargs) return - outs = _cc_outs(srcs) + outs = _CcOuts(srcs) _proto_gen( name=name + "_genproto", srcs=srcs, @@ -131,3 +153,70 @@ def cc_proto_library( deps=cc_libs + deps, includes=includes, **kargs) + + +def copied_srcs( + name, + srcs, + include, + **kargs): + outs = [_RelativeOutputPath(s, include) for s in srcs] + + native.genrule( + name=name+"_genrule", + srcs=srcs, + outs=outs, + cmd=";".join(["cp $(location %s) $(location %s)" % \ + (s, _RelativeOutputPath(s, include)) \ + for s in srcs])) + + native.filegroup( + name=name, + srcs=outs, + **kargs) + + +def py_proto_library( + name, + srcs=[], + deps=[], + py_libs=[], + py_extra_srcs=[], + include=None, + protoc=":protoc", + **kargs): + outs = _PyOuts(srcs) + _proto_gen( + name=name + "_genproto", + srcs=srcs, + deps=[s + "_genproto" for s in deps], + include=include, + protoc=protoc, + gen_py=1, + outs=outs, + ) + + copied_srcs_name=name + "_copied_srcs" + if include != None: + copied_srcs( + name=copied_srcs_name, + srcs=outs, + include=include) + srcs=[copied_srcs_name] + + native.py_library( + name=name, + srcs=srcs+py_extra_srcs, + deps=py_libs, + **kargs) + +def internal_protobuf_py_tests( + name, + modules=[], + **kargs): + for m in modules: + native.py_test( + name="py_%s" % m, + srcs=["google/protobuf/internal/%s.py" % m], + main="google/protobuf/internal/%s.py" % m, + **kargs) -- cgit v1.2.3