blob: b9f6c50042712bb4725df3536c2c75334a908263 [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
Caroline Ticeeddb0632016-04-14 09:19:02 -070015import argparse
cmticece5ffa42015-02-12 15:18:43 -080016import datetime
cmtice46093e52014-12-09 14:59:16 -080017import 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
Caroline Ticea8af9a72016-07-20 12:52:59 -070022from cros_utils import command_executer
23from cros_utils import logger
cmtice46093e52014-12-09 14:59:16 -080024
Caroline Ticea8af9a72016-07-20 12:52:59 -070025from cros_utils import buildbot_utils
cmtice46093e52014-12-09 14:59:16 -080026
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,
Caroline Tice0ded5152016-07-25 11:47:58 -0700299 other_flags=['--notests'],
Luis Lozano8a68b2d2015-04-23 14:37:09 -0700300 build_toolchain=True)
cmtice46093e52014-12-09 14:59:16 -0800301
cmticed54f9802015-02-05 11:04:11 -0800302 if len(trybot_image) == 0:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800303 self._l.LogError('Unable to find trybot_image for %s!' % description)
Luis Lozano7f20acb2015-11-04 17:15:08 -0800304 return 1
Luis Lozano783954f2015-12-21 18:06:29 -0800305
Luis Lozanoc75fd052016-02-19 17:37:01 -0800306 vanilla_image = self._GetVanillaImageName(trybot_image)
307 nonafdo_image = self._GetNonAFDOImageName(trybot_image)
Luis Lozano783954f2015-12-21 18:06:29 -0800308
Yunlian Jiang56f13762016-01-06 12:56:24 -0800309 # The trybot image is ready here, in some cases, the vanilla image
310 # is not ready, so we need to make sure vanilla image is available.
311 buildbot_utils.WaitForImage(self._chromeos_root, vanilla_image)
Luis Lozano783954f2015-12-21 18:06:29 -0800312 print('trybot_image: %s' % trybot_image)
313 print('vanilla_image: %s' % vanilla_image)
314 print('nonafdo_image: %s' % nonafdo_image)
Luis Lozanoc75fd052016-02-19 17:37:01 -0800315
cmtice46093e52014-12-09 14:59:16 -0800316 if os.getlogin() == ROLE_ACCOUNT:
317 self._FinishSetup()
318
Luis Lozano783954f2015-12-21 18:06:29 -0800319 self._TestImages(trybot_image, vanilla_image, nonafdo_image)
cmtice7f3190b2015-05-22 14:14:51 -0700320 self._SendEmail()
Yunlian Jiang3c6e4672015-08-24 15:58:22 -0700321 if (self._patches_string == USE_NEXT_GCC_PATCH and
322 self._board in WEEKLY_REPORT_BOARDS):
Luis Lozano7f20acb2015-11-04 17:15:08 -0800323 # Only try to copy the image files if the test runs ran successfully.
Luis Lozano783954f2015-12-21 18:06:29 -0800324 self._CopyWeeklyReportFiles(trybot_image, vanilla_image, nonafdo_image)
cmtice46093e52014-12-09 14:59:16 -0800325 return 0
326
327
328def Main(argv):
329 """The main function."""
330
331 # Common initializations
332 command_executer.InitCommandExecuter()
Caroline Ticeeddb0632016-04-14 09:19:02 -0700333 parser = argparse.ArgumentParser()
334 parser.add_argument('--remote',
335 dest='remote',
336 help='Remote machines to run tests on.')
337 parser.add_argument('--board',
338 dest='board',
339 default='x86-zgb',
340 help='The target board.')
341 parser.add_argument('--chromeos_root',
342 dest='chromeos_root',
343 help='The chromeos root from which to run tests.')
344 parser.add_argument('--weekday',
345 default='',
346 dest='weekday',
347 help='The day of the week for which to run tests.')
348 parser.add_argument('--patch',
349 dest='patches',
350 help='The patches to use for the testing, '
351 "seprate the patch numbers with ',' "
352 'for more than one patches.')
353 parser.add_argument('--noschedv2',
354 dest='noschedv2',
355 action='store_true',
356 default=False,
357 help='Pass --noschedv2 to crosperf.')
Han Shen36413122015-08-28 11:05:40 -0700358
Caroline Ticeeddb0632016-04-14 09:19:02 -0700359 options = parser.parse_args(argv[1:])
cmtice46093e52014-12-09 14:59:16 -0800360 if not options.board:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800361 print('Please give a board.')
cmtice46093e52014-12-09 14:59:16 -0800362 return 1
363 if not options.remote:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800364 print('Please give at least one remote machine.')
cmtice46093e52014-12-09 14:59:16 -0800365 return 1
366 if not options.chromeos_root:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800367 print('Please specify the ChromeOS root directory.')
cmtice46093e52014-12-09 14:59:16 -0800368 return 1
Yunlian Jiang76259e62015-08-21 08:44:31 -0700369 if options.patches:
Yunlian Jiang3c6e4672015-08-24 15:58:22 -0700370 patches = options.patches
371 else:
372 patches = USE_NEXT_GCC_PATCH
Yunlian Jiange52838c2015-08-20 14:32:37 -0700373
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800374 fc = ToolchainComparator(options.board, options.remote, options.chromeos_root,
375 options.weekday, patches, options.noschedv2)
cmtice46093e52014-12-09 14:59:16 -0800376 return fc.DoAll()
377
378
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800379if __name__ == '__main__':
cmtice46093e52014-12-09 14:59:16 -0800380 retval = Main(sys.argv)
381 sys.exit(retval)