blob: 9e6a71cdbbc5058b892baee5f8fbe2fb70ee4746 [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
load("@python3//:defs.bzl", "interpreter")
def _bitstreams_repo_impl(rctx):
# First, check if an existing pre-built bitstream cache repo exists, and if
# so, use it instead of building one.
cache_path = rctx.os.environ.get(
"BAZEL_BITSTREAMS_CACHE",
rctx.attr.cache,
)
result = rctx.execute(
[
rctx.path(rctx.attr.python_interpreter),
rctx.attr._cache_manager,
"--build-file=BUILD.bazel",
"--bucket-url={}".format(rctx.attr.bucket_url),
"--cache={}".format(cache_path),
"--refresh-time={}".format(rctx.attr.refresh_time),
],
quiet = False,
)
if result.return_code != 0:
fail("Bitstream cache not initialized properly.")
# The bitstream repo is evaluated on every invocation of bazel.
# Once the cache is initialized, a typical invocation will find the latest
# cached bitstream and configure it for use as a test artifact.
#
# The `refresh_time` sets the interval at which the cache manager will
# check for new bitstreams.
#
# By default, the cache manager will configure the latest available bitstream
# as the default bitstream. It will refresh every 18 hours.
#
# The behavior of the cache manager can be constrolled via the BITSTREAM
# environment variable. The environment variable can be any command line
# arguments accepted by the cache manager script.
#
# For example, to force a refresh of the cache:
# BITSTREAM=--refresh bazel build @bitstreams//...
#
# To use an exact bitstream in a test:
# BITSTREAM=3732655dbd225b5c1ae94a79b54cc9dc8cd8e391 bazel test <label>
#
# You can use any valid git commit identifier to select a bitstream:
# BITSTREAM=HEAD~1 bazel test <label>
#
# If you ask for a bitstream that does not exist in the GCP bucket, the
# next oldest bitstream will be chosen.
bitstreams_repo = repository_rule(
implementation = _bitstreams_repo_impl,
attrs = {
"bucket_url": attr.string(
doc = "Location of the GCP bitstream bucket.",
default = "https://storage.googleapis.com/opentitan-bitstreams/",
),
"cache": attr.string(
doc = "Location of bitstreams cache.",
default = "~/.cache/opentitan-bitstreams",
),
"refresh_time": attr.int(
doc = "How often to check for new bitstreams (seconds).",
default = 18 * 3600, # Refresh every 18h
),
"python_interpreter": attr.label(
default = interpreter,
allow_single_file = True,
doc = "Python interpreter to use.",
),
"_cache_manager": attr.label(
default = Label("//rules/scripts:bitstreams_workspace.py"),
allow_files = True,
),
},
environ = ["BAZEL_BITSTREAMS_CACHE", "BITSTREAM"],
local = True,
)