mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 12:16:49 +00:00
[bazel] Rework zlib dependency
Switches the library to use the zlib-ng implementation since the original implementation is warning-incompatible with recent versions of clang. Removes the wrapper logic for zlib in the bazel build and introduces new logic to handle `LLVM_ENABLE_ZLIB`. Removes the `BAZEL_LLVM_ZLIB_STRATEGY` environment variable and instead introduces a boolean `--@llvm_zlib//:llvm_enable_zlib` flag which defaults to true. To migrate: * The previous "external" strategy is the default. May be explicitly enabled with `--@llvm_zlib//:llvm_enable_zlib=true`. For custom zlib variants you can use the BUILD file at `third_party_build/zlib.BUILD` as reference and adjust the `@llvm_zlib` archive in the `WORKSPACE` directly. * The previous "disable" strategy may be enabled with `--@llvm_zlib//:llvm_enable_zlib=false`. * The previous "system" strategy has been removed since it breaks hermeticity. If you need the "system" setup, use the "external" strategy and override the zlib dependency. Addresses breakages of downstream projects using upstream clang and the previously "external" zlib strategy (D141553). Reviewed By: MaskRay, GMNGeoffrey Differential Revision: https://reviews.llvm.org/D143320
This commit is contained in:
parent
8b132747cd
commit
a268127736
@ -36,22 +36,13 @@ maybe(
|
||||
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "zlib",
|
||||
build_file = "@llvm-raw//utils/bazel/third_party_build:zlib.BUILD",
|
||||
sha256 = "91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9",
|
||||
strip_prefix = "zlib-1.2.12",
|
||||
urls = [
|
||||
"https://storage.googleapis.com/mirror.tensorflow.org/zlib.net/zlib-1.2.12.tar.gz",
|
||||
"https://zlib.net/zlib-1.2.12.tar.gz",
|
||||
],
|
||||
)
|
||||
|
||||
load("@llvm-raw//utils/bazel:zlib.bzl", "llvm_zlib_from_env")
|
||||
|
||||
maybe(
|
||||
llvm_zlib_from_env,
|
||||
name = "llvm_zlib",
|
||||
external_zlib = "@zlib",
|
||||
build_file = "@llvm-raw//utils/bazel/third_party_build:zlib-ng.BUILD",
|
||||
sha256 = "e36bb346c00472a1f9ff2a0a4643e590a254be6379da7cddd9daeb9a7f296731",
|
||||
strip_prefix = "zlib-ng-2.0.7",
|
||||
urls = [
|
||||
"https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.0.7.zip",
|
||||
],
|
||||
)
|
||||
|
||||
maybe(
|
||||
|
@ -5,7 +5,6 @@
|
||||
"""Helper macros to configure the LLVM overlay project."""
|
||||
|
||||
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
|
||||
load(":zlib.bzl", "llvm_zlib_disable", "llvm_zlib_system")
|
||||
load(":terminfo.bzl", "llvm_terminfo_disable", "llvm_terminfo_system")
|
||||
|
||||
# Directory of overlay files relative to WORKSPACE
|
||||
@ -176,22 +175,12 @@ llvm_configure = repository_rule(
|
||||
)
|
||||
|
||||
def llvm_disable_optional_support_deps():
|
||||
maybe(
|
||||
llvm_zlib_disable,
|
||||
name = "llvm_zlib",
|
||||
)
|
||||
|
||||
maybe(
|
||||
llvm_terminfo_disable,
|
||||
name = "llvm_terminfo",
|
||||
)
|
||||
|
||||
def llvm_use_system_support_deps():
|
||||
maybe(
|
||||
llvm_zlib_system,
|
||||
name = "llvm_zlib",
|
||||
)
|
||||
|
||||
maybe(
|
||||
llvm_terminfo_system,
|
||||
name = "llvm_terminfo",
|
||||
|
@ -1,10 +0,0 @@
|
||||
# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
# Empty stub library. This doesn't include zlib and doesn't set the LLVM
|
||||
# `#define`s to enable it.
|
||||
cc_library(
|
||||
name = "zlib",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
@ -1,11 +0,0 @@
|
||||
# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
# Wrapper around an external zlib library to add the relevant LLVM `#define`s.
|
||||
cc_library(
|
||||
name = "zlib",
|
||||
defines = ["LLVM_ENABLE_ZLIB=1"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = ["@external_zlib_repo//:zlib_rule"],
|
||||
)
|
@ -1,13 +0,0 @@
|
||||
# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
# Wrapper library for the system's zlib. Using this only works if the toolchain
|
||||
# already has the relevant header search and library search paths configured.
|
||||
# It also sets the relevant LLVM `#define`s to enable zlib.
|
||||
cc_library(
|
||||
name = "zlib",
|
||||
defines = ["LLVM_ENABLE_ZLIB=1"],
|
||||
linkopts = ["-lz"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
@ -108,6 +108,7 @@ cc_library(
|
||||
"//llvm:TargetParser",
|
||||
"//llvm:TransformUtils",
|
||||
"//llvm:config",
|
||||
"@llvm_zlib//:zlib",
|
||||
"@llvm_zstd//:zstd",
|
||||
],
|
||||
)
|
||||
|
108
utils/bazel/third_party_build/zlib-ng.BUILD
Normal file
108
utils/bazel/third_party_build/zlib-ng.BUILD
Normal file
@ -0,0 +1,108 @@
|
||||
# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
|
||||
load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
|
||||
|
||||
package(
|
||||
default_visibility = ["//visibility:public"],
|
||||
# BSD/MIT-like license (for zlib)
|
||||
licenses = ["notice"],
|
||||
)
|
||||
|
||||
bool_flag(
|
||||
name = "llvm_enable_zlib",
|
||||
build_setting_default = True,
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "llvm_zlib_enabled",
|
||||
flag_values = {":llvm_enable_zlib": "true"},
|
||||
)
|
||||
|
||||
genrule(
|
||||
# The input template is identical to the CMake output.
|
||||
name = "zconf_gen",
|
||||
srcs = ["zconf.h.in"],
|
||||
outs = ["zconf.h"],
|
||||
cmd = "cp $(SRCS) $(OUTS)",
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "zlib",
|
||||
srcs = select({
|
||||
":llvm_zlib_enabled": [
|
||||
"adler32_p.h",
|
||||
"chunkset_tpl.h",
|
||||
"crc32_p.h",
|
||||
"crc32_tbl.h",
|
||||
"crc32_comb_tbl.h",
|
||||
"deflate.h",
|
||||
"deflate_p.h",
|
||||
"functable.h",
|
||||
"fallback_builtins.h",
|
||||
"inffast.h",
|
||||
"inffixed_tbl.h",
|
||||
"inflate.h",
|
||||
"inflate_p.h",
|
||||
"inftrees.h",
|
||||
"insert_string_tpl.h",
|
||||
"match_tpl.h",
|
||||
"trees.h",
|
||||
"trees_emit.h",
|
||||
"trees_tbl.h",
|
||||
"zbuild.h",
|
||||
"zendian.h",
|
||||
"zutil.h",
|
||||
"adler32.c",
|
||||
"chunkset.c",
|
||||
"compare258.c",
|
||||
"compress.c",
|
||||
"crc32.c",
|
||||
"crc32_comb.c",
|
||||
"deflate.c",
|
||||
"deflate_fast.c",
|
||||
"deflate_medium.c",
|
||||
"deflate_quick.c",
|
||||
"deflate_slow.c",
|
||||
"functable.c",
|
||||
"infback.c",
|
||||
"inffast.c",
|
||||
"inflate.c",
|
||||
"inftrees.c",
|
||||
"insert_string.c",
|
||||
"trees.c",
|
||||
"uncompr.c",
|
||||
"zutil_p.h",
|
||||
"zutil.c",
|
||||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
hdrs = select({
|
||||
":llvm_zlib_enabled": [
|
||||
"zlib.h",
|
||||
":zconf_gen",
|
||||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
copts = [
|
||||
"-std=c11",
|
||||
"-DZLIB_COMPAT",
|
||||
"-DWITH_GZFILEOP",
|
||||
"-DWITH_OPTIM",
|
||||
"-DWITH_NEW_STRATEGIES",
|
||||
# For local builds you might want to add "-DWITH_NATIVE_INSTRUCTIONS"
|
||||
# here to improve performance. Native instructions aren't enabled in
|
||||
# the default config for reproducibility.
|
||||
],
|
||||
defines = select({
|
||||
":llvm_zlib_enabled": [
|
||||
"LLVM_ENABLE_ZLIB=1",
|
||||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
# Clang includes zlib with angled instead of quoted includes, so we need
|
||||
# strip_include_prefix here.
|
||||
strip_include_prefix = ".",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
@ -1,46 +0,0 @@
|
||||
# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
package(
|
||||
default_visibility = ["//visibility:public"],
|
||||
# BSD/MIT-like license (for zlib)
|
||||
licenses = ["notice"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "zlib",
|
||||
srcs = [
|
||||
"adler32.c",
|
||||
"compress.c",
|
||||
"crc32.c",
|
||||
"crc32.h",
|
||||
"deflate.c",
|
||||
"deflate.h",
|
||||
"gzclose.c",
|
||||
"gzguts.h",
|
||||
"gzlib.c",
|
||||
"gzread.c",
|
||||
"gzwrite.c",
|
||||
"infback.c",
|
||||
"inffast.c",
|
||||
"inffast.h",
|
||||
"inffixed.h",
|
||||
"inflate.c",
|
||||
"inflate.h",
|
||||
"inftrees.c",
|
||||
"inftrees.h",
|
||||
"trees.c",
|
||||
"trees.h",
|
||||
"uncompr.c",
|
||||
"zconf.h",
|
||||
"zutil.c",
|
||||
"zutil.h",
|
||||
],
|
||||
hdrs = ["zlib.h"],
|
||||
copts = [
|
||||
"-Wno-shift-negative-value",
|
||||
"-DZ_HAVE_UNISTD_H",
|
||||
],
|
||||
includes = ["."],
|
||||
)
|
@ -1,112 +0,0 @@
|
||||
# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
"""Repository rules to configure the zlib used by LLVM.
|
||||
|
||||
Most users should pick one of the explicit rules to configure their use of zlib
|
||||
with LLVM:
|
||||
- `llvm_zlib_external` will link against an external Bazel zlib repository.
|
||||
- `llvm_zlib_system` will link against the system zlib (non-hermetically).
|
||||
- 'llvm_zlib_disable` will disable zlib completely.
|
||||
|
||||
If you would like to make your build configurable, you can use
|
||||
`llvm_zlib_from_env`. By default, this will disable zlib, but will inspect
|
||||
the environment variable (most easily set with a `--repo_env` flag to the
|
||||
Bazel invocation) `BAZEL_LLVM_ZLIB_STRATEGY`. If it is set to `external`,
|
||||
then it will behave the same as `llvm_zlib_external`. If it is set to
|
||||
`system` then it will behave the same as `llvm_zlib_system`. Any other
|
||||
setting will disable zlib the same as not setting it at all.
|
||||
"""
|
||||
|
||||
def _llvm_zlib_external_impl(repository_ctx):
|
||||
repository_ctx.template(
|
||||
"BUILD",
|
||||
repository_ctx.attr._external_build_template,
|
||||
substitutions = {
|
||||
"@external_zlib_repo//:zlib_rule": repository_ctx.attr.external_zlib,
|
||||
},
|
||||
executable = False,
|
||||
)
|
||||
|
||||
llvm_zlib_external = repository_rule(
|
||||
implementation = _llvm_zlib_external_impl,
|
||||
attrs = {
|
||||
"_external_build_template": attr.label(
|
||||
default = "@llvm-raw//utils/bazel/deps_impl:zlib_external.BUILD",
|
||||
allow_single_file = True,
|
||||
),
|
||||
"external_zlib": attr.string(
|
||||
doc = "The dependency that should be used for the external zlib library.",
|
||||
mandatory = True,
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
def _llvm_zlib_system_impl(repository_ctx):
|
||||
repository_ctx.template(
|
||||
"BUILD",
|
||||
repository_ctx.attr._system_build_template,
|
||||
executable = False,
|
||||
)
|
||||
|
||||
# While it may seem like this needs to be local, it doesn't actually inspect
|
||||
# any local state, it just configures to build against that local state.
|
||||
llvm_zlib_system = repository_rule(
|
||||
implementation = _llvm_zlib_system_impl,
|
||||
attrs = {
|
||||
"_system_build_template": attr.label(
|
||||
default = "@llvm-raw//utils/bazel/deps_impl:zlib_system.BUILD",
|
||||
allow_single_file = True,
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
def _llvm_zlib_disable_impl(repository_ctx):
|
||||
repository_ctx.template(
|
||||
"BUILD",
|
||||
repository_ctx.attr._disable_build_template,
|
||||
executable = False,
|
||||
)
|
||||
|
||||
llvm_zlib_disable = repository_rule(
|
||||
implementation = _llvm_zlib_disable_impl,
|
||||
attrs = {
|
||||
"_disable_build_template": attr.label(
|
||||
default = "@llvm-raw//utils/bazel/deps_impl:zlib_disable.BUILD",
|
||||
allow_single_file = True,
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
def _llvm_zlib_from_env_impl(repository_ctx):
|
||||
zlib_strategy = repository_ctx.os.environ.get("BAZEL_LLVM_ZLIB_STRATEGY")
|
||||
if zlib_strategy == "external":
|
||||
_llvm_zlib_external_impl(repository_ctx)
|
||||
elif zlib_strategy == "system":
|
||||
_llvm_zlib_system_impl(repository_ctx)
|
||||
else:
|
||||
_llvm_zlib_disable_impl(repository_ctx)
|
||||
|
||||
llvm_zlib_from_env = repository_rule(
|
||||
implementation = _llvm_zlib_from_env_impl,
|
||||
attrs = {
|
||||
"_disable_build_template": attr.label(
|
||||
default = "@llvm-raw//utils/bazel/deps_impl:zlib_disable.BUILD",
|
||||
allow_single_file = True,
|
||||
),
|
||||
"_external_build_template": attr.label(
|
||||
default = "@llvm-raw//utils/bazel/deps_impl:zlib_external.BUILD",
|
||||
allow_single_file = True,
|
||||
),
|
||||
"_system_build_template": attr.label(
|
||||
default = "@llvm-raw//utils/bazel/deps_impl:zlib_system.BUILD",
|
||||
allow_single_file = True,
|
||||
),
|
||||
"external_zlib": attr.label(
|
||||
doc = "The dependency that should be used for the external zlib library.",
|
||||
mandatory = True,
|
||||
),
|
||||
},
|
||||
environ = ["BAZEL_LLVM_ZLIB_STRATEGY"],
|
||||
)
|
Loading…
x
Reference in New Issue
Block a user