| # 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 = Label("//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 = Label("//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 = Label("//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 = Label("//utils/bazel/deps_impl:zlib_disable.BUILD"), |
| allow_single_file = True, |
| ), |
| "_external_build_template": attr.label( |
| default = Label("//utils/bazel/deps_impl:zlib_external.BUILD"), |
| allow_single_file = True, |
| ), |
| "_system_build_template": attr.label( |
| default = Label("//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"], |
| ) |