OLD | NEW |
(Empty) | |
| 1 # |
| 2 # Cython - Command Line Parsing |
| 3 # |
| 4 |
| 5 import os |
| 6 import sys |
| 7 import Options |
| 8 |
| 9 usage = """\ |
| 10 Cython (http://cython.org) is a compiler for code written in the |
| 11 Cython language. Cython is based on Pyrex by Greg Ewing. |
| 12 |
| 13 Usage: cython [options] sourcefile.{pyx,py} ... |
| 14 |
| 15 Options: |
| 16 -V, --version Display version number of cython compiler |
| 17 -l, --create-listing Write error messages to a listing file |
| 18 -I, --include-dir <directory> Search for include files in named directory |
| 19 (multiple include directories are allowed). |
| 20 -o, --output-file <filename> Specify name of generated C file |
| 21 -t, --timestamps Only compile newer source files |
| 22 -f, --force Compile all source files (overrides implied -t) |
| 23 -v, --verbose Be verbose, print file names on multiple compil
ation |
| 24 -p, --embed-positions If specified, the positions in Cython files of
each |
| 25 function definition is embedded in its docstrin
g. |
| 26 --cleanup <level> Release interned objects on python exit, for me
mory debugging. |
| 27 Level indicates aggressiveness, default 0 relea
ses nothing. |
| 28 -w, --working <directory> Sets the working directory for Cython (the dire
ctory modules |
| 29 are searched from) |
| 30 --gdb Output debug information for cygdb |
| 31 --gdb-outdir <directory> Specify gdb debug information output directory.
Implies --gdb. |
| 32 |
| 33 -D, --no-docstrings Strip docstrings from the compiled module. |
| 34 -a, --annotate Produce a colorized HTML version of the source. |
| 35 --line-directives Produce #line directives pointing to the .pyx s
ource |
| 36 --cplus Output a C++ rather than C file. |
| 37 --embed[=<method_name>] Generate a main() function that embeds the Pyth
on interpreter. |
| 38 -2 Compile based on Python-2 syntax and code seman
tics. |
| 39 -3 Compile based on Python-3 syntax and code seman
tics. |
| 40 --lenient Change some compile time errors to runtime erro
rs to |
| 41 improve Python compatibility |
| 42 --capi-reexport-cincludes Add cincluded headers to any auto-generated hea
der files. |
| 43 --fast-fail Abort the compilation on the first error |
| 44 --warning-errors, -Werror Make all warnings into errors |
| 45 --warning-extra, -Wextra Enable extra warnings |
| 46 -X, --directive <name>=<value>[,<name=value,...] Overrides a compiler directiv
e |
| 47 """ |
| 48 |
| 49 #The following experimental options are supported only on MacOSX: |
| 50 # -C, --compile Compile generated .c file to .o file |
| 51 # --link Link .o file to produce extension module (implies -C) |
| 52 # -+, --cplus Use C++ compiler for compiling and linking |
| 53 # Additional .o files to link may be supplied when using -X.""" |
| 54 |
| 55 def bad_usage(): |
| 56 sys.stderr.write(usage) |
| 57 sys.exit(1) |
| 58 |
| 59 def parse_command_line(args): |
| 60 |
| 61 from Cython.Compiler.Main import \ |
| 62 CompilationOptions, default_options |
| 63 |
| 64 def pop_arg(): |
| 65 if args: |
| 66 return args.pop(0) |
| 67 else: |
| 68 bad_usage() |
| 69 |
| 70 def get_param(option): |
| 71 tail = option[2:] |
| 72 if tail: |
| 73 return tail |
| 74 else: |
| 75 return pop_arg() |
| 76 |
| 77 options = CompilationOptions(default_options) |
| 78 sources = [] |
| 79 while args: |
| 80 if args[0].startswith("-"): |
| 81 option = pop_arg() |
| 82 if option in ("-V", "--version"): |
| 83 options.show_version = 1 |
| 84 elif option in ("-l", "--create-listing"): |
| 85 options.use_listing_file = 1 |
| 86 elif option in ("-+", "--cplus"): |
| 87 options.cplus = 1 |
| 88 elif option == "--embed": |
| 89 Options.embed = "main" |
| 90 elif option.startswith("--embed="): |
| 91 Options.embed = option[8:] |
| 92 elif option.startswith("-I"): |
| 93 options.include_path.append(get_param(option)) |
| 94 elif option == "--include-dir": |
| 95 options.include_path.append(pop_arg()) |
| 96 elif option in ("-w", "--working"): |
| 97 options.working_path = pop_arg() |
| 98 elif option in ("-o", "--output-file"): |
| 99 options.output_file = pop_arg() |
| 100 elif option in ("-t", "--timestamps"): |
| 101 options.timestamps = 1 |
| 102 elif option in ("-f", "--force"): |
| 103 options.timestamps = 0 |
| 104 elif option in ("-v", "--verbose"): |
| 105 options.verbose += 1 |
| 106 elif option in ("-p", "--embed-positions"): |
| 107 Options.embed_pos_in_docstring = 1 |
| 108 elif option in ("-z", "--pre-import"): |
| 109 Options.pre_import = pop_arg() |
| 110 elif option == "--cleanup": |
| 111 Options.generate_cleanup_code = int(pop_arg()) |
| 112 elif option in ("-D", "--no-docstrings"): |
| 113 Options.docstrings = False |
| 114 elif option in ("-a", "--annotate"): |
| 115 Options.annotate = True |
| 116 elif option == "--convert-range": |
| 117 Options.convert_range = True |
| 118 elif option == "--line-directives": |
| 119 options.emit_linenums = True |
| 120 elif option == "--no-c-in-traceback": |
| 121 options.c_line_in_traceback = False |
| 122 elif option == "--gdb": |
| 123 options.gdb_debug = True |
| 124 options.output_dir = os.curdir |
| 125 elif option == "--gdb-outdir": |
| 126 options.gdb_debug = True |
| 127 options.output_dir = pop_arg() |
| 128 elif option == "--lenient": |
| 129 Options.error_on_unknown_names = False |
| 130 Options.error_on_uninitialized = False |
| 131 elif option == '-2': |
| 132 options.language_level = 2 |
| 133 elif option == '-3': |
| 134 options.language_level = 3 |
| 135 elif option == "--capi-reexport-cincludes": |
| 136 options.capi_reexport_cincludes = True |
| 137 elif option == "--fast-fail": |
| 138 Options.fast_fail = True |
| 139 elif option in ('-Werror', '--warning-errors'): |
| 140 Options.warning_errors = True |
| 141 elif option in ('-Wextra', '--warning-extra'): |
| 142 options.compiler_directives.update(Options.extra_warnings) |
| 143 elif option == "--old-style-globals": |
| 144 Options.old_style_globals = True |
| 145 elif option == "--directive" or option.startswith('-X'): |
| 146 if option.startswith('-X') and option[2:].strip(): |
| 147 x_args = option[2:] |
| 148 else: |
| 149 x_args = pop_arg() |
| 150 try: |
| 151 options.compiler_directives = Options.parse_directive_list( |
| 152 x_args, relaxed_bool=True, |
| 153 current_settings=options.compiler_directives) |
| 154 except ValueError, e: |
| 155 sys.stderr.write("Error in compiler directive: %s\n" % e.arg
s[0]) |
| 156 sys.exit(1) |
| 157 elif option.startswith('--debug'): |
| 158 option = option[2:].replace('-', '_') |
| 159 import DebugFlags |
| 160 if option in dir(DebugFlags): |
| 161 setattr(DebugFlags, option, True) |
| 162 else: |
| 163 sys.stderr.write("Unknown debug flag: %s\n" % option) |
| 164 bad_usage() |
| 165 elif option in ('-h', '--help'): |
| 166 sys.stdout.write(usage) |
| 167 sys.exit(0) |
| 168 else: |
| 169 sys.stderr.write("Unknown compiler flag: %s\n" % option) |
| 170 sys.exit(1) |
| 171 else: |
| 172 sources.append(pop_arg()) |
| 173 if options.use_listing_file and len(sources) > 1: |
| 174 sys.stderr.write( |
| 175 "cython: Only one source file allowed when using -o\n") |
| 176 sys.exit(1) |
| 177 if len(sources) == 0 and not options.show_version: |
| 178 bad_usage() |
| 179 if Options.embed and len(sources) > 1: |
| 180 sys.stderr.write( |
| 181 "cython: Only one source file allowed when using -embed\n") |
| 182 sys.exit(1) |
| 183 return options, sources |
| 184 |
OLD | NEW |