blob: 6da7c6a445667a98dcc2da1684e1179f4ca07498 [file] [log] [blame] [edit]
"""
Setup code for setting up binaries for use
"""
load("@bazel_skylib//lib:new_sets.bzl", "sets")
load("@bazel_skylib//lib:types.bzl", "types")
_TOOL_NAMES = ["buildifier", "buildozer"]
_TYPICAL_PLATFORMS = ["windows", "darwin", "linux"]
_TYPICAL_ARCHES = ["amd64", "arm64"]
_VALID_TOOL_NAMES = sets.make(_TOOL_NAMES)
def _create_asset(name, platform, arch, version, sha256 = None):
"""Create a `struct` representing a buildtools asset.
Args:
name: The name of the asset (e.g. `buildifier`, `buildozer`) as a
`string`.
platform: The platform as a `string`. (e.g. `linux`, `darwin`)
arch: The arch as a `string`. (e.g. `amd64`, `arm64`)
version: The version as a `string`. (e.g. `4.2.3`)
sha256: Optional. The sha256 as a `string`.
Returns:
A `struct` representing the asset to be downloaded.
"""
if name == None:
fail("Expected a name.")
if platform == None:
fail("Expected a platform.")
if arch == None:
fail("Expected an arch.")
if version == None:
fail("Expected a version.")
if sha256 == None:
fail("Expected a sha256.")
if arch == "windows" and version == "arm64":
fail("arm64 windows executables are not provided by buildifier/buildozer")
if not sets.contains(_VALID_TOOL_NAMES, name):
fail("Invalid asset name. {name}".format(name = name))
return struct(
name = name,
platform = platform,
arch = arch,
version = version,
sha256 = sha256,
)
def _create_unique_name(asset = None, name = None, platform = None, arch = None):
"""Create a unique name from an asset or from a name/platform/arch.
Args:
asset: An asset `struct` as returned by `buildtools.create_asset`.
name: A tool name (e.g. buildifier) as `string`.
platform: A platform as `string`.
arch: An arch as `string`.
Returns:
A `string` suitable for use as identifying an asset.
"""
if asset != None:
name = asset.name
platform = asset.platform
arch = asset.arch
if name == None or platform == None or arch == None:
fail("An asset or name/platform/arch must be specified.")
return "{name}_{platform}_{arch}".format(
name = name,
platform = platform,
arch = arch,
)
def _asset_to_json(asset):
"""Returns the JSON representation for an asset `struct` or a `list` of asset `struct` values.
Args:
asset: An asset `struct` as returned by `buildtools.create_asset`.
Returns:
Returns a JSON `string` representation of the provided value.
"""
return json.encode(asset)
def _asset_from_json(json_str):
"""Returns an asset `struct` or a `list` of asset `struct` values as represented by the JSON `string`.
Args:
json_str: A JSON `string` representing an asset or a list of assets.
Returns:
An asset `struct` or a `list` of asset `struct` values.
"""
result = json.decode(json_str)
if types.is_list(result):
return [_create_asset(**a) for a in result]
elif types.is_dict(result):
return _create_asset(**result)
fail("Unexpected result type decoding JSON string. %s" % (json_str))
def _create_assets(
version,
names = _TOOL_NAMES,
platforms = _TYPICAL_PLATFORMS,
arches = _TYPICAL_ARCHES,
sha256_values = {}):
"""Create a `list` of asset `struct` values.
Args:
version: The buildtools version string.
names: Optional. A `list` of tools to include.
platforms: Optional. A `list` of platforms to include.
arches: Optional. A `list` of arches to include.
sha256_values: Optional. A `dict` of asset name to sha256.
Returns:
A `list` of buildtools assets.
"""
if version == None:
fail("Expected a version.")
if names == None or names == []:
fail("Expected a non-empty list for names.")
if platforms == None or platforms == []:
fail("Expected a non-empty list for platforms.")
if arches == None or arches == []:
fail("Expected a non-empty list for arches.")
if sha256_values == None:
sha256_values = {}
assets = []
for name in names:
for platform in platforms:
for arch in arches:
if platform == "windows" and arch == "arm64":
continue
uniq_name = _create_unique_name(
name = name,
platform = platform,
arch = arch,
)
if uniq_name not in sha256_values:
fail("Missing sha256 value for {}".format(uniq_name))
assets.append(_create_asset(
name = name,
platform = platform,
arch = arch,
version = version,
sha256 = sha256_values.get(uniq_name),
))
return assets
_DEFAULT_ASSETS = _create_assets(
version = "v8.2.0",
names = ["buildifier", "buildozer"],
platforms = ["darwin", "linux", "windows"],
arches = ["amd64", "arm64"],
sha256_values = {
"buildifier_darwin_amd64": "309b3c3bfcc4b1533d5f7f796adbd266235cfb6f01450f3e37423527d209a309",
"buildifier_darwin_arm64": "e08381a3ed1d59c0a17d1cee1d4e7684c6ce1fc3b5cfa1bd92a5fe978b38b47d",
"buildifier_linux_amd64": "3e79e6c0401b5f36f8df4dfc686127255d25c7eddc9599b8779b97b7ef4cdda7",
"buildifier_linux_arm64": "c624a833bfa64d3a457ef0235eef0dbda03694768aab33f717a7ffd3f803d272",
"buildifier_windows_amd64": "a27fcf7521414f8214787989dcfb2ac7d3f7c28b56e44384e5fa06109953c2f1",
"buildozer_darwin_amd64": "b7bd7189a9d4de22c10fd94b7d1d77c68712db9bdd27150187bc677e8c22960e",
"buildozer_darwin_arm64": "781527c5337dadba5a0611c01409c669852b73b72458650cc7c5f31473f7ae3f",
"buildozer_linux_amd64": "0e54770aa6148384d1edde39ef20e10d2c57e8c09dd42f525e100f51b0b77ae1",
"buildozer_linux_arm64": "a9f38f2781de41526ce934866cb79b8b5b59871c96853dc5a1aee26f4c5976bb",
"buildozer_windows_amd64": "8ce5a9a064b01551ffb8d441fa9ef4dd42c9eeeed6bc71a89f917b3474fd65f6",
},
)
buildtools = struct(
create_asset = _create_asset,
create_unique_name = _create_unique_name,
asset_to_json = _asset_to_json,
asset_from_json = _asset_from_json,
create_assets = _create_assets,
DEFAULT_ASSETS = _DEFAULT_ASSETS,
)