blob: c71eb73a032e58024e6eaf486f90ec933189c4cd [file] [log] [blame]
bjanakiraman6496e5f2013-02-15 04:50:58 +00001#!/usr/bin/python2.6
2#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Script to build ChromeOS benchmarks
6
7Inputs:
8 chromeos_root
9 toolchain_root
10 board
11 [chromeos/cpu/<benchname>|chromeos/browser/[pagecycler|sunspider]|chromeos/startup]
12
13 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
20 - Call build_chromeos to build image.
21 - Copy image to perflab-bin
22
23 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
35import tc_enter_chroot
36import build_chromeos
37from utils import command_executer
38from utils import logger
39from utils import utils
40
41
42KNOWN_BENCHMARKS = [
43 'chromeos/startup',
44 'chromeos/browser/pagecycler',
45 'chromeos/browser/sunspider',
46 'chromeos/cpu/bikjmp' ]
47
48# Commands to build CPU benchmarks.
bjanakiramanaabd2d12013-02-15 04:55:30 +000049
50CPU_BUILDCMD_CLEAN = "cd /usr/local/toolchain_root/v14/third_party/android_bench/v2_0/CLOSED_SOURCE/%s;\
51python ../../scripts/bench.py --toolchain=/usr/bin --action=clean;"
52
53CPU_BUILDCMD_BUILD = "cd /usr/local/toolchain_root/v14/third_party/android_bench/v2_0/CLOSED_SOURCE/%s;\
bjanakiraman6496e5f2013-02-15 04:50:58 +000054python ../../scripts/bench.py --toolchain=/usr/bin --add_cflags=%s --add_ldflags=%s --makeopts=%s --action=build"
55
56
bjanakiramanaabd2d12013-02-15 04:55:30 +000057# Common initializations
58cmd_executer = command_executer.GetCommandExecuter()
59
bjanakiraman6496e5f2013-02-15 04:50:58 +000060
61def Usage(parser, message):
62 print "ERROR: " + message
63 parser.print_help()
64 sys.exit(0)
65
66
bjanakiramanaabd2d12013-02-15 04:55:30 +000067def CreateBinaryCopy(sourcedir, destdir):
68 """Create link in perflab-bin for now, instead of copies"""
69
70 # check if sourcedir exists
71 if not os.path.exists(sourcedir):
72 utils.AssertError(False, "benchmark results %s does not exist." % sourcedir)
73 return
74
75 # Deal with old copies - save off old ones for now.
76 # Note - if its a link, it doesn't do anything.
77 if os.path.exists(destdir):
78 command = 'mv %s %s.old' % (destdir, destdir)
79 cmd_executer.RunCommand(command)
80 parentdir = os.path.dirname(destdir)
81
82 # create new directory if needed and link to absolute path
83 if not os.path.exists(parentdir):
84 os.makedirs(parentdir)
85 sourcedir = os.path.abspath(sourcedir)
86 command = 'ln -s %s %s' % (sourcedir, destdir)
87 cmd_executer.RunCommand(command)
88
89
bjanakiraman6496e5f2013-02-15 04:50:58 +000090def Main(argv):
91 """Build ChromeOS."""
92 # Common initializations
93
94 parser = optparse.OptionParser()
95 parser.add_option("-c", "--chromeos_root", dest="chromeos_root",
96 help="Target directory for ChromeOS installation.")
97 parser.add_option("-t", "--toolchain_root", dest="toolchain_root",
98 help="The gcctools directory of your P4 checkout.")
bjanakiramanaabd2d12013-02-15 04:55:30 +000099 parser.add_option("-C", "--clean", dest="clean", action="store_true",
100 default=False, help="Clean up build."),
101 parser.add_option("-B", "--build", dest="build", action="store_true",
102 default=False, help="Build benchmark."),
103 parser.add_option("-O", "--only_copy", dest="only_copy", action="store_true",
104 default=False, help="Only copy to perflab-bin - no builds."),
bjanakiraman6496e5f2013-02-15 04:50:58 +0000105 parser.add_option("--clobber_chroot", dest="clobber_chroot",
106 action="store_true", help=
107 "Delete the chroot and start fresh", default=False)
108 parser.add_option("--clobber_board", dest="clobber_board",
109 action="store_true",
110 help="Delete the board and start fresh", default=False)
111 parser.add_option("--cflags", dest="cflags", default="",
112 help="CFLAGS for the ChromeOS packages")
113 parser.add_option("--cxxflags", dest="cxxflags",default="",
114 help="CXXFLAGS for the ChromeOS packages")
115 parser.add_option("--ldflags", dest="ldflags", default="",
116 help="LDFLAGS for the ChromeOS packages")
117 parser.add_option("--makeopts", dest="makeopts", default="",
118 help="Make options for the ChromeOS packages")
119 parser.add_option("--board", dest="board",
120 help="ChromeOS target board, e.g. x86-generic")
121
122 (options,args) = parser.parse_args(argv[1:])
123
124 # validate args
125 for arg in args:
126 if arg not in KNOWN_BENCHMARKS:
bjanakiramanaabd2d12013-02-15 04:55:30 +0000127 utils.AssertExit(False, "Bad benchmark %s specified" % arg)
bjanakiraman6496e5f2013-02-15 04:50:58 +0000128
129
130 if options.chromeos_root is None:
131 Usage(parser, "--chromeos_root must be set")
132
133 if options.toolchain_root is None:
134 Usage(parser, "--toolchain_root must be set")
135
136 if options.board is None:
137 Usage(parser, "--board must be set")
138
139 found_err = 0
bjanakiramanaabd2d12013-02-15 04:55:30 +0000140 retval = 0
bjanakiraman6496e5f2013-02-15 04:50:58 +0000141 for arg in args:
142 # CPU benchmarks
143 if re.match('chromeos/cpu', arg):
144 comps = re.split('/', arg)
bjanakiramanaabd2d12013-02-15 04:55:30 +0000145 benchname = comps[2]
146 if options.clean:
147 retval = build_chromeos.ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
148 CPU_BUILDCMD_CLEAN % benchname)
149 utils.AssertError(retval == 0, "clean of benchmark %s failed." % arg)
150 if options.build:
151 retval = build_chromeos.ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
152 CPU_BUILDCMD_BUILD % (benchname, options.cflags,
153 options.ldflags, options.makeopts))
154 utils.AssertError(retval == 0, "Build of benchmark %s failed." % arg)
155 if retval == 0 and (options.build or options.only_copy):
156 benchdir = 'third_party/android_bench/v2_0/CLOSED_SOURCE/%s' % benchname
157 linkdir = 'perflab-bin/%s' % benchdir
158 CreateBinaryCopy(benchdir, linkdir)
159 if not found_err:
160 found_err = retval
bjanakiraman6496e5f2013-02-15 04:50:58 +0000161 elif re.match('chromeos/startup', arg):
bjanakiramanaabd2d12013-02-15 04:55:30 +0000162 if options.build:
163 # Clean for chromeos/browser and chromeos/startup is a Nop since builds are always from scratch.
164 build_args = [os.path.dirname(os.path.abspath(__file__)) + "/build_chromeos.py",
165 "--chromeos_root=" + options.chromeos_root,
166 "--toolchain_root=" + options.toolchain_root,
167 "--board=" + options.board,
168 "--cflags=" + options.cflags,
169 "--cxxflags=" + options.cxxflags,
170 "--ldflags=" + options.ldflags,
171 "--clobber_board"
172 ]
173 retval = build_chromeos.Main(build_args)
174 utils.AssertError(retval == 0, "Build of ChromeOS failed.")
175 if retval == 0 and (options.build or options.only_copy):
176 benchdir = '%s/src/build/images/%s/latest' % (options.chromeos_root, options.board)
177 linkdir = 'perflab-bin/startup/latest'
178 CreateBinaryCopy(benchdir, linkdir)
179 if not found_err:
180 found_err = retval
bjanakiraman6496e5f2013-02-15 04:50:58 +0000181 elif re.match('chromeos/browser', arg):
bjanakiramanaabd2d12013-02-15 04:55:30 +0000182 if options.build:
183 # For now, re-build os. TBD: Change to call build_browser
184 build_args = [os.path.dirname(os.path.abspath(__file__)) + "/build_chrome_browser.py",
185 "--chromeos_root=" + options.chromeos_root,
186 "--toolchain_root=" + options.toolchain_root,
187 "--board=" + options.board,
188 "--cflags=" + options.cflags,
189 "--cxxflags=" + options.cxxflags,
190 "--ldflags=" + options.ldflags
191 ]
192 retval = build_chromeos.Main(build_args)
193 utils.AssertError(retval == 0, "Build of ChromeOS failed.")
194 if retval == 0 and (options.build or options.only_copy):
195 benchdir = '%s/src/build/images/%s/latest' % (options.chromeos_root, options.board)
196 linkdir = 'perflab-bin/browser/latest'
197 CreateBinaryCopy(benchdir,linkdir)
198 if not found_err:
199 found_err = retval
bjanakiraman6496e5f2013-02-15 04:50:58 +0000200
201 return found_err
202
203if __name__ == "__main__":
204 Main(sys.argv)