blob: 83acdcdadf0f1884383eb63d02864aa98273db9a [file] [log] [blame]
# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Module extensions for loading dependencies we need to build Bazel.
"""
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
load("//:distdir.bzl", "dist_http_archive", "repo_cache_tar")
load("//:distdir_deps.bzl", "DIST_ARCHIVE_REPOS", "TEST_REPOS")
load("//:repositories.bzl", "embedded_jdk_repositories")
load("//src/main/res:winsdk_configure.bzl", "winsdk_configure")
load("//src/test/shell/bazel:list_source_repository.bzl", "list_source_repository")
load("//src/tools/bzlmod:utils.bzl", "parse_http_artifacts")
load("//tools/distributions/debian:deps.bzl", "debian_deps")
### Dependencies for building Bazel
def _bazel_build_deps(_ctx):
embedded_jdk_repositories()
debian_deps()
repo_cache_tar(name = "bootstrap_repo_cache", repos = DIST_ARCHIVE_REPOS, dirname = "derived/repository_cache")
bazel_build_deps = module_extension(implementation = _bazel_build_deps)
### Dependencies for testing Bazel
def _bazel_test_deps(_ctx):
list_source_repository(name = "local_bazel_source_list")
dist_http_archive(name = "bazelci_rules")
winsdk_configure(name = "local_config_winsdk")
bazel_test_deps = module_extension(implementation = _bazel_test_deps)
_HUB_TEST_REPO_BUILD = """
filegroup(
name="srcs",
srcs = {srcs},
visibility = ["//visibility:public"],
)
"""
def _hub_test_repo_impl(ctx):
ctx.file(
"BUILD",
_HUB_TEST_REPO_BUILD.format(srcs = ["@%s//file" % repo for repo in ctx.attr.repos]),
)
hub_test_repo = repository_rule(
implementation = _hub_test_repo_impl,
attrs = {"repos": attr.string_list()},
)
def _test_repo_extension_impl(ctx):
"""This module extension is used to fetch http artifacts required for generating TEST_REPOS."""
lockfile_path = ctx.path(Label("//:MODULE.bazel.lock"))
http_artifacts = parse_http_artifacts(ctx, lockfile_path, TEST_REPOS)
name = "test_repo_"
cnt = 1
for artifact in http_artifacts:
# Define one http_file for each artifact so that we can fetch them in parallel.
http_file(
name = name + str(cnt),
url = artifact["url"],
sha256 = artifact["sha256"] if "sha256" in artifact else None,
integrity = artifact["integrity"] if "integrity" in artifact else None,
)
cnt += 1
# write a repo rule that depends on all the http_file rules
hub_test_repo(name = "test_repos", repos = [(name + str(i)) for i in range(1, cnt)])
test_repo_extension = module_extension(implementation = _test_repo_extension_impl)
### Dependencies for Bazel Android tools
def _bazel_android_deps(_ctx):
dist_http_archive(name = "desugar_jdk_libs")
bazel_android_deps = module_extension(implementation = _bazel_android_deps)