def get_ninja_definitions()

in toolchains/prebuilt_toolchains.py [0:0]


def get_ninja_definitions() -> str:
    """Define a set of repositories and calls for registering `ninja` toolchains

    Returns:
        str: The Implementation of `_ninja_toolchains`
    """

    archives = []

    for version in NINJA_VERSIONS:

        version_archives = []
        version_toolchains = {}

        for target in NINJA_TARGETS.keys():
            url = NINJA_URL_TEMPLATE.format(
                full=version,
                target=target,
            )

            # Get sha256 (can be slow)
            remote = urllib.request.urlopen(url)
            total_read = 0
            max_file_size = 100*1024*1024
            hash = hashlib.sha256()
            while True:
                data = remote.read(4096)
                total_read += 4096

                if not data or total_read > max_file_size:
                    break

                hash.update(data)
            sha256 = hash.hexdigest()

            name = "ninja_{}_{}".format(version, target)

            version_archives.append(
                REPO_DEFINITION.format(
                    name=name,
                    url=url,
                    sha256=sha256,
                    prefix="",
                    build="ninja",
                    template="_NINJA_BUILD_FILE",
                    bin="ninja.exe" if "win" in target else "ninja",
                )
            )
            version_toolchains.update({target: name})

        archives.append("\n".join(
            [
                "    if \"{}\" == version:".format(version),
            ] + [indent(archive, " " * 8) for archive in version_archives])
        )

        toolchains_repos = {}
        for target, name in version_toolchains.items():
            toolchains_repos.update({name: NINJA_TARGETS[target]})

        archives.append(indent(TOOLCHAIN_REPO_DEFINITION.format(
            name="ninja_{}_toolchains".format(version),
            repos=indent(json.dumps(toolchains_repos, indent=4), " " * 4).lstrip(),
            tool="ninja",
        ), " " * 8))

        archives.append(indent(REGISTER_TOOLCHAINS.format(
            toolchains="\n".join(
                [indent("\"@ninja_{}_toolchains//:{}_toolchain\",".format(
                    version,
                    repo
                ), " " * 8) for repo in toolchains_repos])
        ), " " * 8))

        archives.extend([
            indent("return", " " * 8),
            "",
        ])

    archives.append(
        indent("fail(\"Unsupported version: \" + str(version))", " " * 4))

    return "\n".join(archives)