blob: b583e35d641af60618d4d845db59a99f962b059f [file] [edit]
"Repository rule that downloads a pre-compiled protoc from our official release for a single platform."
load("//toolchain:platforms.bzl", "PROTOBUF_PLATFORMS")
load(":prebuilt_tool_integrity.bzl", "RELEASED_BINARY_INTEGRITY", "RELEASE_VERSION")
def release_version_to_artifact_name(release_version, platform):
# versions have a "v" prefix like "v28.0"
stripped_version = release_version.removeprefix("v")
# release candidate versions like "v29.0-rc3" have artifact names
# like "protoc-29.0-rc-3-osx-x86_64.zip"
artifact_version = stripped_version.replace("rc", "rc-")
return "{}-{}-{}.zip".format(
"protoc",
artifact_version,
platform,
)
def _prebuilt_protoc_repo_impl(rctx):
filename = release_version_to_artifact_name(
RELEASE_VERSION,
rctx.attr.platform,
)
rctx.download_and_extract(
url = "https://github.com/protocolbuffers/protobuf/releases/download/{}/{}".format(
RELEASE_VERSION,
filename,
),
sha256 = RELEASED_BINARY_INTEGRITY[filename],
)
rctx.file("BUILD.bazel", """\
# Generated by @protobuf//bazel/private:prebuilt_protoc_toolchain.bzl
load("@com_google_protobuf//bazel/toolchains:proto_toolchain.bzl", "proto_toolchain")
package(default_visibility = ["//visibility:public"])
proto_toolchain(
name = "prebuilt_protoc_toolchain",
proto_compiler = "{protoc_label}",
)
""".format(
protoc_label = "bin/protoc.exe" if rctx.attr.platform.startswith("win") else "bin/protoc",
))
prebuilt_protoc_repo = repository_rule(
doc = "Download a pre-built protoc and create a concrete toolchains for it",
implementation = _prebuilt_protoc_repo_impl,
attrs = {
"platform": attr.string(
doc = "A platform that protobuf ships a release for",
mandatory = True,
values = PROTOBUF_PLATFORMS.keys(),
),
},
)