blob: 6feacdc82e0fbab32c028f34f63aab1ef31cb162 [file] [log] [blame]
asharif96f59692013-02-16 03:13:36 +00001#!/usr/bin/python
2
3# Script to test different toolchains against ChromeOS benchmarks.
4import optparse
5import os
6import sys
7import build_chromeos
8import setup_chromeos
9from utils import command_executer
10from utils import misc
11from utils import logger
12
13
14class GCCConfig(object):
15 def __init__(self, githash):
16 self.githash = githash
17
18
19class ToolchainConfig:
20 def __init__(self, gcc_config=None, binutils_config=None):
21 self.gcc_config = gcc_config
22
23
24class ChromeOSCheckout(object):
25 def __init__(self, board, chromeos_root):
26 self._board = board
27 self._chromeos_root = chromeos_root
28 self._ce = command_executer.GetCommandExecuter()
29 self._l = logger.GetLogger()
30
31 def _BuildChromeOSUsingBinaries(self):
32 image_dir = misc.GetImageDir(self._chromeos_root, self._board)
33 command = "equery-%s l chromeos" % self._board
34 ret = self._ce.ChrootRunCommand(self._chromeos_root, command)
35 if ret:
36 command = misc.GetSetupBoardCommand(self._board,
37 usepkg=True)
38 ret = self._ce.ChrootRunCommand(self._chromeos_root,
39 command)
40 if ret:
41 raise Exception("Couldn't run setup_board!")
42 command = misc.GetBuildPackagesCommand(self._board,
43 True)
44 ret = self._ce.ChrootRunCommand(self._chromeos_root,
45 command)
46 if ret:
47 raise Exception("Couldn't run build_packages!")
48
49 def _BuildAndImage(self, label=""):
50 if (not label or
51 not misc.DoesLabelExist(self._chromeos_root, self._board, label)):
52 build_chromeos_args = [build_chromeos.__file__,
53 "--chromeos_root=%s" % self._chromeos_root,
54 "--board=%s" % self._board,
55 "--rebuild"]
56 ret = build_chromeos.Main(build_chromeos_args)
57 if ret:
58 raise Exception("Couldn't build ChromeOS!")
59 if label:
60 misc.LabelLatestImage(self._chromeos_root, self._board, label)
61 return label
62
63 def _SetupBoard(self, env_dict):
64 env_string = misc.GetEnvStringFromDict(env_dict)
65 command = ("%s %s" %
66 (env_string,
67 misc.GetSetupBoardCommand(self._board,
68 usepkg=False)))
69 ret = self._ce.ChrootRunCommand(self._chromeos_root,
70 command)
71 assert ret == 0, "Could not setup board with new toolchain."
72
73 def _UnInstallToolchain(self):
74 command = ("sudo CLEAN_DELAY=0 emerge -C cross-%s/gcc" %
75 misc.GetCtargetFromBoard(self._board,
76 self._chromeos_root))
77 ret = self._ce.ChrootRunCommand(self._chromeos_root,
78 command)
79 if ret:
80 raise Exception("Couldn't uninstall the toolchain!")
81
82 def _CheckoutChromeOS(self):
83 # TODO(asharif): Setup a fixed ChromeOS version (quarterly snapshot).
84 if not os.path.exists(self._chromeos_root):
85 setup_chromeos_args = [setup_chromeos.__file__,
86 "--dir=%s" % self._chromeos_root,
87 "--minilayout"]
88 setup_chromeos.Main(setup_chromeos_args)
89
90 def _BuildToolchain(self, config):
91 self._UnInstallToolchain()
92 self._SetupBoard({"USE": "git_gcc",
93 "GCC_GITHASH": config.gcc_config.githash,
94 "EMERGE_DEFAULT_OPTS": "--exclude=gcc"})
95
96
97class ToolchainComparator(ChromeOSCheckout):
98 def __init__(self, board, remotes, configs):
99 self._board = board
100 self._remotes = remotes
101 self._chromeos_root = "chromeos"
102 self._configs = configs
103 self._ce = command_executer.GetCommandExecuter()
104 self._l = logger.GetLogger()
105 ChromeOSCheckout.__init__(self, board, self._chromeos_root)
106
107 def _TestLabels(self, labels):
108 experiment_file = "toolchain_experiment.txt"
109 experiment_header = """
110 board: %s
111 remote: %s
112 """ % (self._board, self._remotes)
113 experiment_tests = """
114 benchmark: desktopui_PyAutoPerfTests {
115 iterations: 1
116 }
117 """
118 with open(experiment_file, "w") as f:
119 print >>f, experiment_header
120 print >>f, experiment_tests
121 for label in labels:
122 # TODO(asharif): Fix crosperf so it accepts labels with symbols
123 crosperf_label = label
124 crosperf_label = crosperf_label.replace("-", "minus")
125 crosperf_label = crosperf_label.replace("+", "plus")
126 experiment_image = """
127 %s {
128 chromeos_image: %s
129 }
130 """ % (crosperf_label,
131 os.path.join(misc.GetImageDir(self._chromeos_root, self._board),
132 label,
133 "chromiumos_test_image.bin"))
134 print >>f, experiment_image
135 crosperf = os.path.join(os.path.dirname(__file__),
136 "crosperf",
137 "crosperf")
138 command = "%s %s" % (crosperf, experiment_file)
139 ret = self._ce.RunCommand(command)
140 if ret:
141 raise Exception("Couldn't run crosperf!")
142
143 def DoAll(self):
144 self._CheckoutChromeOS()
145 self._BuildChromeOSUsingBinaries()
146 labels = []
147 vanilla_label = self._BuildAndImage("vanilla")
148 labels.append(vanilla_label)
149 for config in self._configs:
150 label = misc.GetFilenameFromString(config.gcc_config.githash)
151 if (not misc.DoesLabelExist(self._chromeos_root,
152 self._board,
153 label)):
154 self._BuildToolchain(config)
155 label = self._BuildAndImage(label)
156 labels.append(label)
157 self._TestLabels(labels)
158 return 0
159
160
161def Main(argv):
162 """The main function."""
163 # Common initializations
164### command_executer.InitCommandExecuter(True)
165 command_executer.InitCommandExecuter()
166 parser = optparse.OptionParser()
167 parser.add_option("--remote",
168 dest="remote",
169 help="Remote machines to run tests on.")
170 parser.add_option("--board",
171 dest="board",
172 default="x86-zgb",
173 help="The target board.")
174 parser.add_option("--githashes",
175 dest="githashes",
176 default="master",
177 help="The gcc githashes to test.")
178 options, _ = parser.parse_args(argv)
179 if not options.board:
180 print "Please give a board."
181 return 1
182 if not options.remote:
183 print "Please give at least one remote machine."
184 return 1
185 toolchain_configs = []
186 for githash in options.githashes.split(","):
187 gcc_config = GCCConfig(githash=githash)
188 toolchain_config = ToolchainConfig(gcc_config=gcc_config)
189 toolchain_configs.append(toolchain_config)
190 fc = ToolchainComparator(options.board, options.remote, toolchain_configs)
191 return fc.DoAll()
192
193
194if __name__ == "__main__":
195 retval = Main(sys.argv)
196 sys.exit(retval)