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