blob: 7dfd641d6c387dd21fa902f76552d701a6a303e3 [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
asharif3e38de02013-02-19 19:34:59 +000031 def _DeleteChroot(self):
32 command = "cd %s; cros_sdk --delete" % self.chromeos_root
33 return self._ce.RunCommand(command)
34
asharif96f59692013-02-16 03:13:36 +000035 def _BuildAndImage(self, label=""):
36 if (not label or
37 not misc.DoesLabelExist(self._chromeos_root, self._board, label)):
38 build_chromeos_args = [build_chromeos.__file__,
39 "--chromeos_root=%s" % self._chromeos_root,
40 "--board=%s" % self._board,
41 "--rebuild"]
42 ret = build_chromeos.Main(build_chromeos_args)
43 if ret:
44 raise Exception("Couldn't build ChromeOS!")
45 if label:
46 misc.LabelLatestImage(self._chromeos_root, self._board, label)
47 return label
48
49 def _SetupBoard(self, env_dict):
50 env_string = misc.GetEnvStringFromDict(env_dict)
51 command = ("%s %s" %
52 (env_string,
53 misc.GetSetupBoardCommand(self._board,
54 usepkg=False)))
55 ret = self._ce.ChrootRunCommand(self._chromeos_root,
56 command)
57 assert ret == 0, "Could not setup board with new toolchain."
58
59 def _UnInstallToolchain(self):
60 command = ("sudo CLEAN_DELAY=0 emerge -C cross-%s/gcc" %
61 misc.GetCtargetFromBoard(self._board,
62 self._chromeos_root))
63 ret = self._ce.ChrootRunCommand(self._chromeos_root,
64 command)
65 if ret:
66 raise Exception("Couldn't uninstall the toolchain!")
67
68 def _CheckoutChromeOS(self):
69 # TODO(asharif): Setup a fixed ChromeOS version (quarterly snapshot).
70 if not os.path.exists(self._chromeos_root):
71 setup_chromeos_args = [setup_chromeos.__file__,
72 "--dir=%s" % self._chromeos_root,
73 "--minilayout"]
74 setup_chromeos.Main(setup_chromeos_args)
75
76 def _BuildToolchain(self, config):
77 self._UnInstallToolchain()
78 self._SetupBoard({"USE": "git_gcc",
79 "GCC_GITHASH": config.gcc_config.githash,
80 "EMERGE_DEFAULT_OPTS": "--exclude=gcc"})
81
82
83class ToolchainComparator(ChromeOSCheckout):
asharif3e38de02013-02-19 19:34:59 +000084 def __init__(self, board, remotes, configs, clean):
asharif96f59692013-02-16 03:13:36 +000085 self._board = board
86 self._remotes = remotes
87 self._chromeos_root = "chromeos"
88 self._configs = configs
asharif3e38de02013-02-19 19:34:59 +000089 self._clean = clean
asharif96f59692013-02-16 03:13:36 +000090 self._ce = command_executer.GetCommandExecuter()
91 self._l = logger.GetLogger()
92 ChromeOSCheckout.__init__(self, board, self._chromeos_root)
93
94 def _TestLabels(self, labels):
95 experiment_file = "toolchain_experiment.txt"
96 experiment_header = """
97 board: %s
98 remote: %s
99 """ % (self._board, self._remotes)
100 experiment_tests = """
101 benchmark: desktopui_PyAutoPerfTests {
102 iterations: 1
103 }
104 """
105 with open(experiment_file, "w") as f:
106 print >>f, experiment_header
107 print >>f, experiment_tests
108 for label in labels:
109 # TODO(asharif): Fix crosperf so it accepts labels with symbols
110 crosperf_label = label
111 crosperf_label = crosperf_label.replace("-", "minus")
112 crosperf_label = crosperf_label.replace("+", "plus")
113 experiment_image = """
114 %s {
115 chromeos_image: %s
116 }
117 """ % (crosperf_label,
118 os.path.join(misc.GetImageDir(self._chromeos_root, self._board),
119 label,
120 "chromiumos_test_image.bin"))
121 print >>f, experiment_image
122 crosperf = os.path.join(os.path.dirname(__file__),
123 "crosperf",
124 "crosperf")
125 command = "%s %s" % (crosperf, experiment_file)
126 ret = self._ce.RunCommand(command)
127 if ret:
128 raise Exception("Couldn't run crosperf!")
129
130 def DoAll(self):
131 self._CheckoutChromeOS()
asharif96f59692013-02-16 03:13:36 +0000132 labels = []
133 vanilla_label = self._BuildAndImage("vanilla")
134 labels.append(vanilla_label)
135 for config in self._configs:
136 label = misc.GetFilenameFromString(config.gcc_config.githash)
137 if (not misc.DoesLabelExist(self._chromeos_root,
138 self._board,
139 label)):
140 self._BuildToolchain(config)
141 label = self._BuildAndImage(label)
142 labels.append(label)
143 self._TestLabels(labels)
asharif3e38de02013-02-19 19:34:59 +0000144 if self._clean:
145 ret = self._DeleteChroot()
146 if ret: return ret
asharif96f59692013-02-16 03:13:36 +0000147 return 0
148
149
150def Main(argv):
151 """The main function."""
152 # Common initializations
153### command_executer.InitCommandExecuter(True)
154 command_executer.InitCommandExecuter()
155 parser = optparse.OptionParser()
156 parser.add_option("--remote",
157 dest="remote",
158 help="Remote machines to run tests on.")
159 parser.add_option("--board",
160 dest="board",
161 default="x86-zgb",
162 help="The target board.")
163 parser.add_option("--githashes",
164 dest="githashes",
165 default="master",
166 help="The gcc githashes to test.")
asharif3e38de02013-02-19 19:34:59 +0000167 parser.add_option("--clean",
168 dest="clean",
169 default=False,
170 action="store_true",
171 help="Clean the chroot after testing.")
asharif96f59692013-02-16 03:13:36 +0000172 options, _ = parser.parse_args(argv)
173 if not options.board:
174 print "Please give a board."
175 return 1
176 if not options.remote:
177 print "Please give at least one remote machine."
178 return 1
179 toolchain_configs = []
180 for githash in options.githashes.split(","):
181 gcc_config = GCCConfig(githash=githash)
182 toolchain_config = ToolchainConfig(gcc_config=gcc_config)
183 toolchain_configs.append(toolchain_config)
asharif3e38de02013-02-19 19:34:59 +0000184 fc = ToolchainComparator(options.board, options.remote, toolchain_configs,
185 options.clean)
asharif96f59692013-02-16 03:13:36 +0000186 return fc.DoAll()
187
188
189if __name__ == "__main__":
190 retval = Main(sys.argv)
191 sys.exit(retval)