| #!/usr/bin/env python3 | |
| # Copyright 2016 The Chromium Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """Automates running sysroot_creator.py for each supported arch.""" | |
| import concurrent.futures | |
| import json | |
| import os | |
| import subprocess | |
| import sys | |
| import textwrap | |
| import sysroot_creator | |
| SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) | |
| def build_and_upload(arch): | |
| try: | |
| sysroot_creator.build_sysroot(arch) | |
| result = sysroot_creator.upload_sysroot(arch) | |
| return (arch, True, result) # (architecture, success, result) | |
| except Exception as e: | |
| return (arch, False, str(e)) # (architecture, failure, error message) | |
| def main(): | |
| with concurrent.futures.ThreadPoolExecutor() as executor: | |
| # Map the function over the architectures | |
| futures = [ | |
| executor.submit(build_and_upload, arch) | |
| for arch in sysroot_creator.TRIPLES | |
| ] | |
| failures = 0 | |
| results = {} | |
| for future in concurrent.futures.as_completed(futures): | |
| arch, success, result = future.result() | |
| if not success: | |
| failures += 1 | |
| name = ( | |
| f"{sysroot_creator.DISTRO}_{sysroot_creator.RELEASES[arch]}" | |
| + f"_{arch.lower()}-sysroot" | |
| ) | |
| results[name] = (success, result) | |
| globals = {"Str": lambda x: x, "Var": lambda x: x} | |
| deps = open(os.path.join(SCRIPT_DIR, "..", "..", "..", "DEPS")).read() | |
| exec(deps, globals) | |
| updates = {} | |
| print("SYSROOT CREATION SUMMARY") | |
| for name, (success, result) in results.items(): | |
| status = "SUCCESS" if success else "FAILURE" | |
| print(name, status, sep=":\t") | |
| key = f"src/build/linux/{name}" | |
| updates[key] = globals["deps"][key] | |
| if success: | |
| result = " ".join(result.splitlines()[1:]) | |
| updates[key]["objects"] = json.loads(result)["path"]["objects"] | |
| print("Updating DEPS files") | |
| for key, objects in updates.items(): | |
| obj = objects["objects"][0] | |
| object_info = ','.join( | |
| [ | |
| obj["object_name"], | |
| obj["sha256sum"], | |
| str(obj["size_bytes"]), | |
| str(obj["generation"]), | |
| ] | |
| ) | |
| print(f"Updating {key} in src/DEPS") | |
| subprocess.call(["gclient", "setdep", "-r", f"{key}@{object_info}"]) | |
| prefix = 'src/build/' | |
| substr_key = key[len(prefix) :] | |
| print(f"Updating {substr_key} in src/build/DEPS") | |
| subprocess.call( | |
| [ | |
| "gclient", | |
| "setdep", | |
| "-r", | |
| f"{substr_key}@{object_info}", | |
| "--deps-file", | |
| "build/DEPS", | |
| ] | |
| ) | |
| if not failures: | |
| key = ( | |
| sysroot_creator.ARCHIVE_TIMESTAMP | |
| + "-" | |
| + str(sysroot_creator.SYSROOT_RELEASE) | |
| ) | |
| sysroot_gni = textwrap.dedent(f"""\ | |
| # Copyright 2024 The Chromium Authors | |
| # Use of this source code is governed by a BSD-style license that | |
| # can be found in the LICENSE file. | |
| # This file was generated by | |
| # build/linux/sysroot_scripts/build_and_upload.py | |
| cr_sysroot_key = "{key}" | |
| """) | |
| fname = os.path.join(SCRIPT_DIR, "sysroot.gni") | |
| with open(fname, "w") as f: | |
| f.write(sysroot_gni) | |
| return failures | |
| if __name__ == "__main__": | |
| sys.exit(main()) |