blob: 906f0ccbcc341aae6e64857db9ca005abdee1f1d [file] [log] [blame]
Mike Frysingerc7f15932013-03-20 13:43:35 -04001#!/usr/bin/python
bjanakiraman6496e5f2013-02-15 04:50:58 +00002#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Script to build ChromeOS benchmarks
6
bjanakiraman229d6262013-02-15 04:56:46 +00007Inputs:
bjanakiraman6496e5f2013-02-15 04:50:58 +00008 chromeos_root
9 toolchain_root
10 board
11 [chromeos/cpu/<benchname>|chromeos/browser/[pagecycler|sunspider]|chromeos/startup]
bjanakiraman229d6262013-02-15 04:56:46 +000012
bjanakiraman6496e5f2013-02-15 04:50:58 +000013 This script assumes toolchain has already been built in toolchain_root.
14
15 chromeos/cpu/<benchname>
16 - Execute bench.py script within chroot to build benchmark
17 - Copy build results to perflab-bin
18
19 chromeos/startup
bjanakiraman229d6262013-02-15 04:56:46 +000020 - Call build_chromeos to build image.
bjanakiraman6496e5f2013-02-15 04:50:58 +000021 - Copy image to perflab-bin
bjanakiraman229d6262013-02-15 04:56:46 +000022
bjanakiraman6496e5f2013-02-15 04:50:58 +000023 chromeos/browser/*
24 - Call build_chromebrowser to build image with new browser
25 - Copy image to perflab-bin
26
27"""
28
29__author__ = "bjanakiraman@google.com (Bhaskar Janakiraman)"
30
31import optparse
32import os
33import sys
34import re
kbaclawski20082a02013-02-16 02:12:57 +000035
bjanakiraman6496e5f2013-02-15 04:50:58 +000036import build_chromeos
kbaclawski20082a02013-02-16 02:12:57 +000037import tc_enter_chroot
bjanakiraman6496e5f2013-02-15 04:50:58 +000038from utils import command_executer
39from utils import logger
bjanakiraman6496e5f2013-02-15 04:50:58 +000040
41
42KNOWN_BENCHMARKS = [
43 'chromeos/startup',
44 'chromeos/browser/pagecycler',
45 'chromeos/browser/sunspider',
bjanakiramane7a379a2013-02-15 10:24:30 +000046 'chromeos/browser/v8bench',
bjanakiraman6496e5f2013-02-15 04:50:58 +000047 'chromeos/cpu/bikjmp' ]
48
bjanakiraman229d6262013-02-15 04:56:46 +000049# Commands to build CPU benchmarks.
bjanakiramanaabd2d12013-02-15 04:55:30 +000050
asharif8697d4e2013-02-15 09:18:09 +000051CPU_BUILDCMD_CLEAN = "cd /usr/local/toolchain_root/third_party/android_bench/v2_0/CLOSED_SOURCE/%s;\
bjanakiramanaabd2d12013-02-15 04:55:30 +000052python ../../scripts/bench.py --toolchain=/usr/bin --action=clean;"
53
asharif8697d4e2013-02-15 09:18:09 +000054CPU_BUILDCMD_BUILD = "cd /usr/local/toolchain_root/third_party/android_bench/v2_0/CLOSED_SOURCE/%s;\
bjanakiraman6496e5f2013-02-15 04:50:58 +000055python ../../scripts/bench.py --toolchain=/usr/bin --add_cflags=%s --add_ldflags=%s --makeopts=%s --action=build"
56
57
bjanakiramanaabd2d12013-02-15 04:55:30 +000058# Common initializations
59cmd_executer = command_executer.GetCommandExecuter()
60
bjanakiraman6496e5f2013-02-15 04:50:58 +000061
62def Usage(parser, message):
63 print "ERROR: " + message
64 parser.print_help()
65 sys.exit(0)
66
67
bjanakiraman229d6262013-02-15 04:56:46 +000068def CreateRunsh(destdir, benchmark):
69 """Create run.sh script to run benchmark. Perflab needs a run.sh that runs the benchmark."""
70 run_cmd = os.path.dirname(os.path.abspath(__file__)) + "/run_benchmarks.py"
71 contents = "#!/bin/sh\n%s $@ %s\n" % (run_cmd, benchmark)
72 runshfile = destdir + '/run.sh'
73 f = open(runshfile, 'w')
74 f.write(contents)
75 f.close()
asharifef75f392013-02-15 10:22:49 +000076 retval = cmd_executer.RunCommand('chmod +x %s' % runshfile)
77 return retval
bjanakiraman229d6262013-02-15 04:56:46 +000078
79
shenhan12089d42013-02-15 20:32:18 +000080def CreateBinaryCopy(sourcedir, destdir, copy = None):
81 """Create links in perflab-bin/destdir/* to sourcedir/* for now, instead of copies
82 Args:
83 copy: when none, make soft links to everything under sourcedir, otherwise
84 copy all to destdir.
85 TODO: remove this parameter if it's determined that CopyFiles can use
86 rsync -L.
87 """
bjanakiramane7a379a2013-02-15 10:24:30 +000088 retval = 0
bjanakiramanaabd2d12013-02-15 04:55:30 +000089 # check if sourcedir exists
90 if not os.path.exists(sourcedir):
kbaclawski6999ada2013-02-15 19:57:09 +000091 logger.GetLogger().LogError("benchmark results %s does not exist." %
92 sourcedir)
bjanakiraman229d6262013-02-15 04:56:46 +000093 return 1
bjanakiramanaabd2d12013-02-15 04:55:30 +000094
95 # Deal with old copies - save off old ones for now.
bjanakiraman229d6262013-02-15 04:56:46 +000096 # Note - if its a link, it doesn't save anything.
bjanakiramanaabd2d12013-02-15 04:55:30 +000097 if os.path.exists(destdir):
bjanakiraman229d6262013-02-15 04:56:46 +000098 command = 'rm -rf %s.old' % destdir
bjanakiramane7a379a2013-02-15 10:24:30 +000099 retval = cmd_executer.RunCommand(command)
100 if retval != 0:
101 return retval
bjanakiramanaabd2d12013-02-15 04:55:30 +0000102 command = 'mv %s %s.old' % (destdir, destdir)
bjanakiramane7a379a2013-02-15 10:24:30 +0000103 retval = cmd_executer.RunCommand(command)
104 if retval != 0:
105 return retval
bjanakiraman229d6262013-02-15 04:56:46 +0000106 os.makedirs(destdir)
bjanakiramanaabd2d12013-02-15 04:55:30 +0000107 sourcedir = os.path.abspath(sourcedir)
shenhan12089d42013-02-15 20:32:18 +0000108 if copy is None:
109 command = 'ln -s %s/* %s' % (sourcedir, destdir)
110 else:
111 command = 'cp -fr %s/* %s' % (sourcedir, destdir)
asharifef75f392013-02-15 10:22:49 +0000112 retval = cmd_executer.RunCommand(command)
113 return retval
bjanakiramanaabd2d12013-02-15 04:55:30 +0000114
115
bjanakiraman6496e5f2013-02-15 04:50:58 +0000116def Main(argv):
117 """Build ChromeOS."""
118 # Common initializations
119
120 parser = optparse.OptionParser()
121 parser.add_option("-c", "--chromeos_root", dest="chromeos_root",
122 help="Target directory for ChromeOS installation.")
123 parser.add_option("-t", "--toolchain_root", dest="toolchain_root",
asharif8697d4e2013-02-15 09:18:09 +0000124 help="This is obsolete. Do not use.")
125 parser.add_option("-r", "--third_party", dest="third_party",
126 help="The third_party dir containing android benchmarks.")
bjanakiramanaabd2d12013-02-15 04:55:30 +0000127 parser.add_option("-C", "--clean", dest="clean", action="store_true",
128 default=False, help="Clean up build."),
bjanakiraman229d6262013-02-15 04:56:46 +0000129 parser.add_option("-B", "--build", dest="build", action="store_true",
bjanakiramanaabd2d12013-02-15 04:55:30 +0000130 default=False, help="Build benchmark."),
bjanakiraman229d6262013-02-15 04:56:46 +0000131 parser.add_option("-O", "--only_copy", dest="only_copy", action="store_true",
bjanakiramanaabd2d12013-02-15 04:55:30 +0000132 default=False, help="Only copy to perflab-bin - no builds."),
bjanakiraman229d6262013-02-15 04:56:46 +0000133 parser.add_option("--workdir", dest="workdir", default=".",
134 help="Work directory for perflab outputs.")
bjanakiraman6496e5f2013-02-15 04:50:58 +0000135 parser.add_option("--clobber_chroot", dest="clobber_chroot",
136 action="store_true", help=
137 "Delete the chroot and start fresh", default=False)
138 parser.add_option("--clobber_board", dest="clobber_board",
139 action="store_true",
140 help="Delete the board and start fresh", default=False)
141 parser.add_option("--cflags", dest="cflags", default="",
142 help="CFLAGS for the ChromeOS packages")
143 parser.add_option("--cxxflags", dest="cxxflags",default="",
144 help="CXXFLAGS for the ChromeOS packages")
145 parser.add_option("--ldflags", dest="ldflags", default="",
146 help="LDFLAGS for the ChromeOS packages")
147 parser.add_option("--makeopts", dest="makeopts", default="",
148 help="Make options for the ChromeOS packages")
149 parser.add_option("--board", dest="board",
150 help="ChromeOS target board, e.g. x86-generic")
151
152 (options,args) = parser.parse_args(argv[1:])
153
154 # validate args
155 for arg in args:
156 if arg not in KNOWN_BENCHMARKS:
kbaclawski6999ada2013-02-15 19:57:09 +0000157 logger.GetLogger().LogFatal("Bad benchmark %s specified" % arg)
bjanakiraman6496e5f2013-02-15 04:50:58 +0000158
bjanakiraman229d6262013-02-15 04:56:46 +0000159
bjanakiraman6496e5f2013-02-15 04:50:58 +0000160 if options.chromeos_root is None:
161 Usage(parser, "--chromeos_root must be set")
162
bjanakiraman6496e5f2013-02-15 04:50:58 +0000163 if options.board is None:
164 Usage(parser, "--board must be set")
165
asharif8697d4e2013-02-15 09:18:09 +0000166 if options.toolchain_root:
167 logger.GetLogger().LogWarning("--toolchain_root should not be set")
168
169 options.chromeos_root = os.path.expanduser(options.chromeos_root)
170 options.workdir = os.path.expanduser(options.workdir)
171
bjanakiramanaabd2d12013-02-15 04:55:30 +0000172 retval = 0
asharif2198c512013-02-15 09:21:35 +0000173 if options.third_party:
174 third_party = options.third_party
175 else:
176 third_party = "%s/../../../third_party" % os.path.dirname(__file__)
177 third_party = os.path.realpath(third_party)
bjanakiraman6496e5f2013-02-15 04:50:58 +0000178 for arg in args:
179 # CPU benchmarks
180 if re.match('chromeos/cpu', arg):
181 comps = re.split('/', arg)
bjanakiramanaabd2d12013-02-15 04:55:30 +0000182 benchname = comps[2]
asharif8697d4e2013-02-15 09:18:09 +0000183
184 tec_options = []
asharif2198c512013-02-15 09:21:35 +0000185 if third_party:
186 tec_options.append("--third_party=%s" % third_party)
bjanakiramanaabd2d12013-02-15 04:55:30 +0000187 if options.clean:
asharifca3c6c12013-02-15 23:17:54 +0000188 retval = cmd_executer.ChrootRunCommand(options.chromeos_root,
189 CPU_BUILDCMD_CLEAN % benchname,
190 tec_options=tec_options
191 )
kbaclawski6999ada2013-02-15 19:57:09 +0000192 logger.GetLogger().LogErrorIf(retval,
193 "clean of benchmark %s failed." % arg)
bjanakiramanaabd2d12013-02-15 04:55:30 +0000194 if options.build:
asharifca3c6c12013-02-15 23:17:54 +0000195 retval = cmd_executer.ChrootRunCommand(
196 options.chromeos_root,
197 CPU_BUILDCMD_BUILD % (benchname, options.cflags,
198 options.ldflags, options.makeopts),
199 tec_options=tec_options)
kbaclawski6999ada2013-02-15 19:57:09 +0000200 logger.GetLogger().LogErrorIf(retval,
201 "Build of benchmark %s failed." % arg)
bjanakiramanaabd2d12013-02-15 04:55:30 +0000202 if retval == 0 and (options.build or options.only_copy):
asharif2198c512013-02-15 09:21:35 +0000203 benchdir = ('%s/android_bench/v2_0/CLOSED_SOURCE/%s' %
204 (third_party, benchname))
bjanakiraman229d6262013-02-15 04:56:46 +0000205 linkdir = '%s/perflab-bin/%s' % (options.workdir, arg)
asharif2198c512013-02-15 09:21:35 +0000206
shenhan12089d42013-02-15 20:32:18 +0000207 # For cpu/*, we need to copy (not symlinks) of all the contents,
208 # because they are part of the test fixutre.
209 retval = CreateBinaryCopy(benchdir, linkdir, True)
asharif2198c512013-02-15 09:21:35 +0000210 if retval != 0: return retval
211 retval = CreateRunsh(linkdir, arg)
212 if retval != 0: return retval
bjanakiraman6496e5f2013-02-15 04:50:58 +0000213 elif re.match('chromeos/startup', arg):
bjanakiramanaabd2d12013-02-15 04:55:30 +0000214 if options.build:
215 # Clean for chromeos/browser and chromeos/startup is a Nop since builds are always from scratch.
216 build_args = [os.path.dirname(os.path.abspath(__file__)) + "/build_chromeos.py",
217 "--chromeos_root=" + options.chromeos_root,
bjanakiramanaabd2d12013-02-15 04:55:30 +0000218 "--board=" + options.board,
219 "--cflags=" + options.cflags,
220 "--cxxflags=" + options.cxxflags,
221 "--ldflags=" + options.ldflags,
222 "--clobber_board"
223 ]
224 retval = build_chromeos.Main(build_args)
kbaclawski6999ada2013-02-15 19:57:09 +0000225 logger.GetLogger().LogErrorIf(retval, "Build of ChromeOS failed.")
bjanakiramanaabd2d12013-02-15 04:55:30 +0000226 if retval == 0 and (options.build or options.only_copy):
227 benchdir = '%s/src/build/images/%s/latest' % (options.chromeos_root, options.board)
bjanakiraman4e8bdf22013-02-15 04:57:09 +0000228 linkdir = '%s/perflab-bin/%s' % (options.workdir, arg)
asharif2198c512013-02-15 09:21:35 +0000229 retval = CreateBinaryCopy(benchdir, linkdir)
230 if retval != 0: return retval
bjanakiraman229d6262013-02-15 04:56:46 +0000231 CreateRunsh(linkdir, arg)
asharif2198c512013-02-15 09:21:35 +0000232 if retval != 0: return retval
bjanakiraman6496e5f2013-02-15 04:50:58 +0000233 elif re.match('chromeos/browser', arg):
bjanakiramanaabd2d12013-02-15 04:55:30 +0000234 if options.build:
bjanakiraman229d6262013-02-15 04:56:46 +0000235 # For now, re-build os. TBD: Change to call build_browser
bjanakiramanaabd2d12013-02-15 04:55:30 +0000236 build_args = [os.path.dirname(os.path.abspath(__file__)) + "/build_chrome_browser.py",
237 "--chromeos_root=" + options.chromeos_root,
bjanakiramanaabd2d12013-02-15 04:55:30 +0000238 "--board=" + options.board,
239 "--cflags=" + options.cflags,
240 "--cxxflags=" + options.cxxflags,
241 "--ldflags=" + options.ldflags
242 ]
243 retval = build_chromeos.Main(build_args)
kbaclawski6999ada2013-02-15 19:57:09 +0000244 logger.GetLogger().LogErrorIf(retval, "Build of ChromeOS failed.")
bjanakiramanaabd2d12013-02-15 04:55:30 +0000245 if retval == 0 and (options.build or options.only_copy):
246 benchdir = '%s/src/build/images/%s/latest' % (options.chromeos_root, options.board)
bjanakiraman4e8bdf22013-02-15 04:57:09 +0000247 linkdir = '%s/perflab-bin/%s' % (options.workdir, arg)
asharif2198c512013-02-15 09:21:35 +0000248 retval = CreateBinaryCopy(benchdir,linkdir)
249 if retval != 0: return retval
250 retval = CreateRunsh(linkdir, arg)
251 if retval != 0: return retval
bjanakiraman6496e5f2013-02-15 04:50:58 +0000252
asharif2198c512013-02-15 09:21:35 +0000253 return 0
bjanakiraman6496e5f2013-02-15 04:50:58 +0000254
255if __name__ == "__main__":
kbaclawski5fec5502013-02-15 19:55:56 +0000256 sys.exit(Main(sys.argv))