Add Bazel config for zlib support (#5389)
* Add Bazel config for optional zlib support
* Add hard dependency on zlib
* Remove unused config_setting
diff --git a/BUILD b/BUILD
index 80ae3e5..eb8077a 100644
--- a/BUILD
+++ b/BUILD
@@ -16,6 +16,12 @@
)
################################################################################
+# ZLIB configuration
+################################################################################
+
+ZLIB_DEPS = ["//external:zlib"]
+
+################################################################################
# Protobuf Runtime Library
################################################################################
@@ -42,6 +48,7 @@
":msvc" : MSVC_COPTS,
"//conditions:default": [
"-DHAVE_PTHREAD",
+ "-DHAVE_ZLIB",
"-Wall",
"-Woverloaded-virtual",
"-Wno-sign-compare",
@@ -117,6 +124,11 @@
visibility = ["//visibility:public"],
)
+PROTOBUF_DEPS = select({
+ ":msvc": [],
+ "//conditions:default": ZLIB_DEPS,
+})
+
cc_library(
name = "protobuf",
srcs = [
@@ -182,7 +194,7 @@
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 @@
":protobuf",
":protoc_lib",
"//external:gtest_main",
- ],
+ ] + PROTOBUF_DEPS,
)
################################################################################
diff --git a/WORKSPACE b/WORKSPACE
index f302084..0fa6458 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 @@
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 @@
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 0000000..f948117
--- /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/"],
+)