blob: 58e76b45b788ab6090eef94298279c6ee2a7b689 [file] [log] [blame]
Yunlian Jiang14cf5962015-12-11 15:50:14 -08001#!/usr/bin/python2
2"""Script for running nightly compiler tests on ChromeOS.
cmtice46093e52014-12-09 14:59:16 -08003
4This script launches a buildbot to build ChromeOS with the latest compiler on
5a particular board; then it finds and downloads the trybot image and the
6corresponding official image, and runs crosperf performance tests comparing
7the two. It then generates a report, emails it to the c-compiler-chrome, as
8well as copying the images into the seven-day reports directory.
9"""
10
11# Script to test different toolchains against ChromeOS benchmarks.
Yunlian Jiang14cf5962015-12-11 15:50:14 -080012
13from __future__ import print_function
14
cmticece5ffa42015-02-12 15:18:43 -080015import datetime
cmtice46093e52014-12-09 14:59:16 -080016import optparse
17import os
Luis Lozanoc75fd052016-02-19 17:37:01 -080018import re
cmtice46093e52014-12-09 14:59:16 -080019import sys
20import time
cmtice46093e52014-12-09 14:59:16 -080021
22from utils import command_executer
23from utils import logger
24
25from utils import buildbot_utils
26
27# CL that updated GCC ebuilds to use 'next_gcc'.
Luis Lozanof2a3ef42015-12-15 13:49:30 -080028USE_NEXT_GCC_PATCH = '230260'
Yunlian Jiang3c6e4672015-08-24 15:58:22 -070029
Yunlian Jiang2f563562015-08-28 13:54:04 -070030# CL that uses LLVM to build the peppy image.
Luis Lozanof2a3ef42015-12-15 13:49:30 -080031USE_LLVM_PATCH = '295217'
Yunlian Jiang2f563562015-08-28 13:54:04 -070032
Yunlian Jiang3c6e4672015-08-24 15:58:22 -070033# The boards on which we run weekly reports
Luis Lozanof2a3ef42015-12-15 13:49:30 -080034WEEKLY_REPORT_BOARDS = ['lumpy']
cmtice46093e52014-12-09 14:59:16 -080035
Luis Lozanof2a3ef42015-12-15 13:49:30 -080036CROSTC_ROOT = '/usr/local/google/crostc'
37ROLE_ACCOUNT = 'mobiletc-prebuild'
cmtice46093e52014-12-09 14:59:16 -080038TOOLCHAIN_DIR = os.path.dirname(os.path.realpath(__file__))
Luis Lozanof2a3ef42015-12-15 13:49:30 -080039MAIL_PROGRAM = '~/var/bin/mail-sheriff'
40WEEKLY_REPORTS_ROOT = os.path.join(CROSTC_ROOT, 'weekly_test_data')
41PENDING_ARCHIVES_DIR = os.path.join(CROSTC_ROOT, 'pending_archives')
42NIGHTLY_TESTS_DIR = os.path.join(CROSTC_ROOT, 'nightly_test_reports')
43
Luis Lozanoc75fd052016-02-19 17:37:01 -080044IMAGE_FS = (r'{board}-{image_type}/{chrome_version}-{tip}\.' +
45 r'{branch}\.{branch_branch}')
46TRYBOT_IMAGE_FS = 'trybot-' + IMAGE_FS + '-{build_id}'
47PFQ_IMAGE_FS = IMAGE_FS + '-rc1'
48IMAGE_RE_GROUPS = {'board': r'(?P<board>\S+)',
49 'image_type': r'(?P<image_type>\S+)',
50 'chrome_version': r'(?P<chrome_version>R\d+)',
51 'tip': r'(?P<tip>\d+)',
52 'branch': r'(?P<branch>\d+)',
53 'branch_branch': r'(?P<branch_branch>\d+)',
54 'build_id': r'(?P<build_id>b\d+)'}
55TRYBOT_IMAGE_RE = TRYBOT_IMAGE_FS.format(**IMAGE_RE_GROUPS)
56
cmtice46093e52014-12-09 14:59:16 -080057
Yunlian Jiang14cf5962015-12-11 15:50:14 -080058class ToolchainComparator(object):
59 """Class for doing the nightly tests work."""
cmtice46093e52014-12-09 14:59:16 -080060
Luis Lozanof2a3ef42015-12-15 13:49:30 -080061 def __init__(self,
62 board,
63 remotes,
64 chromeos_root,
65 weekday,
66 patches,
67 noschedv2=False):
cmtice46093e52014-12-09 14:59:16 -080068 self._board = board
69 self._remotes = remotes
70 self._chromeos_root = chromeos_root
71 self._base_dir = os.getcwd()
72 self._ce = command_executer.GetCommandExecuter()
73 self._l = logger.GetLogger()
Luis Lozanof2a3ef42015-12-15 13:49:30 -080074 self._build = '%s-release' % board
Yunlian Jiang3c6e4672015-08-24 15:58:22 -070075 self._patches = patches.split(',')
76 self._patches_string = '_'.join(str(p) for p in self._patches)
Han Shen43494292015-09-14 10:26:40 -070077 self._noschedv2 = noschedv2
Yunlian Jiang3c6e4672015-08-24 15:58:22 -070078
cmtice46093e52014-12-09 14:59:16 -080079 if not weekday:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080080 self._weekday = time.strftime('%a')
cmtice46093e52014-12-09 14:59:16 -080081 else:
82 self._weekday = weekday
cmtice7f3190b2015-05-22 14:14:51 -070083 timestamp = datetime.datetime.strftime(datetime.datetime.now(),
Luis Lozanof2a3ef42015-12-15 13:49:30 -080084 '%Y-%m-%d_%H:%M:%S')
Caroline Ticeebbc3da2015-09-03 10:27:20 -070085 self._reports_dir = os.path.join(NIGHTLY_TESTS_DIR,
Luis Lozanof2a3ef42015-12-15 13:49:30 -080086 '%s.%s' % (timestamp, board),)
cmtice46093e52014-12-09 14:59:16 -080087
Luis Lozanoc75fd052016-02-19 17:37:01 -080088 def _GetVanillaImageName(self, trybot_image):
89 """Given a trybot artifact name, get corresponding vanilla image name.
cmtice46093e52014-12-09 14:59:16 -080090
Luis Lozano783954f2015-12-21 18:06:29 -080091 Args:
92 trybot_image: artifact name such as
93 'trybot-daisy-release/R40-6394.0.0-b1389'
94
95 Returns:
96 Corresponding official image name, e.g. 'daisy-release/R40-6394.0.0'.
cmtice46093e52014-12-09 14:59:16 -080097 """
Luis Lozanoc75fd052016-02-19 17:37:01 -080098 mo = re.search(TRYBOT_IMAGE_RE, trybot_image)
99 assert mo
100 return IMAGE_FS.replace('\\', '').format(**mo.groupdict())
cmtice46093e52014-12-09 14:59:16 -0800101
Luis Lozanoc75fd052016-02-19 17:37:01 -0800102 def _GetNonAFDOImageName(self, trybot_image):
103 """Given a trybot artifact name, get corresponding non-AFDO image name.
104
105 We get the non-AFDO image from the PFQ builders. This image
106 is not generated for all the boards and, the closest PFQ image
107 was the one build for the previous ChromeOS version (the chrome
108 used in the current version is the one validated in the previous
109 version).
110 The previous ChromeOS does not always exist either. So, we try
111 a couple of versions before.
Luis Lozano783954f2015-12-21 18:06:29 -0800112
113 Args:
114 trybot_image: artifact name such as
115 'trybot-daisy-release/R40-6394.0.0-b1389'
116
117 Returns:
118 Corresponding chrome PFQ image name, e.g.
Luis Lozanoc75fd052016-02-19 17:37:01 -0800119 'daisy-chrome-pfq/R40-6393.0.0-rc1'.
Luis Lozano783954f2015-12-21 18:06:29 -0800120 """
Luis Lozanoc75fd052016-02-19 17:37:01 -0800121 mo = re.search(TRYBOT_IMAGE_RE, trybot_image)
122 assert mo
123 image_dict = mo.groupdict()
124 image_dict['image_type'] = 'chrome-pfq'
125 for _ in xrange(2):
126 image_dict['tip'] = str(int(image_dict['tip']) - 1)
127 nonafdo_image = PFQ_IMAGE_FS.replace('\\', '').format(**image_dict)
128 if buildbot_utils.DoesImageExist(self._chromeos_root, nonafdo_image):
129 return nonafdo_image
130 return ''
Luis Lozano783954f2015-12-21 18:06:29 -0800131
cmtice46093e52014-12-09 14:59:16 -0800132 def _FinishSetup(self):
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800133 """Make sure testing_rsa file is properly set up."""
cmtice46093e52014-12-09 14:59:16 -0800134 # Fix protections on ssh key
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800135 command = ('chmod 600 /var/cache/chromeos-cache/distfiles/target'
136 '/chrome-src-internal/src/third_party/chromite/ssh_keys'
137 '/testing_rsa')
cmtice46093e52014-12-09 14:59:16 -0800138 ret_val = self._ce.ChrootRunCommand(self._chromeos_root, command)
cmtice7f3190b2015-05-22 14:14:51 -0700139 if ret_val != 0:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800140 raise RuntimeError('chmod for testing_rsa failed')
cmtice46093e52014-12-09 14:59:16 -0800141
Luis Lozano783954f2015-12-21 18:06:29 -0800142 def _TestImages(self, trybot_image, vanilla_image, nonafdo_image):
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800143 """Create crosperf experiment file.
cmtice46093e52014-12-09 14:59:16 -0800144
Luis Lozano783954f2015-12-21 18:06:29 -0800145 Given the names of the trybot, vanilla and non-AFDO images, create the
cmtice46093e52014-12-09 14:59:16 -0800146 appropriate crosperf experiment file and launch crosperf on it.
147 """
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800148 experiment_file_dir = os.path.join(self._chromeos_root, '..', self._weekday)
149 experiment_file_name = '%s_toolchain_experiment.txt' % self._board
Yunlian Jiang2f563562015-08-28 13:54:04 -0700150
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800151 compiler_string = 'gcc'
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800152 if USE_LLVM_PATCH in self._patches_string:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800153 experiment_file_name = '%s_llvm_experiment.txt' % self._board
154 compiler_string = 'llvm'
Yunlian Jiang2f563562015-08-28 13:54:04 -0700155
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800156 experiment_file = os.path.join(experiment_file_dir, experiment_file_name)
cmtice46093e52014-12-09 14:59:16 -0800157 experiment_header = """
158 board: %s
159 remote: %s
Luis Lozanoe1efeb82015-06-16 16:35:44 -0700160 retries: 1
cmtice46093e52014-12-09 14:59:16 -0800161 """ % (self._board, self._remotes)
162 experiment_tests = """
Luis Lozano1489d642015-12-08 10:08:19 -0800163 benchmark: all_toolchain_perf {
cmtice46093e52014-12-09 14:59:16 -0800164 suite: telemetry_Crosperf
165 iterations: 3
166 }
167 """
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800168
169 with open(experiment_file, 'w') as f:
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800170 f.write(experiment_header)
171 f.write(experiment_tests)
cmtice46093e52014-12-09 14:59:16 -0800172
173 # Now add vanilla to test file.
174 official_image = """
175 vanilla_image {
176 chromeos_root: %s
177 build: %s
Caroline Ticeddde5052015-09-23 09:43:35 -0700178 compiler: gcc
cmtice46093e52014-12-09 14:59:16 -0800179 }
180 """ % (self._chromeos_root, vanilla_image)
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800181 f.write(official_image)
cmtice46093e52014-12-09 14:59:16 -0800182
Luis Lozano783954f2015-12-21 18:06:29 -0800183 # Now add non-AFDO image to test file.
Luis Lozano439f2b72016-01-08 11:56:02 -0800184 if nonafdo_image:
185 official_nonafdo_image = """
Luis Lozano783954f2015-12-21 18:06:29 -0800186 nonafdo_image {
187 chromeos_root: %s
188 build: %s
189 compiler: gcc
190 }
191 """ % (self._chromeos_root, nonafdo_image)
Luis Lozano439f2b72016-01-08 11:56:02 -0800192 f.write(official_nonafdo_image)
Luis Lozano783954f2015-12-21 18:06:29 -0800193
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800194 label_string = '%s_trybot_image' % compiler_string
Caroline Tice80eab982015-11-04 14:03:14 -0800195 if USE_NEXT_GCC_PATCH in self._patches:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800196 label_string = 'gcc_next_trybot_image'
Caroline Tice80eab982015-11-04 14:03:14 -0800197
cmtice46093e52014-12-09 14:59:16 -0800198 experiment_image = """
Caroline Tice80eab982015-11-04 14:03:14 -0800199 %s {
cmtice46093e52014-12-09 14:59:16 -0800200 chromeos_root: %s
201 build: %s
Caroline Ticeddde5052015-09-23 09:43:35 -0700202 compiler: %s
cmtice46093e52014-12-09 14:59:16 -0800203 }
Caroline Tice80eab982015-11-04 14:03:14 -0800204 """ % (label_string, self._chromeos_root, trybot_image,
205 compiler_string)
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800206 f.write(experiment_image)
cmtice46093e52014-12-09 14:59:16 -0800207
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800208 crosperf = os.path.join(TOOLCHAIN_DIR, 'crosperf', 'crosperf')
Han Shen43494292015-09-14 10:26:40 -0700209 noschedv2_opts = '--noschedv2' if self._noschedv2 else ''
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800210 command = ('{crosperf} --no_email=True --results_dir={r_dir} '
211 '--json_report=True {noschedv2_opts} {exp_file}').format(
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800212 crosperf=crosperf,
213 r_dir=self._reports_dir,
214 noschedv2_opts=noschedv2_opts,
215 exp_file=experiment_file)
cmticeaa700b02015-06-12 13:26:47 -0700216
cmtice46093e52014-12-09 14:59:16 -0800217 ret = self._ce.RunCommand(command)
cmtice7f3190b2015-05-22 14:14:51 -0700218 if ret != 0:
219 raise RuntimeError("Couldn't run crosperf!")
Caroline Ticeebbc3da2015-09-03 10:27:20 -0700220 else:
221 # Copy json report to pending archives directory.
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800222 command = 'cp %s/*.json %s/.' % (self._reports_dir, PENDING_ARCHIVES_DIR)
Caroline Ticeebbc3da2015-09-03 10:27:20 -0700223 ret = self._ce.RunCommand(command)
cmtice7f3190b2015-05-22 14:14:51 -0700224 return
cmtice46093e52014-12-09 14:59:16 -0800225
Luis Lozano783954f2015-12-21 18:06:29 -0800226 def _CopyWeeklyReportFiles(self, trybot_image, vanilla_image, nonafdo_image):
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800227 """Put files in place for running seven-day reports.
cmtice46093e52014-12-09 14:59:16 -0800228
229 Create tar files of the custom and official images and copy them
230 to the weekly reports directory, so they exist when the weekly report
231 gets generated. IMPORTANT NOTE: This function must run *after*
232 crosperf has been run; otherwise the vanilla images will not be there.
233 """
234
235 dry_run = False
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800236 if os.getlogin() != ROLE_ACCOUNT:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800237 self._l.LogOutput('Running this from non-role account; not copying '
238 'tar files for weekly reports.')
cmtice46093e52014-12-09 14:59:16 -0800239 dry_run = True
240
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800241 images_path = os.path.join(
242 os.path.realpath(self._chromeos_root), 'chroot/tmp')
cmtice46093e52014-12-09 14:59:16 -0800243
244 data_dir = os.path.join(WEEKLY_REPORTS_ROOT, self._board)
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800245 dest_dir = os.path.join(data_dir, self._weekday)
cmtice46093e52014-12-09 14:59:16 -0800246 if not os.path.exists(dest_dir):
247 os.makedirs(dest_dir)
248
249 # Make sure dest_dir is empty (clean out last week's data).
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800250 cmd = 'cd %s; rm -Rf %s_*_image*' % (dest_dir, self._weekday)
cmtice46093e52014-12-09 14:59:16 -0800251 if dry_run:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800252 print('CMD: %s' % cmd)
cmtice46093e52014-12-09 14:59:16 -0800253 else:
254 self._ce.RunCommand(cmd)
255
256 # Now create new tar files and copy them over.
Luis Lozano439f2b72016-01-08 11:56:02 -0800257 labels = {'test': trybot_image, 'vanilla': vanilla_image}
258 if nonafdo_image:
259 labels['nonafdo'] = nonafdo_image
260 for label_name, test_path in labels.iteritems():
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800261 tar_file_name = '%s_%s_image.tar' % (self._weekday, label_name)
262 cmd = ('cd %s; tar -cvf %s %s/chromiumos_test_image.bin; '
263 'cp %s %s/.') % (images_path, tar_file_name, test_path,
264 tar_file_name, dest_dir)
cmtice46093e52014-12-09 14:59:16 -0800265 if dry_run:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800266 print('CMD: %s' % cmd)
cmtice46093e52014-12-09 14:59:16 -0800267 tar_ret = 0
268 else:
269 tar_ret = self._ce.RunCommand(cmd)
270 if tar_ret:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800271 self._l.LogOutput('Error while creating/copying test tar file(%s).' %
272 tar_file_name)
cmtice46093e52014-12-09 14:59:16 -0800273
cmtice7f3190b2015-05-22 14:14:51 -0700274 def _SendEmail(self):
275 """Find email message generated by crosperf and send it."""
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800276 filename = os.path.join(self._reports_dir, 'msg_body.html')
cmtice7f3190b2015-05-22 14:14:51 -0700277 if (os.path.exists(filename) and
278 os.path.exists(os.path.expanduser(MAIL_PROGRAM))):
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800279 email_title = 'buildbot test results'
Yunlian Jiang2f563562015-08-28 13:54:04 -0700280 if self._patches_string == USE_LLVM_PATCH:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800281 email_title = 'buildbot llvm test results'
282 command = ('cat %s | %s -s "%s, %s" -team -html' %
283 (filename, MAIL_PROGRAM, email_title, self._board))
cmtice7f3190b2015-05-22 14:14:51 -0700284 self._ce.RunCommand(command)
cmtice46093e52014-12-09 14:59:16 -0800285
286 def DoAll(self):
Yunlian Jiang14cf5962015-12-11 15:50:14 -0800287 """Main function inside ToolchainComparator class.
cmtice46093e52014-12-09 14:59:16 -0800288
289 Launch trybot, get image names, create crosperf experiment file, run
290 crosperf, and copy images into seven-day report directories.
291 """
cmticece5ffa42015-02-12 15:18:43 -0800292 date_str = datetime.date.today()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800293 description = 'master_%s_%s_%s' % (self._patches_string, self._build,
Han Shenfe054f12015-02-18 15:00:13 -0800294 date_str)
cmtice46093e52014-12-09 14:59:16 -0800295 trybot_image = buildbot_utils.GetTrybotImage(self._chromeos_root,
296 self._build,
Yunlian Jiang3c6e4672015-08-24 15:58:22 -0700297 self._patches,
Luis Lozano8a68b2d2015-04-23 14:37:09 -0700298 description,
299 build_toolchain=True)
cmtice46093e52014-12-09 14:59:16 -0800300
cmticed54f9802015-02-05 11:04:11 -0800301 if len(trybot_image) == 0:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800302 self._l.LogError('Unable to find trybot_image for %s!' % description)
Luis Lozano7f20acb2015-11-04 17:15:08 -0800303 return 1
Luis Lozano783954f2015-12-21 18:06:29 -0800304
Luis Lozanoc75fd052016-02-19 17:37:01 -0800305 vanilla_image = self._GetVanillaImageName(trybot_image)
306 nonafdo_image = self._GetNonAFDOImageName(trybot_image)
Luis Lozano783954f2015-12-21 18:06:29 -0800307
Yunlian Jiang56f13762016-01-06 12:56:24 -0800308 # The trybot image is ready here, in some cases, the vanilla image
309 # is not ready, so we need to make sure vanilla image is available.
310 buildbot_utils.WaitForImage(self._chromeos_root, vanilla_image)
Luis Lozano783954f2015-12-21 18:06:29 -0800311 print('trybot_image: %s' % trybot_image)
312 print('vanilla_image: %s' % vanilla_image)
313 print('nonafdo_image: %s' % nonafdo_image)
Luis Lozanoc75fd052016-02-19 17:37:01 -0800314
cmtice46093e52014-12-09 14:59:16 -0800315 if os.getlogin() == ROLE_ACCOUNT:
316 self._FinishSetup()
317
Luis Lozano783954f2015-12-21 18:06:29 -0800318 self._TestImages(trybot_image, vanilla_image, nonafdo_image)
cmtice7f3190b2015-05-22 14:14:51 -0700319 self._SendEmail()
Yunlian Jiang3c6e4672015-08-24 15:58:22 -0700320 if (self._patches_string == USE_NEXT_GCC_PATCH and
321 self._board in WEEKLY_REPORT_BOARDS):
Luis Lozano7f20acb2015-11-04 17:15:08 -0800322 # Only try to copy the image files if the test runs ran successfully.
Luis Lozano783954f2015-12-21 18:06:29 -0800323 self._CopyWeeklyReportFiles(trybot_image, vanilla_image, nonafdo_image)
cmtice46093e52014-12-09 14:59:16 -0800324 return 0
325
326
327def Main(argv):
328 """The main function."""
329
330 # Common initializations
331 command_executer.InitCommandExecuter()
332 parser = optparse.OptionParser()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800333 parser.add_option('--remote',
334 dest='remote',
335 help='Remote machines to run tests on.')
336 parser.add_option('--board',
337 dest='board',
338 default='x86-zgb',
339 help='The target board.')
340 parser.add_option('--chromeos_root',
341 dest='chromeos_root',
342 help='The chromeos root from which to run tests.')
343 parser.add_option('--weekday',
344 default='',
345 dest='weekday',
346 help='The day of the week for which to run tests.')
347 parser.add_option('--patch',
348 dest='patches',
349 help='The patches to use for the testing, '
Yunlian Jiange52838c2015-08-20 14:32:37 -0700350 "seprate the patch numbers with ',' "
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800351 'for more than one patches.')
352 parser.add_option('--noschedv2',
353 dest='noschedv2',
354 action='store_true',
Han Shen36413122015-08-28 11:05:40 -0700355 default=False,
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800356 help='Pass --noschedv2 to crosperf.')
Han Shen36413122015-08-28 11:05:40 -0700357
cmtice46093e52014-12-09 14:59:16 -0800358 options, _ = parser.parse_args(argv)
359 if not options.board:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800360 print('Please give a board.')
cmtice46093e52014-12-09 14:59:16 -0800361 return 1
362 if not options.remote:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800363 print('Please give at least one remote machine.')
cmtice46093e52014-12-09 14:59:16 -0800364 return 1
365 if not options.chromeos_root:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800366 print('Please specify the ChromeOS root directory.')
cmtice46093e52014-12-09 14:59:16 -0800367 return 1
Yunlian Jiang76259e62015-08-21 08:44:31 -0700368 if options.patches:
Yunlian Jiang3c6e4672015-08-24 15:58:22 -0700369 patches = options.patches
370 else:
371 patches = USE_NEXT_GCC_PATCH
Yunlian Jiange52838c2015-08-20 14:32:37 -0700372
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800373 fc = ToolchainComparator(options.board, options.remote, options.chromeos_root,
374 options.weekday, patches, options.noschedv2)
cmtice46093e52014-12-09 14:59:16 -0800375 return fc.DoAll()
376
377
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800378if __name__ == '__main__':
cmtice46093e52014-12-09 14:59:16 -0800379 retval = Main(sys.argv)
380 sys.exit(retval)