blob: 1a24da29066ec2ae305e7880aedc4e81c067a33d [file] [log] [blame]
#!/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.
"""
from __future__ import print_function
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):
script_dir = os.path.dirname(os.path.realpath(__file__))
run_script([script_path, 'BuildSysroot' + arch])
run_script([script_path, 'UploadSysroot' + arch])
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 = {
'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())