| #!/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 |