1#!/usr/bin/env python2
2
3import argparse
4import os
5import sys
6
7import szbuild
8
9from utils import FindBaseNaCl, shellcmd
10
11def main():
12    """Build native gcc-style executables for one or all Spec2K components.
13
14    Afterwards, the executables can be run from the
15    native_client/tests/spec2k/ directory as:
16    './run_all.sh RunBenchmarks SetupGccX8632Opt {train|ref} ...'
17    -- or --
18    './run_all.sh RunBenchmarks SetupPnaclX8632Opt {train|ref} ...'
19    -- or --
20    './run_all.sh RunBenchmarks SetupNonsfiX8632Opt {train|ref} ...'
21    """
22    nacl_root = FindBaseNaCl()
23    # Use the same default ordering as spec2k/run_all.sh.
24    components = [ '177.mesa', '179.art', '183.equake', '188.ammp', '164.gzip',
25                   '175.vpr', '176.gcc', '181.mcf', '186.crafty', '197.parser',
26                   '253.perlbmk', '254.gap', '255.vortex', '256.bzip2',
27                   '300.twolf', '252.eon' ]
28
29    argparser = argparse.ArgumentParser(description=main.__doc__)
30    szbuild.AddOptionalArgs(argparser)
31    argparser.add_argument('--run', dest='run', action='store_true',
32                           help='Run after building')
33    argparser.add_argument('comps', nargs='*', default=components)
34    args = argparser.parse_args()
35    bad = set(args.comps) - set(components)
36    if bad:
37        print 'Unknown component{s}: '.format(s='s' if len(bad) > 1 else '') + \
38            ' '.join(x for x in bad)
39        sys.exit(1)
40
41    # Fix up Subzero target strings for the run_all.sh script.
42    target_map = {
43         'arm32':'arm',
44         'x8632':'x8632',
45         'x8664':'x8664'
46         }
47    run_all_target = target_map[args.target] # fail if target not listed above
48
49    suffix = (
50        'pnacl.opt.{target}' if args.sandbox else
51        'nonsfi.opt.{target}' if args.nonsfi else
52        'gcc.opt.{target}').format(
53             target=run_all_target);
54    for comp in args.comps:
55        name = os.path.splitext(comp)[1] or comp
56        if name[0] == '.':
57            name = name[1:]
58        szbuild.ProcessPexe(args,
59                            ('{root}/tests/spec2k/{comp}/' +
60                             '{name}.opt.stripped.pexe'
61                             ).format(root=nacl_root, comp=comp, name=name),
62                            ('{root}/tests/spec2k/{comp}/' +
63                             '{name}.{suffix}'
64                             ).format(root=nacl_root, comp=comp, name=name,
65                                      suffix=suffix))
66    if args.run:
67        os.chdir('{root}/tests/spec2k'.format(root=FindBaseNaCl()))
68        setup = 'Setup' + ('Pnacl' if args.sandbox else
69                           'Nonsfi' if args.nonsfi else
70                           'Gcc') + {
71            'arm32': 'Arm',
72            'x8632': 'X8632',
73            'x8664': 'X8664'}[args.target] + 'Opt'
74        shellcmd(['./run_all.sh',
75                  'RunTimedBenchmarks',
76                  setup,
77                  'train'] + args.comps)
78
79if __name__ == '__main__':
80    main()
81