grpcurl/grpcurl_repositories.bzl

113 lines
3.5 KiB
Python

"""Bazel macro to run a binary copy of gRPCurl."""
# sample link (for `_bindist("1.8.6", "osx", "arm64")`):
# https://github.com/fullstorydev/grpcurl/releases/download/v1.8.6/grpcurl_1.8.6_osx_arm64.tar.gz
def _bindist(version, os, arch):
return "https://github.com/fullstorydev/grpcurl/releases/download/v%s/grpcurl_%s_%s_%s.tar.gz" % (
version,
version,
os,
arch
)
# sample bundle (for `_bindist_bundle("1.8.6", "linux", archs = ["arm64", "s390x", "x86_32", "x86_64"])`):
# "linux": {
# "arm64": _bindist("1.8.6", "linux", "arm64"),
# "s390x": _bindist("1.8.6", "linux", "s390x"),
# "x86_32": _bindist("1.8.6", "linux", "x86_32"),
# "x86_64": _bindist("1.8.6", "linux", "x86_64"),
# },
def _bindist_bundle(version, os, archs = []):
return dict([
(arch, _bindist(version, os, arch))
for arch in archs
])
# sample version: (for `_bindist_bundle("1.8.6", bundles = {"osx": ["arm64"], "linux": ["arm64"]})`)
# "1.8.6": {
# "linux": {
# "arm64": _bindist("1.8.6", "linux", "arm64"),
# },
# "darwin": {
# "arm64": _bindist("1.8.6", "osx", "arm64"),
# },
# },
def _bindist_version(version, bundles = {}):
return dict([
(os, _bindist_bundle(version, os, archs))
for os, archs in bundles.items()
])
# version checkums (static)
_grpcurl_version_checksums = {
"1.8.6_linux_x86_64": "5d6768248ea75b30fba09c09ff8ba91fbc0dd1a33361b847cdaf4825b1b514a7",
"1.8.6_linux_arm64": "8e68cef2b493e79ebf8cb6d867678cbba0b9c5dea75f238575fca4f3bcc539b2",
"1.8.6_linux_s390x": "45ffd4a01c330176a4f5727667571973c60d0b4d670d4fbba31b3cf86922f889",
"1.8.6_osx_arm64": "fe3ce63efb168e894f4af58512b1bd9e3327166f1616975a7dbb249a990ce6cf",
"1.8.6_osx_x86_64": "f908d8d2006efaf702097593a2e030ddc9274c7d349b85bee9d3cfa099018854",
"1.8.6_linux_x86_32": "7840189ecac1f8c7d102fe947a73299abe87435b246a2f679e285d3160a49104",
}
# version configs (static)
_grpcurl_version_configs = {
"1.8.6": _bindist_version(
version = "1.8.6",
bundles = {
"linux": ["arm64", "s390x", "x86_32", "x86_64"],
"osx": ["arm64", "x86_64"],
},
),
}
_grpcurl_latest_version = "1.8.6"
def _get_platform(ctx):
res = ctx.execute(["uname", "-p"])
arch = "amd64"
if res.return_code == 0:
uname = res.stdout.strip()
if uname == "arm":
arch = "arm64"
elif uname == "aarch64":
arch = "aarch64"
if ctx.os.name == "linux":
return ("linux", arch)
elif ctx.os.name == "mac os x":
if arch == "arm64" or arch == "aarch64":
return ("osx", "arm64")
return ("osx", "x86_64")
else:
fail("Unsupported operating system: " + ctx.os.name)
def _grpcurl_bindist_repository_impl(ctx):
platform = _get_platform(ctx)
version = ctx.attr.version
# resolve dist
config = _grpcurl_version_configs[version]
link = config[platform[0]][platform[1]]
sha = _grpcurl_version_checksums["%s_%s_%s" % (version, platform[0], platform[1])]
urls = [link]
ctx.download_and_extract(
url = urls,
sha256 = sha,
)
ctx.file("BUILD", """exports_files(glob(["**/*"]))""")
ctx.file("WORKSPACE", "workspace(name = \"{name}\")".format(name = ctx.name))
grpcurl_bindist_repository = repository_rule(
attrs = {
"version": attr.string(
mandatory = True,
default = _grpcurl_latest_version,
),
},
implementation = _grpcurl_bindist_repository_impl,
)