Skip to content

Commit

Permalink
Python bazel support.
Browse files Browse the repository at this point in the history
  • Loading branch information
liujisi committed Oct 20, 2015
1 parent 6dac082 commit 993fb70
Show file tree
Hide file tree
Showing 2 changed files with 214 additions and 34 deletions.
149 changes: 120 additions & 29 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand All @@ -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,
)

################################################################################
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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"],
)
Expand Down Expand Up @@ -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"],
)
99 changes: 94 additions & 5 deletions protobuf.bzl
Original file line number Diff line number Diff line change
@@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -110,7 +132,7 @@ def cc_proto_library(
**kargs)
return

outs = _cc_outs(srcs)
outs = _CcOuts(srcs)
_proto_gen(
name=name + "_genproto",
srcs=srcs,
Expand All @@ -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)

0 comments on commit 993fb70

Please sign in to comment.