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