16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#!/usr/bin/python 26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgimport getopt 46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgimport subprocess 56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgimport sys 66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgLONG_OPTIONS = ["shard=", "shards="] 86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgBASE_COMMAND = "./configure --enable-internal-stats --enable-experimental" 96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef RunCommand(command): 116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org run = subprocess.Popen(command, shell=True) 126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org output = run.communicate() 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if run.returncode: 146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org print "Non-zero return code: " + str(run.returncode) + " => exiting!" 156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org sys.exit(1) 166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef list_of_experiments(): 186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org experiments = [] 196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org configure_file = open("configure") 206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org list_start = False 216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org for line in configure_file.read().split("\n"): 226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if line == 'EXPERIMENT_LIST="': 236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org list_start = True 246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org elif line == '"': 256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org list_start = False 266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org elif list_start: 276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org currently_broken = ["csm"] 286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org experiment = line[4:] 296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if experiment not in currently_broken: 306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org experiments.append(experiment) 316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return experiments 326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef main(argv): 346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org # Parse arguments 356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org options = {"--shard": 0, "--shards": 1} 366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if "--" in argv: 376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org opt_end_index = argv.index("--") 386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else: 396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org opt_end_index = len(argv) 406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org try: 416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org o, _ = getopt.getopt(argv[1:opt_end_index], None, LONG_OPTIONS) 426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org except getopt.GetoptError, err: 436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org print str(err) 446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org print "Usage: %s [--shard=<n> --shards=<n>] -- [configure flag ...]"%argv[0] 456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org sys.exit(2) 466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org options.update(o) 486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org extra_args = argv[opt_end_index + 1:] 496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org # Shard experiment list 516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org shard = int(options["--shard"]) 526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org shards = int(options["--shards"]) 536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org experiments = list_of_experiments() 546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org base_command = " ".join([BASE_COMMAND] + extra_args) 556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org configs = [base_command] 566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org configs += ["%s --enable-%s" % (base_command, e) for e in experiments] 576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org my_configs = zip(configs, range(len(configs))) 586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org my_configs = filter(lambda x: x[1] % shards == shard, my_configs) 596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org my_configs = [e[0] for e in my_configs] 606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org # Run configs for this shard 626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org for config in my_configs: 636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org test_build(config) 646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef test_build(configure_command): 666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org print "\033[34m\033[47mTesting %s\033[0m" % (configure_command) 676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org RunCommand(configure_command) 686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org RunCommand("make clean") 696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org RunCommand("make") 706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgif __name__ == "__main__": 726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org main(sys.argv) 73