diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 8bcc6eaebe..6fc78efc25 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -16,7 +16,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("@bazel_skylib//rules:common_settings.bzl", "bool_setting") load("//python:py_binary.bzl", "py_binary") load("//python:py_library.bzl", "py_library") -load("//python:versions.bzl", "print_toolchains_checksums") +load(":print_toolchain_checksums.bzl", "print_toolchains_checksums") load(":py_exec_tools_toolchain.bzl", "current_interpreter_executable") load(":sentinel.bzl", "sentinel") load(":stamp.bzl", "stamp_build_setting") diff --git a/python/private/print_toolchain_checksums.bzl b/python/private/print_toolchain_checksums.bzl new file mode 100644 index 0000000000..eaaa5b9d75 --- /dev/null +++ b/python/private/print_toolchain_checksums.bzl @@ -0,0 +1,92 @@ +"""Print the toolchain versions. +""" + +load("//python:versions.bzl", "TOOL_VERSIONS", "get_release_info") +load("//python/private:text_util.bzl", "render") +load("//python/private:version.bzl", "version") + +def print_toolchains_checksums(name): + """A macro to print checksums for a particular Python interpreter version. + + Args: + name: {type}`str`: the name of the runnable target. + """ + by_version = {} + + for python_version, metadata in TOOL_VERSIONS.items(): + by_version[python_version] = _commands_for_version( + python_version = python_version, + metadata = metadata, + ) + + all_commands = sorted( + by_version.items(), + key = lambda x: version.key(version.parse(x[0], strict = True)), + ) + all_commands = [x[1] for x in all_commands] + + template = """\ +cat > "$@" <<'EOF' +#!/bin/bash + +set -o errexit -o nounset -o pipefail + +echo "Fetching hashes..." + +{commands} +EOF + """ + + native.genrule( + name = name, + srcs = [], + outs = ["print_toolchains_checksums.sh"], + cmd = select({ + "//python/config_settings:is_python_{}".format(version_str): template.format( + commands = commands, + ) + for version_str, commands in by_version.items() + } | { + "//conditions:default": template.format(commands = "\n".join(all_commands)), + }), + executable = True, + ) + +def _commands_for_version(*, python_version, metadata): + lines = [] + lines += [ + "cat < "$@" <<'EOF' -#!/bin/bash - -set -o errexit -o nounset -o pipefail - -echo "Fetching hashes..." - -{commands} -EOF - """ - - native.genrule( - name = name, - srcs = [], - outs = ["print_toolchains_checksums.sh"], - cmd = select({ - "//python/config_settings:is_python_{}".format(version): template.format( - commands = commands, - ) - for version, commands in by_version.items() - } | { - "//conditions:default": template.format(commands = "\n".join(all_commands)), - }), - executable = True, - ) - -def _commands_for_version(python_version): - return "\n".join([ - "echo \"{python_version}: {platform}: $$(curl --location --fail {release_url_sha256} 2>/dev/null || curl --location --fail {release_url} 2>/dev/null | shasum -a 256 | awk '{{ print $$1 }}')\"".format( - python_version = python_version, - platform = platform, - release_url = release_url, - release_url_sha256 = release_url + ".sha256", - ) - for platform in TOOL_VERSIONS[python_version]["sha256"].keys() - for release_url in get_release_info(platform, python_version)[1] - ]) - def gen_python_config_settings(name = ""): for platform in PLATFORMS.keys(): native.config_setting(