79 lines
2.2 KiB
Python
79 lines
2.2 KiB
Python
"""A module defining a repository rule for housing toolchain definitions"""
|
|
|
|
_BUILD_FILE = """\
|
|
load("@rules_foreign_cc//tools/build_defs/native_tools:native_tools_toolchain.bzl", "native_tool_toolchain")
|
|
|
|
{toolchains}
|
|
"""
|
|
|
|
_TOOLCHAIN = """\
|
|
native_tool_toolchain(
|
|
name = "{repo}_tool",
|
|
path = "$(execpath @{repo}//:{tool}_bin)",
|
|
target = "@{repo}//:{tool}_bin",
|
|
)
|
|
|
|
toolchain(
|
|
name = "{repo}_toolchain",
|
|
exec_compatible_with = {exec_compatible_with},
|
|
toolchain = ":{repo}_tool",
|
|
toolchain_type = "@rules_foreign_cc//tools/build_defs:{tool}_toolchain",
|
|
)
|
|
"""
|
|
|
|
_TOOLCHAIN_BZL = """\
|
|
def register_toolchains():
|
|
native.register_toolchain(
|
|
{toolchains}
|
|
)
|
|
"""
|
|
|
|
_WORKSPACE_FILE = """\
|
|
workspace(name = "{}")
|
|
"""
|
|
|
|
def _prebuilt_toolchains_repository_impl(repository_ctx):
|
|
build_file = repository_ctx.path("BUILD.bazel")
|
|
repository_ctx.file(build_file, _BUILD_FILE.format(
|
|
toolchains = "\n".join([
|
|
_TOOLCHAIN.format(
|
|
repo = repo,
|
|
tool = repository_ctx.attr.tool,
|
|
exec_compatible_with = compat,
|
|
)
|
|
for repo, compat in repository_ctx.attr.repos.items()
|
|
]),
|
|
))
|
|
|
|
bzl_file = repository_ctx.path("toolchains.bzl")
|
|
repository_ctx.file(bzl_file, _TOOLCHAIN_BZL.format(
|
|
toolchains = "\n".join([
|
|
" \"@{repo}//:{tool}_tool\",".format(
|
|
repo = repo,
|
|
tool = repository_ctx.attr.tool,
|
|
)
|
|
for repo in repository_ctx.attr.repos.keys()
|
|
]),
|
|
))
|
|
|
|
workspace_file = repository_ctx.path("WORKSPACE.bazel")
|
|
repository_ctx.file(workspace_file, _WORKSPACE_FILE.format(
|
|
repository_ctx.name,
|
|
))
|
|
|
|
prebuilt_toolchains_repository = repository_rule(
|
|
doc = "A repository rule which houses toolchain definitions",
|
|
implementation = _prebuilt_toolchains_repository_impl,
|
|
attrs = {
|
|
"repos": attr.string_list_dict(
|
|
doc = "A mapping of repository names to platform restrictions",
|
|
mandatory = True,
|
|
),
|
|
"tool": attr.string(
|
|
doc = "The name of the tool the toolchains represent",
|
|
mandatory = True,
|
|
values = ["cmake", "ninja"],
|
|
),
|
|
},
|
|
)
|