%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/pythran/ |
| Current File : //lib/python3/dist-packages/pythran/run.py |
#!/usr/bin/env python
""" Script to run Pythran file compilation with specified g++ like flags. """
import argparse
import logging
import os
import sys
import pythran
from distutils.errors import CompileError
logger = logging.getLogger("pythran")
def convert_arg_line_to_args(arg_line):
"""Read argument from file in a prettier way."""
for arg in arg_line.split():
if not arg.strip():
continue
yield arg
def compile_flags(args):
"""
Build a dictionnary with an entry for cppflags, ldflags, and cxxflags.
These options are filled according to the command line defined options
"""
compiler_options = {
'define_macros': args.defines,
'undef_macros': args.undefs,
'include_dirs': args.include_dirs,
'extra_compile_args': args.extra_flags,
'library_dirs': args.libraries_dir,
'extra_link_args': args.extra_flags,
'config': args.config,
}
for param in ('opts', ):
val = getattr(args, param, None)
if val:
compiler_options[param] = val
return compiler_options
def run():
prefix_chars = "-"
if os.name == "nt":
prefix_chars += "/"
parser = argparse.ArgumentParser(prog='pythran',
description='pythran: a python to C++ '
'compiler',
epilog="It's a megablast!",
prefix_chars=prefix_chars,
fromfile_prefix_chars="@")
parser.add_argument('input_file', type=str,
help='the pythran module to compile, '
'either a .py or a .cpp file')
parser.add_argument('-o', dest='output_file', type=str,
help='path to generated file. Honors %%{ext}.')
parser.add_argument('-P', dest='optimize_only', action='store_true',
help='only run the high-level optimizer, '
'do not compile')
parser.add_argument('-E', dest='translate_only', action='store_true',
help='only run the translator, do not compile')
parser.add_argument('-e', dest='raw_translate_only', action='store_true',
help='similar to -E, '
'but does not generate python glue')
parser.add_argument('-v', dest='verbose', action='store_true',
help='be more verbose')
parser.add_argument('-w', dest='warn_off', action='store_true',
help='be less verbose')
parser.add_argument('-V', '--version',
action='version',
version=pythran.version.__version__)
parser.add_argument('-p', dest='opts', metavar='pass',
action='append',
help='any pythran optimization to apply before code '
'generation',
default=list())
parser.add_argument('-I', dest='include_dirs', metavar='include_dir',
action='append',
help='any include dir relevant to the underlying C++ '
'compiler',
default=list())
parser.add_argument('-L', dest='libraries_dir', metavar='ldflags',
action='append',
help='any search dir relevant to the linker',
default=list())
parser.add_argument('-D', dest='defines', metavar='macro_definition',
action='append',
help='any macro definition relevant to '
'the underlying C++ compiler',
default=list())
parser.add_argument('-U', dest='undefs', metavar='macro_definition',
action='append',
help='any macro undef relevant to '
'the underlying C++ compiler',
default=list())
parser.add_argument('--config', dest='config', metavar='config',
action='append',
help='config additional params',
default=list())
parser.convert_arg_line_to_args = convert_arg_line_to_args
args, extra = parser.parse_known_args(sys.argv[1:])
args.extra_flags = extra
if args.raw_translate_only:
args.translate_only = True
args.undefs.append('ENABLE_PYTHON_MODULE')
if args.verbose and args.warn_off:
logger.critical("Unexpected combination: -w and -v? Daoubennek?")
sys.exit(1)
if args.verbose:
logger.setLevel(logging.INFO)
if args.warn_off:
logger.setLevel(logging.ERROR)
if args.config:
pythran.config.update_cfg(pythran.config.cfg, args.config)
if args.verbose and not args.warn_off:
pythran.config.lint_cfg(pythran.config.cfg)
try:
if not os.path.exists(args.input_file):
raise ValueError("input file `{0}' not found".format(
args.input_file))
module_name, ext = os.path.splitext(os.path.basename(args.input_file))
# FIXME: do we want to support other ext than .cpp?
if ext not in ['.cpp', '.py']:
raise SyntaxError("Unsupported file extension: '{0}'".format(ext))
if ext == '.cpp':
if args.optimize_only:
raise ValueError("Do you really ask for Python-to-Python "
"on this C++ input file: '{0}'?".format(
args.input_file))
if args.translate_only:
raise ValueError("Do you really ask for Python-to-C++ "
"on this C++ input file: '{0}'?".format(
args.input_file))
pythran.compile_cxxfile(module_name,
args.input_file, args.output_file,
**compile_flags(args))
else: # assume we have a .py input file here
pythran.compile_pythranfile(args.input_file,
output_file=args.output_file,
cpponly=args.translate_only,
pyonly=args.optimize_only,
**compile_flags(args))
except IOError as e:
logger.critical("I've got a bad feeling about this...\n"
"E: " + str(e))
sys.exit(1)
except ValueError as e:
logger.critical("Chair to keyboard interface error\n"
"E: " + str(e))
sys.exit(1)
except pythran.types.tog.PythranTypeError as e:
logger.critical("You shall not pass!\n"
"E: " + str(e))
sys.exit(1)
except pythran.syntax.PythranSyntaxError as e:
logger.critical("I am in trouble. Your input file does not seem "
"to match Pythran's constraints...\n" + str(e))
sys.exit(1)
except CompileError as e:
logger.critical("Cover me Jack. Jack? Jaaaaack!!!!\n"
"E: " + str(e))
sys.exit(1)
except NotImplementedError:
logger.critical("MAYDAY, MAYDAY, MAYDAY; pythran compiler; "
"code area out of control\n"
"E: not implemented feature needed, "
"bash the developers")
raise # Why ? we may instead display the stacktrace and exit?
except EnvironmentError as e:
logger.critical("By Jove! Your environment does not seem "
"to provide all what we need\n"
"E: " + str(e))
sys.exit(1)
if __name__ == '__main__':
run()