llvm-capstone/utils/bazel/zlib.bzl
Geoffrey Martin-Noble 4aeb2e60df Introduce a Bazel build configuration
This patch introduces configuration for a Bazel BUILD in a side
directory in the monorepo.

This is following the approval of
https://github.com/llvm/llvm-www/blob/main/proposals/LP0002-BazelBuildConfiguration.md

As detailed in the README, the Bazel BUILD is not supported
by the community in general, and is maintained only by interested
parties. It follows the requirements of the LLVM peripheral tier:
https://llvm.org/docs/SupportPolicy.html#peripheral-tier.

This is largely copied from https://github.com/google/llvm-bazel,
with a few filepath tweaks and the addition of the README.

Reviewed By: echristo, keith, dblaikie, kuhar

Differential Revision: https://reviews.llvm.org/D90352
2021-06-22 12:47:43 -07:00

113 lines
3.9 KiB
Python

# 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": str(repository_ctx.attr.external_zlib),
},
executable = False,
)
llvm_zlib_external = repository_rule(
implementation = _llvm_zlib_external_impl,
attrs = {
"_external_build_template": attr.label(
default = Label("//deps_impl:zlib_external.BUILD"),
allow_single_file = True,
),
"external_zlib": attr.label(
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 = Label("//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 = Label("//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 = Label("//deps_impl:zlib_disable.BUILD"),
allow_single_file = True,
),
"_external_build_template": attr.label(
default = Label("//deps_impl:zlib_external.BUILD"),
allow_single_file = True,
),
"_system_build_template": attr.label(
default = Label("//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"],
)