Python bazel support.

reviewable/pr867/r1
Jisi Liu 10 years ago
parent 6dac0822c4
commit 993fb7013e
  1. 149
      BUILD
  2. 99
      protobuf.bzl

149
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"],
)

@ -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)

Loading…
Cancel
Save