blob: b8b160248841c1f7a1943e0239a9d18276664616 [file]
"""Extensions for bzlmod."""
load("@rules_probe_rs//probe_rs/private:repositories.bzl", "probe_rs_tools_repositories")
_DEFAULT_NAME = "probe_rs"
probe_rs_tools = tag_class(attrs = {
"name": attr.string(doc = "Base name for generated repositories", default = _DEFAULT_NAME),
"version": attr.string(doc = "Explicit version of probe_rs_tools.", mandatory = True),
"archives": attr.label(
allow_single_file = True,
doc = "Optional archives for probe_rs_tools stored in a json file.",
),
})
def _probe_rs_extension(module_ctx):
registrations = {}
modules = {}
# Module resolution
for mod in module_ctx.modules:
for module in mod.tags.tools:
if module.name != _DEFAULT_NAME and not mod.is_root:
fail("""\
Only the root module may override the default name for the probe_rs_tools module.
This prevents conflicting registrations in the global namespace of external repos.
""")
if module.name not in registrations.keys():
registrations[module.name] = []
registrations[module.name].append(module.version)
modules[module.version] = module
# Version resolution
for name, versions in registrations.items():
if len(versions) > 1:
# TODO: should be semver-aware, using MVS
selected = sorted(versions, reverse = True)[0]
# buildifier: disable=print
print("NOTE: probe_rs_tools module {} has multiple versions {}, selected {}".format(name, versions, selected))
else:
selected = versions[0]
archives = None
archives_file = modules[selected].archives
if archives_file != None:
archives_json = module_ctx.read(archives_file)
archives = json.decode(archives_json)
probe_rs_tools_repositories(
name = name,
version = selected,
archives = archives,
)
probe_rs = module_extension(
implementation = _probe_rs_extension,
tag_classes = {"tools": probe_rs_tools},
)