|  | #!/usr/bin/env python | 
|  | # Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | """Automates running BuildPackageLists, BuildSysroot, and | 
|  | UploadSysroot for each supported arch of each sysroot creator. | 
|  | """ | 
|  |  | 
|  | import glob | 
|  | import hashlib | 
|  | import json | 
|  | import multiprocessing | 
|  | import os | 
|  | import re | 
|  | import string | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  | def run_script(args): | 
|  | fnull = open(os.devnull, 'w') | 
|  | subprocess.check_call(args, stdout=fnull, stderr=fnull) | 
|  |  | 
|  | def sha1sumfile(filename): | 
|  | sha1 = hashlib.sha1() | 
|  | with open(filename, 'rb') as f: | 
|  | while True: | 
|  | data = f.read(65536) | 
|  | if not data: | 
|  | break | 
|  | sha1.update(data) | 
|  | return sha1.hexdigest() | 
|  |  | 
|  | def get_proc_output(args): | 
|  | return subprocess.check_output(args).strip() | 
|  |  | 
|  | def build_and_upload(script_path, distro, release, arch, lock): | 
|  | # TODO(thomasanderson):  Find out which revision 'git-cl upload' uses to | 
|  | # calculate the diff against and use that instead of HEAD. | 
|  | script_dir = os.path.dirname(os.path.realpath(__file__)) | 
|  | revision = get_proc_output(['git', '-C', script_dir, 'rev-parse', 'HEAD']) | 
|  |  | 
|  | run_script([script_path, 'UpdatePackageLists%s' % arch]) | 
|  | run_script([script_path, 'BuildSysroot%s' % arch]) | 
|  | run_script([script_path, 'UploadSysroot%s' % arch, revision]) | 
|  |  | 
|  | tarball = '%s_%s_%s_sysroot.tar.xz' % (distro, release, arch.lower()) | 
|  | tarxz_path = os.path.join(script_dir, "..", "..", "..", "out", | 
|  | "sysroot-build", release, tarball) | 
|  | sha1sum = sha1sumfile(tarxz_path) | 
|  | sysroot_dir = '%s_%s_%s-sysroot' % (distro, release, arch.lower()) | 
|  |  | 
|  | sysroot_metadata = { | 
|  | 'Revision': revision, | 
|  | 'Tarball': tarball, | 
|  | 'Sha1Sum': sha1sum, | 
|  | 'SysrootDir': sysroot_dir | 
|  | } | 
|  | with lock: | 
|  | with open(os.path.join(script_dir, 'sysroots.json'), 'rw+') as f: | 
|  | sysroots = json.load(f) | 
|  | sysroots["%s_%s" % (release, arch.lower())] = sysroot_metadata | 
|  | f.seek(0) | 
|  | f.truncate() | 
|  | f.write(json.dumps(sysroots, sort_keys=True, indent=4, | 
|  | separators=(',', ': '))) | 
|  | f.write('\n') | 
|  |  | 
|  | def main(): | 
|  | script_dir = os.path.dirname(os.path.realpath(__file__)) | 
|  | procs = [] | 
|  | lock = multiprocessing.Lock() | 
|  | for filename in glob.glob(os.path.join(script_dir, 'sysroot-creator-*.sh')): | 
|  | script_path = os.path.join(script_dir, filename) | 
|  | distro = get_proc_output([script_path, 'PrintDistro']) | 
|  | release = get_proc_output([script_path, 'PrintRelease']) | 
|  | architectures = get_proc_output([script_path, 'PrintArchitectures']) | 
|  | for arch in architectures.split('\n'): | 
|  | proc = multiprocessing.Process(target=build_and_upload, | 
|  | args=(script_path, distro, release, arch, | 
|  | lock)) | 
|  | procs.append(("%s %s (%s)" % (distro, release, arch), proc)) | 
|  | proc.start() | 
|  | for _, proc in procs: | 
|  | proc.join() | 
|  |  | 
|  | print "SYSROOT CREATION SUMMARY" | 
|  | failures = 0 | 
|  | for name, proc in procs: | 
|  | if proc.exitcode: | 
|  | failures += 1 | 
|  | status = "FAILURE" if proc.exitcode else "SUCCESS" | 
|  | print "%s sysroot creation\t%s" % (name, status) | 
|  | return failures | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |