#!/usr/bin/env python2

import argparse
import os
import sys

import szbuild

from utils import FindBaseNaCl, shellcmd

def main():
    """Build native gcc-style executables for one or all Spec2K components.

    Afterwards, the executables can be run from the
    native_client/tests/spec2k/ directory as:
    './run_all.sh RunBenchmarks SetupGccX8632Opt {train|ref} ...'
    -- or --
    './run_all.sh RunBenchmarks SetupPnaclX8632Opt {train|ref} ...'
    """
    nacl_root = FindBaseNaCl()
    # Use the same default ordering as spec2k/run_all.sh.
    components = [ '177.mesa', '179.art', '183.equake', '188.ammp', '164.gzip',
                   '175.vpr', '176.gcc', '181.mcf', '186.crafty', '197.parser',
                   '253.perlbmk', '254.gap', '255.vortex', '256.bzip2',
                   '300.twolf', '252.eon' ]

    argparser = argparse.ArgumentParser(description=main.__doc__)
    szbuild.AddOptionalArgs(argparser)
    argparser.add_argument('--run', dest='run', action='store_true',
                           help='Run after building')
    argparser.add_argument('comps', nargs='*', default=components)
    args = argparser.parse_args()
    bad = set(args.comps) - set(components)
    if bad:
        print 'Unknown component{s}: '.format(s='s' if len(bad) > 1 else '') + \
            ' '.join(x for x in bad)
        sys.exit(1)

    # Fix up Subzero target strings for the run_all.sh script.
    target_map = {
         'arm32':'arm',
         'x8632':'x8632',
         'x8664':'x8664'
         }
    run_all_target = target_map[args.target] # fail if target not listed above

    suffix = (
        'pnacl.opt.{target}' if args.sandbox else 'gcc.opt.{target}').format(
             target=run_all_target);
    for comp in args.comps:
        name = os.path.splitext(comp)[1] or comp
        if name[0] == '.':
            name = name[1:]
        szbuild.ProcessPexe(args,
                            ('{root}/tests/spec2k/{comp}/' +
                             '{name}.opt.stripped.pexe'
                             ).format(root=nacl_root, comp=comp, name=name),
                            ('{root}/tests/spec2k/{comp}/' +
                             '{name}.{suffix}'
                             ).format(root=nacl_root, comp=comp, name=name,
                                      suffix=suffix))
    if args.run:
        os.chdir('{root}/tests/spec2k'.format(root=FindBaseNaCl()))
        setup = 'SetupGcc' + {
            'arm32': 'Arm',
            'x8632': 'X8632'}[args.target] + 'Opt'
        shellcmd(['./run_all.sh',
                  'RunTimedBenchmarks',
                  setup,
                  'train'] + args.comps)

if __name__ == '__main__':
    main()
