diff --git a/BUILD b/BUILD index 80ae3e5297..eb8077ae74 100644 --- a/BUILD +++ b/BUILD @@ -15,6 +15,12 @@ config_setting( }, ) +################################################################################ +# ZLIB configuration +################################################################################ + +ZLIB_DEPS = ["//external:zlib"] + ################################################################################ # Protobuf Runtime Library ################################################################################ @@ -42,6 +48,7 @@ COPTS = select({ ":msvc" : MSVC_COPTS, "//conditions:default": [ "-DHAVE_PTHREAD", + "-DHAVE_ZLIB", "-Wall", "-Woverloaded-virtual", "-Wno-sign-compare", @@ -117,6 +124,11 @@ cc_library( visibility = ["//visibility:public"], ) +PROTOBUF_DEPS = select({ + ":msvc": [], + "//conditions:default": ZLIB_DEPS, +}) + cc_library( name = "protobuf", srcs = [ @@ -182,7 +194,7 @@ cc_library( includes = ["src/"], linkopts = LINK_OPTS, visibility = ["//visibility:public"], - deps = [":protobuf_lite"], + deps = [":protobuf_lite"] + PROTOBUF_DEPS, ) # This provides just the header files for use in projects that need to build @@ -590,7 +602,7 @@ cc_test( ":protobuf", ":protoc_lib", "//external:gtest_main", - ], + ] + PROTOBUF_DEPS, ) ################################################################################ diff --git a/WORKSPACE b/WORKSPACE index f3020843f1..0fa64583a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,10 +1,11 @@ workspace(name = "com_google_protobuf") + load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") new_local_repository( name = "submodule_gmock", + build_file = "@//:third_party/googletest/BUILD.bazel", path = "third_party/googletest", - build_file = "@//:third_party/googletest/BUILD.bazel" ) http_archive( @@ -21,6 +22,14 @@ http_archive( urls = ["https://github.com/bazelbuild/bazel-skylib/archive/2169ae1c374aab4a09aa90e65efe1a3aad4e279b.tar.gz"], ) +http_archive( + name = "net_zlib", + build_file = "//:third_party/zlib.BUILD", + sha256 = "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1", + strip_prefix = "zlib-1.2.11", + urls = ["https://zlib.net/zlib-1.2.11.tar.gz"], +) + bind( name = "python_headers", actual = "//util/python:python_headers", @@ -60,3 +69,8 @@ bind( name = "gson", actual = "@gson_maven//jar", ) + +bind( + name = "zlib", + actual = "@net_zlib//:zlib", +) diff --git a/third_party/zlib.BUILD b/third_party/zlib.BUILD new file mode 100644 index 0000000000..f948117417 --- /dev/null +++ b/third_party/zlib.BUILD @@ -0,0 +1,60 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) # BSD/MIT-like license (for zlib) + +_ZLIB_HEADERS = [ + "crc32.h", + "deflate.h", + "gzguts.h", + "inffast.h", + "inffixed.h", + "inflate.h", + "inftrees.h", + "trees.h", + "zconf.h", + "zlib.h", + "zutil.h", +] + +_ZLIB_PREFIXED_HEADERS = ["zlib/include/" + hdr for hdr in _ZLIB_HEADERS] + +# In order to limit the damage from the `includes` propagation +# via `:zlib`, copy the public headers to a subdirectory and +# expose those. +genrule( + name = "copy_public_headers", + srcs = _ZLIB_HEADERS, + outs = _ZLIB_PREFIXED_HEADERS, + cmd = "cp $(SRCS) $(@D)/zlib/include/", + visibility = ["//visibility:private"], +) + +cc_library( + name = "zlib", + srcs = [ + "adler32.c", + "compress.c", + "crc32.c", + "deflate.c", + "gzclose.c", + "gzlib.c", + "gzread.c", + "gzwrite.c", + "infback.c", + "inffast.c", + "inflate.c", + "inftrees.c", + "trees.c", + "uncompr.c", + "zutil.c", + # Include the un-prefixed headers in srcs to work + # around the fact that zlib isn't consistent in its + # choice of <> or "" delimiter when including itself. + ] + _ZLIB_HEADERS, + hdrs = _ZLIB_PREFIXED_HEADERS, + copts = [ + "-Wno-unused-variable", + "-Wno-implicit-function-declaration", + ], + includes = ["zlib/include/"], +)