306 lines
11 KiB
Python
Executable file
306 lines
11 KiB
Python
Executable file
#!/usr/bin/python2
|
|
#
|
|
# Copyright 2010 Google Inc. All Rights Reserved.
|
|
"""Script to build ChromeOS benchmarks
|
|
|
|
Inputs:
|
|
chromeos_root
|
|
toolchain_root
|
|
board
|
|
[chromeos/cpu/<benchname> |
|
|
chromeos/browser/[pagecycler|sunspider] |
|
|
chromeos/startup]
|
|
|
|
This script assumes toolchain has already been built in toolchain_root.
|
|
|
|
chromeos/cpu/<benchname>
|
|
- Execute bench.py script within chroot to build benchmark
|
|
- Copy build results to perflab-bin
|
|
|
|
chromeos/startup
|
|
- Call build_chromeos to build image.
|
|
- Copy image to perflab-bin
|
|
|
|
chromeos/browser/*
|
|
- Call build_chromebrowser to build image with new browser
|
|
- Copy image to perflab-bin
|
|
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
__author__ = 'bjanakiraman@google.com (Bhaskar Janakiraman)'
|
|
|
|
import argparse
|
|
import os
|
|
import sys
|
|
import re
|
|
|
|
import build_chromeos
|
|
from cros_utils import command_executer
|
|
from cros_utils import logger
|
|
|
|
KNOWN_BENCHMARKS = [
|
|
'chromeos/startup', 'chromeos/browser/pagecycler',
|
|
'chromeos/browser/sunspider', 'chromeos/browser/v8bench',
|
|
'chromeos/cpu/bikjmp'
|
|
]
|
|
|
|
# Commands to build CPU benchmarks.
|
|
|
|
CPU_BUILDCMD_CLEAN = ('cd /usr/local/toolchain_root/third_party/android_bench/'
|
|
'v2_0/CLOSED_SOURCE/%s; python ../../scripts/bench.py '
|
|
'--toolchain=/usr/bin --action=clean;')
|
|
|
|
CPU_BUILDCMD_BUILD = ('cd /usr/local/toolchain_root/third_party/android_bench/'
|
|
'v2_0/CLOSED_SOURCE/%s; python ../../scripts/bench.py '
|
|
'--toolchain=/usr/bin --add_cflags=%s --add_ldflags=%s '
|
|
'--makeopts=%s --action=build')
|
|
|
|
# Common initializations
|
|
cmd_executer = command_executer.GetCommandExecuter()
|
|
|
|
|
|
def Usage(parser, message):
|
|
print('ERROR: %s' % message)
|
|
parser.print_help()
|
|
sys.exit(0)
|
|
|
|
|
|
def CreateRunsh(destdir, benchmark):
|
|
"""Create run.sh script to run benchmark.
|
|
|
|
Perflab needs a run.sh that runs the benchmark.
|
|
"""
|
|
run_cmd = os.path.dirname(os.path.abspath(__file__)) + '/run_benchmarks.py'
|
|
contents = '#!/bin/sh\n%s $@ %s\n' % (run_cmd, benchmark)
|
|
runshfile = destdir + '/run.sh'
|
|
f = open(runshfile, 'w')
|
|
f.write(contents)
|
|
f.close()
|
|
retval = cmd_executer.RunCommand('chmod +x %s' % runshfile)
|
|
return retval
|
|
|
|
|
|
def CreateBinaryCopy(sourcedir, destdir, copy=None):
|
|
"""Create links in perflab-bin/destdir/* to sourcedir/*, instead of copies
|
|
|
|
Args:
|
|
sourcedir: directory from which to copy.
|
|
destdir: directory to which to copy.
|
|
copy: when none, make soft links to everything under sourcedir, otherwise
|
|
copy all to destdir.
|
|
TODO: remove this parameter if it's determined that CopyFiles can use
|
|
rsync -L.
|
|
"""
|
|
retval = 0
|
|
# check if sourcedir exists
|
|
if not os.path.exists(sourcedir):
|
|
logger.GetLogger().LogError('benchmark results %s does not exist.' %
|
|
sourcedir)
|
|
return 1
|
|
|
|
# Deal with old copies - save off old ones for now.
|
|
# Note - if its a link, it doesn't save anything.
|
|
if os.path.exists(destdir):
|
|
command = 'rm -rf %s.old' % destdir
|
|
retval = cmd_executer.RunCommand(command)
|
|
if retval != 0:
|
|
return retval
|
|
command = 'mv %s %s.old' % (destdir, destdir)
|
|
retval = cmd_executer.RunCommand(command)
|
|
if retval != 0:
|
|
return retval
|
|
os.makedirs(destdir)
|
|
sourcedir = os.path.abspath(sourcedir)
|
|
if copy is None:
|
|
command = 'ln -s %s/* %s' % (sourcedir, destdir)
|
|
else:
|
|
command = 'cp -fr %s/* %s' % (sourcedir, destdir)
|
|
retval = cmd_executer.RunCommand(command)
|
|
return retval
|
|
|
|
|
|
def Main(argv):
|
|
"""Build ChromeOS."""
|
|
# Common initializations
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-c',
|
|
'--chromeos_root',
|
|
dest='chromeos_root',
|
|
help='Target directory for ChromeOS installation.')
|
|
parser.add_argument('-t',
|
|
'--toolchain_root',
|
|
dest='toolchain_root',
|
|
help='This is obsolete. Do not use.')
|
|
parser.add_argument('-r',
|
|
'--third_party',
|
|
dest='third_party',
|
|
help='The third_party dir containing android '
|
|
'benchmarks.')
|
|
parser.add_argument('-C',
|
|
'--clean',
|
|
dest='clean',
|
|
action='store_true',
|
|
default=False,
|
|
help='Clean up build.')
|
|
parser.add_argument('-B',
|
|
'--build',
|
|
dest='build',
|
|
action='store_true',
|
|
default=False,
|
|
help='Build benchmark.')
|
|
parser.add_argument('-O',
|
|
'--only_copy',
|
|
dest='only_copy',
|
|
action='store_true',
|
|
default=False,
|
|
help='Only copy to perflab-bin - no builds.')
|
|
parser.add_argument('--workdir',
|
|
dest='workdir',
|
|
default='.',
|
|
help='Work directory for perflab outputs.')
|
|
parser.add_argument('--clobber_chroot',
|
|
dest='clobber_chroot',
|
|
action='store_true',
|
|
help='Delete the chroot and start fresh',
|
|
default=False)
|
|
parser.add_argument('--clobber_board',
|
|
dest='clobber_board',
|
|
action='store_true',
|
|
help='Delete the board and start fresh',
|
|
default=False)
|
|
parser.add_argument('--cflags',
|
|
dest='cflags',
|
|
default='',
|
|
help='CFLAGS for the ChromeOS packages')
|
|
parser.add_argument('--cxxflags',
|
|
dest='cxxflags',
|
|
default='',
|
|
help='CXXFLAGS for the ChromeOS packages')
|
|
parser.add_argument('--ldflags',
|
|
dest='ldflags',
|
|
default='',
|
|
help='LDFLAGS for the ChromeOS packages')
|
|
parser.add_argument('--makeopts',
|
|
dest='makeopts',
|
|
default='',
|
|
help='Make options for the ChromeOS packages')
|
|
parser.add_argument('--board',
|
|
dest='board',
|
|
help='ChromeOS target board, e.g. x86-generic')
|
|
# Leftover positional arguments
|
|
parser.add_argument('args', nargs='+', help='benchmarks')
|
|
|
|
options = parser.parse_args(argv[1:])
|
|
|
|
# validate args
|
|
for arg in options.args:
|
|
if arg not in KNOWN_BENCHMARKS:
|
|
logger.GetLogger().LogFatal('Bad benchmark %s specified' % arg)
|
|
|
|
if options.chromeos_root is None:
|
|
Usage(parser, '--chromeos_root must be set')
|
|
|
|
if options.board is None:
|
|
Usage(parser, '--board must be set')
|
|
|
|
if options.toolchain_root:
|
|
logger.GetLogger().LogWarning('--toolchain_root should not be set')
|
|
|
|
options.chromeos_root = os.path.expanduser(options.chromeos_root)
|
|
options.workdir = os.path.expanduser(options.workdir)
|
|
|
|
retval = 0
|
|
if options.third_party:
|
|
third_party = options.third_party
|
|
else:
|
|
third_party = '%s/../../../third_party' % os.path.dirname(__file__)
|
|
third_party = os.path.realpath(third_party)
|
|
for arg in options.args:
|
|
# CPU benchmarks
|
|
if re.match('chromeos/cpu', arg):
|
|
comps = re.split('/', arg)
|
|
benchname = comps[2]
|
|
|
|
tec_options = []
|
|
if third_party:
|
|
tec_options.append('--third_party=%s' % third_party)
|
|
if options.clean:
|
|
retval = cmd_executer.ChrootRunCommand(options.chromeos_root,
|
|
CPU_BUILDCMD_CLEAN % benchname,
|
|
tec_options=tec_options)
|
|
logger.GetLogger().LogErrorIf(retval,
|
|
'clean of benchmark %s failed.' % arg)
|
|
if options.build:
|
|
retval = cmd_executer.ChrootRunCommand(
|
|
options.chromeos_root,
|
|
CPU_BUILDCMD_BUILD % (benchname, options.cflags, options.ldflags,
|
|
options.makeopts),
|
|
tec_options=tec_options)
|
|
logger.GetLogger().LogErrorIf(retval,
|
|
'Build of benchmark %s failed.' % arg)
|
|
if retval == 0 and (options.build or options.only_copy):
|
|
benchdir = ('%s/android_bench/v2_0/CLOSED_SOURCE/%s' %
|
|
(third_party, benchname))
|
|
linkdir = '%s/perflab-bin/%s' % (options.workdir, arg)
|
|
|
|
# For cpu/*, we need to copy (not symlinks) of all the contents,
|
|
# because they are part of the test fixutre.
|
|
retval = CreateBinaryCopy(benchdir, linkdir, True)
|
|
if retval != 0:
|
|
return retval
|
|
retval = CreateRunsh(linkdir, arg)
|
|
if retval != 0:
|
|
return retval
|
|
elif re.match('chromeos/startup', arg):
|
|
if options.build:
|
|
# Clean for chromeos/browser and chromeos/startup is a Nop
|
|
# since builds are always from scratch.
|
|
build_args = [
|
|
os.path.dirname(os.path.abspath(__file__)) + '/build_chromeos.py',
|
|
'--chromeos_root=' + options.chromeos_root,
|
|
'--board=' + options.board, '--cflags=' + options.cflags,
|
|
'--cxxflags=' + options.cxxflags, '--ldflags=' + options.ldflags,
|
|
'--clobber_board'
|
|
]
|
|
retval = build_chromeos.Main(build_args)
|
|
logger.GetLogger().LogErrorIf(retval, 'Build of ChromeOS failed.')
|
|
if retval == 0 and (options.build or options.only_copy):
|
|
benchdir = '%s/src/build/images/%s/latest' % (options.chromeos_root,
|
|
options.board)
|
|
linkdir = '%s/perflab-bin/%s' % (options.workdir, arg)
|
|
retval = CreateBinaryCopy(benchdir, linkdir)
|
|
if retval != 0:
|
|
return retval
|
|
CreateRunsh(linkdir, arg)
|
|
if retval != 0:
|
|
return retval
|
|
elif re.match('chromeos/browser', arg):
|
|
if options.build:
|
|
# For now, re-build os. TBD: Change to call build_browser
|
|
build_args = [os.path.dirname(os.path.abspath(__file__)) +
|
|
'/build_chrome_browser.py',
|
|
'--chromeos_root=' + options.chromeos_root,
|
|
'--board=' + options.board, '--cflags=' + options.cflags,
|
|
'--cxxflags=' + options.cxxflags,
|
|
'--ldflags=' + options.ldflags]
|
|
retval = build_chromeos.Main(build_args)
|
|
logger.GetLogger().LogErrorIf(retval, 'Build of ChromeOS failed.')
|
|
if retval == 0 and (options.build or options.only_copy):
|
|
benchdir = '%s/src/build/images/%s/latest' % (options.chromeos_root,
|
|
options.board)
|
|
linkdir = '%s/perflab-bin/%s' % (options.workdir, arg)
|
|
retval = CreateBinaryCopy(benchdir, linkdir)
|
|
if retval != 0:
|
|
return retval
|
|
retval = CreateRunsh(linkdir, arg)
|
|
if retval != 0:
|
|
return retval
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(Main(sys.argv))
|