普通文本  |  48行  |  1.69 KB

#!/usr/bin/env python2

import argparse
import errno
import os
import shutil
import tempfile
from utils import shellcmd
from utils import FindBaseNaCl

if __name__ == '__main__':
    argparser = argparse.ArgumentParser()
    argparser.add_argument('cfile', nargs='+', type=str,
        help='C file(s) to convert')
    argparser.add_argument('--dir', nargs='?', type=str, default='.',
                           help='Output directory. Default "%(default)s".')
    argparser.add_argument('--disable-verify', action='store_true')
    args = argparser.parse_args()

    nacl_root = FindBaseNaCl()
    # Prepend bin to $PATH.
    os.environ['PATH'] = (
        nacl_root + '/toolchain/linux_x86/pnacl_newlib_raw/bin' + os.pathsep +
        os.pathsep + os.environ['PATH'])

    try:
        tempdir = tempfile.mkdtemp()

        for cname in args.cfile:
            basename = os.path.splitext(cname)[0]
            llname = os.path.join(tempdir, basename + '.ll')
            pnaclname = basename + '.pnacl.ll'
            pnaclname = os.path.join(args.dir, pnaclname)

            shellcmd('pnacl-clang -O2 -c {0} -o {1}'.format(cname, llname))
            shellcmd('pnacl-opt ' +
                     '-pnacl-abi-simplify-preopt -pnacl-abi-simplify-postopt' +
                     ('' if args.disable_verify else
                      ' -verify-pnaclabi-module -verify-pnaclabi-functions') +
                     ' -pnaclabi-allow-debug-metadata'
                     ' {0} -S -o {1}'.format(llname, pnaclname))
    finally:
        try:
            shutil.rmtree(tempdir)
        except OSError as exc:
            if exc.errno != errno.ENOENT: # ENOENT - no such file or directory
                raise # re-raise exception