You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
5.4 KiB
167 lines
5.4 KiB
#!/usr/bin/env python2 |
|
"""Script for running llvm validation tests on ChromeOS. |
|
|
|
This script launches a buildbot to build ChromeOS with the llvm on |
|
a particular board; then it finds and downloads the trybot image and the |
|
corresponding official image, and runs test for correctness. |
|
It then generates a report, emails it to the c-compiler-chrome, as |
|
well as copying the result into a directory. |
|
""" |
|
|
|
# Script to test different toolchains against ChromeOS benchmarks. |
|
|
|
from __future__ import print_function |
|
|
|
import argparse |
|
import datetime |
|
import os |
|
import sys |
|
import time |
|
|
|
from cros_utils import command_executer |
|
from cros_utils import logger |
|
|
|
from cros_utils import buildbot_utils |
|
|
|
# CL that uses LLVM to build the peppy image. |
|
USE_LLVM_PATCH = '295217' |
|
|
|
CROSTC_ROOT = '/usr/local/google/crostc' |
|
ROLE_ACCOUNT = 'mobiletc-prebuild' |
|
TOOLCHAIN_DIR = os.path.dirname(os.path.realpath(__file__)) |
|
MAIL_PROGRAM = '~/var/bin/mail-sheriff' |
|
VALIDATION_RESULT_DIR = os.path.join(CROSTC_ROOT, 'validation_result') |
|
START_DATE = datetime.date(2016, 1, 1) |
|
TEST_PER_DAY = 2 |
|
TEST_BOARD = [ |
|
'squawks', # x86_64, rambi (baytrail) |
|
'terra', # x86_64, strago (braswell) |
|
'lulu', # x86_64, auron (broadwell) |
|
'peach_pit', # arm, peach (exynos-5420) |
|
'peppy', # x86_64, slippy (haswell celeron) |
|
'link', # x86_64, ivybridge (ivybridge) |
|
'nyan_big', # arm, nyan (tegra) |
|
'sentry', # x86_64, kunimitsu (skylake-u) |
|
'chell', # x86_64, glados (skylake-y) |
|
'daisy', # arm, daisy (exynos) |
|
'caroline', # amd64 |
|
'kevin', # arm, gru (Rockchip) |
|
] |
|
|
|
|
|
class ToolchainVerifier(object): |
|
"""Class for the toolchain verifier.""" |
|
|
|
def __init__(self, board, chromeos_root, weekday, patches, compiler): |
|
self._board = board |
|
self._chromeos_root = chromeos_root |
|
self._base_dir = os.getcwd() |
|
self._ce = command_executer.GetCommandExecuter() |
|
self._l = logger.GetLogger() |
|
self._compiler = compiler |
|
self._build = '%s-%s-toolchain' % (board, compiler) |
|
self._patches = patches.split(',') if patches else [] |
|
self._patches_string = '_'.join(str(p) for p in self._patches) |
|
|
|
if not weekday: |
|
self._weekday = time.strftime('%a') |
|
else: |
|
self._weekday = weekday |
|
self._reports = os.path.join(VALIDATION_RESULT_DIR, compiler, board) |
|
|
|
def _FinishSetup(self): |
|
"""Make sure testing_rsa file is properly set up.""" |
|
# Fix protections on ssh key |
|
command = ('chmod 600 /var/cache/chromeos-cache/distfiles/target' |
|
'/chrome-src-internal/src/third_party/chromite/ssh_keys' |
|
'/testing_rsa') |
|
ret_val = self._ce.ChrootRunCommand(self._chromeos_root, command) |
|
if ret_val != 0: |
|
raise RuntimeError('chmod for testing_rsa failed') |
|
|
|
def DoAll(self): |
|
"""Main function inside ToolchainComparator class. |
|
|
|
Launch trybot, get image names, create crosperf experiment file, run |
|
crosperf, and copy images into seven-day report directories. |
|
""" |
|
flags = ['--hwtest'] |
|
date_str = datetime.date.today() |
|
description = 'master_%s_%s_%s' % (self._patches_string, self._build, |
|
date_str) |
|
_ = buildbot_utils.GetTrybotImage( |
|
self._chromeos_root, |
|
self._build, |
|
self._patches, |
|
description, |
|
other_flags=flags, |
|
async=True) |
|
|
|
return 0 |
|
|
|
def Main(argv): |
|
"""The main function.""" |
|
|
|
# Common initializations |
|
command_executer.InitCommandExecuter() |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument( |
|
'--chromeos_root', |
|
dest='chromeos_root', |
|
help='The chromeos root from which to run tests.') |
|
parser.add_argument( |
|
'--weekday', |
|
default='', |
|
dest='weekday', |
|
help='The day of the week for which to run tests.') |
|
parser.add_argument( |
|
'--board', default='', dest='board', help='The board to test.') |
|
parser.add_argument( |
|
'--patch', |
|
dest='patches', |
|
default='', |
|
help='The patches to use for the testing, ' |
|
"seprate the patch numbers with ',' " |
|
'for more than one patches.') |
|
parser.add_argument( |
|
'--compiler', |
|
dest='compiler', |
|
help='Which compiler (llvm, llvm-next or gcc) to use for ' |
|
'testing.') |
|
|
|
options = parser.parse_args(argv[1:]) |
|
if not options.chromeos_root: |
|
print('Please specify the ChromeOS root directory.') |
|
return 1 |
|
if not options.compiler: |
|
print('Please specify which compiler to test (gcc, llvm, or llvm-next).') |
|
return 1 |
|
patches = options.patches |
|
if not patches and options.compiler == 'llvm': |
|
patches = USE_LLVM_PATCH |
|
|
|
if options.board: |
|
fv = ToolchainVerifier(options.board, options.chromeos_root, |
|
options.weekday, patches, options.compiler) |
|
return fv.Doall() |
|
|
|
today = datetime.date.today() |
|
delta = today - START_DATE |
|
days = delta.days |
|
|
|
start_board = (days * TEST_PER_DAY) % len(TEST_BOARD) |
|
for i in range(TEST_PER_DAY): |
|
try: |
|
board = TEST_BOARD[(start_board + i) % len(TEST_BOARD)] |
|
fv = ToolchainVerifier(board, options.chromeos_root, options.weekday, |
|
patches, options.compiler) |
|
fv.DoAll() |
|
except SystemExit: |
|
logfile = os.path.join(VALIDATION_RESULT_DIR, options.compiler, board) |
|
with open(logfile, 'w') as f: |
|
f.write('Verifier got an exception, please check the log.\n') |
|
|
|
|
|
if __name__ == '__main__': |
|
retval = Main(sys.argv) |
|
sys.exit(retval)
|
|
|