blob: 906f0ccbcc341aae6e64857db9ca005abdee1f1d [file] [log] [blame]
#!/usr/bin/python
#
# 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
"""
__author__ = "bjanakiraman@google.com (Bhaskar Janakiraman)"
import optparse
import os
import sys
import re
import build_chromeos
import tc_enter_chroot
from utils import command_executer
from 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: " + 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/* for now, instead of copies
Args:
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 = optparse.OptionParser()
parser.add_option("-c", "--chromeos_root", dest="chromeos_root",
help="Target directory for ChromeOS installation.")
parser.add_option("-t", "--toolchain_root", dest="toolchain_root",
help="This is obsolete. Do not use.")
parser.add_option("-r", "--third_party", dest="third_party",
help="The third_party dir containing android benchmarks.")
parser.add_option("-C", "--clean", dest="clean", action="store_true",
default=False, help="Clean up build."),
parser.add_option("-B", "--build", dest="build", action="store_true",
default=False, help="Build benchmark."),
parser.add_option("-O", "--only_copy", dest="only_copy", action="store_true",
default=False, help="Only copy to perflab-bin - no builds."),
parser.add_option("--workdir", dest="workdir", default=".",
help="Work directory for perflab outputs.")
parser.add_option("--clobber_chroot", dest="clobber_chroot",
action="store_true", help=
"Delete the chroot and start fresh", default=False)
parser.add_option("--clobber_board", dest="clobber_board",
action="store_true",
help="Delete the board and start fresh", default=False)
parser.add_option("--cflags", dest="cflags", default="",
help="CFLAGS for the ChromeOS packages")
parser.add_option("--cxxflags", dest="cxxflags",default="",
help="CXXFLAGS for the ChromeOS packages")
parser.add_option("--ldflags", dest="ldflags", default="",
help="LDFLAGS for the ChromeOS packages")
parser.add_option("--makeopts", dest="makeopts", default="",
help="Make options for the ChromeOS packages")
parser.add_option("--board", dest="board",
help="ChromeOS target board, e.g. x86-generic")
(options,args) = parser.parse_args(argv[1:])
# validate args
for arg in 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 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))