Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/mingw32/Python27/Lib/site-packages/numpy/f2py/f2py2e.py @ 87:2a2c65a20a8b
Add Python libs and headers
author | Chris Cannam |
---|---|
date | Wed, 25 Feb 2015 14:05:22 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/mingw32/Python27/Lib/site-packages/numpy/f2py/f2py2e.py Wed Feb 25 14:05:22 2015 +0000 @@ -0,0 +1,598 @@ +#!/usr/bin/env python +""" + +f2py2e - Fortran to Python C/API generator. 2nd Edition. + See __usage__ below. + +Copyright 1999--2011 Pearu Peterson all rights reserved, +Pearu Peterson <pearu@cens.ioc.ee> +Permission to use, modify, and distribute this software is given under the +terms of the NumPy License. + +NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. +$Date: 2005/05/06 08:31:19 $ +Pearu Peterson + +""" +from __future__ import division, absolute_import, print_function + +import sys +import os +import pprint +import re + +from . import crackfortran +from . import rules +from . import cb_rules +from . import auxfuncs +from . import cfuncs +from . import f90mod_rules +from . import __version__ + +f2py_version = __version__.version +errmess = sys.stderr.write +#outmess=sys.stdout.write +show = pprint.pprint +outmess = auxfuncs.outmess + +try: + from numpy import __version__ as numpy_version +except ImportError: + numpy_version = 'N/A' + +__usage__ = """\ +Usage: + +1) To construct extension module sources: + + f2py [<options>] <fortran files> [[[only:]||[skip:]] \\ + <fortran functions> ] \\ + [: <fortran files> ...] + +2) To compile fortran files and build extension modules: + + f2py -c [<options>, <build_flib options>, <extra options>] <fortran files> + +3) To generate signature files: + + f2py -h <filename.pyf> ...< same options as in (1) > + +Description: This program generates a Python C/API file (<modulename>module.c) + that contains wrappers for given fortran functions so that they + can be called from Python. With the -c option the corresponding + extension modules are built. + +Options: + + --2d-numpy Use numpy.f2py tool with NumPy support. [DEFAULT] + --2d-numeric Use f2py2e tool with Numeric support. + --2d-numarray Use f2py2e tool with Numarray support. + --g3-numpy Use 3rd generation f2py from the separate f2py package. + [NOT AVAILABLE YET] + + -h <filename> Write signatures of the fortran routines to file <filename> + and exit. You can then edit <filename> and use it instead + of <fortran files>. If <filename>==stdout then the + signatures are printed to stdout. + <fortran functions> Names of fortran routines for which Python C/API + functions will be generated. Default is all that are found + in <fortran files>. + <fortran files> Paths to fortran/signature files that will be scanned for + <fortran functions> in order to determine their signatures. + skip: Ignore fortran functions that follow until `:'. + only: Use only fortran functions that follow until `:'. + : Get back to <fortran files> mode. + + -m <modulename> Name of the module; f2py generates a Python/C API + file <modulename>module.c or extension module <modulename>. + Default is 'untitled'. + + --[no-]lower Do [not] lower the cases in <fortran files>. By default, + --lower is assumed with -h key, and --no-lower without -h key. + + --build-dir <dirname> All f2py generated files are created in <dirname>. + Default is tempfile.mkdtemp(). + + --overwrite-signature Overwrite existing signature file. + + --[no-]latex-doc Create (or not) <modulename>module.tex. + Default is --no-latex-doc. + --short-latex Create 'incomplete' LaTeX document (without commands + \\documentclass, \\tableofcontents, and \\begin{document}, + \\end{document}). + + --[no-]rest-doc Create (or not) <modulename>module.rst. + Default is --no-rest-doc. + + --debug-capi Create C/API code that reports the state of the wrappers + during runtime. Useful for debugging. + + --[no-]wrap-functions Create Fortran subroutine wrappers to Fortran 77 + functions. --wrap-functions is default because it ensures + maximum portability/compiler independence. + + --include-paths <path1>:<path2>:... Search include files from the given + directories. + + --help-link [..] List system resources found by system_info.py. See also + --link-<resource> switch below. [..] is optional list + of resources names. E.g. try 'f2py --help-link lapack_opt'. + + --quiet Run quietly. + --verbose Run with extra verbosity. + -v Print f2py version ID and exit. + + +numpy.distutils options (only effective with -c): + + --fcompiler= Specify Fortran compiler type by vendor + --compiler= Specify C compiler type (as defined by distutils) + + --help-fcompiler List available Fortran compilers and exit + --f77exec= Specify the path to F77 compiler + --f90exec= Specify the path to F90 compiler + --f77flags= Specify F77 compiler flags + --f90flags= Specify F90 compiler flags + --opt= Specify optimization flags + --arch= Specify architecture specific optimization flags + --noopt Compile without optimization + --noarch Compile without arch-dependent optimization + --debug Compile with debugging information + +Extra options (only effective with -c): + + --link-<resource> Link extension module with <resource> as defined + by numpy.distutils/system_info.py. E.g. to link + with optimized LAPACK libraries (vecLib on MacOSX, + ATLAS elsewhere), use --link-lapack_opt. + See also --help-link switch. + + -L/path/to/lib/ -l<libname> + -D<define> -U<name> + -I/path/to/include/ + <filename>.o <filename>.so <filename>.a + + Using the following macros may be required with non-gcc Fortran + compilers: + -DPREPEND_FORTRAN -DNO_APPEND_FORTRAN -DUPPERCASE_FORTRAN + -DUNDERSCORE_G77 + + When using -DF2PY_REPORT_ATEXIT, a performance report of F2PY + interface is printed out at exit (platforms: Linux). + + When using -DF2PY_REPORT_ON_ARRAY_COPY=<int>, a message is + sent to stderr whenever F2PY interface makes a copy of an + array. Integer <int> sets the threshold for array sizes when + a message should be shown. + +Version: %s +numpy Version: %s +Requires: Python 2.3 or higher. +License: NumPy license (see LICENSE.txt in the NumPy source code) +Copyright 1999 - 2011 Pearu Peterson all rights reserved. +http://cens.ioc.ee/projects/f2py2e/"""%(f2py_version, numpy_version) + +def scaninputline(inputline): + files, funcs, skipfuncs, onlyfuncs, debug=[], [], [], [], [] + f, f2, f3, f4, f5, f6, f7, f8, f9=1, 0, 0, 0, 0, 0, 0, 0, 0 + verbose = 1 + dolc=-1 + dolatexdoc = 0 + dorestdoc = 0 + wrapfuncs = 1 + buildpath = '.' + include_paths = [] + signsfile, modulename=None, None + options = {'buildpath':buildpath, + 'coutput': None, + 'f2py_wrapper_output': None} + for l in inputline: + if l=='': pass + elif l=='only:': f=0 + elif l=='skip:': f=-1 + elif l==':': f=1;f4=0 + elif l[:8]=='--debug-': debug.append(l[8:]) + elif l=='--lower': dolc=1 + elif l=='--build-dir': f6=1 + elif l=='--no-lower': dolc=0 + elif l=='--quiet': verbose = 0 + elif l=='--verbose': verbose += 1 + elif l=='--latex-doc': dolatexdoc=1 + elif l=='--no-latex-doc': dolatexdoc=0 + elif l=='--rest-doc': dorestdoc=1 + elif l=='--no-rest-doc': dorestdoc=0 + elif l=='--wrap-functions': wrapfuncs=1 + elif l=='--no-wrap-functions': wrapfuncs=0 + elif l=='--short-latex': options['shortlatex']=1 + elif l=='--coutput': f8=1 + elif l=='--f2py-wrapper-output': f9=1 + elif l=='--overwrite-signature': options['h-overwrite']=1 + elif l=='-h': f2=1 + elif l=='-m': f3=1 + elif l[:2]=='-v': + print(f2py_version) + sys.exit() + elif l=='--show-compilers': + f5=1 + elif l[:8]=='-include': + cfuncs.outneeds['userincludes'].append(l[9:-1]) + cfuncs.userincludes[l[9:-1]]='#include '+l[8:] + elif l[:15] in '--include_paths': + outmess('f2py option --include_paths is deprecated, use --include-paths instead.\n') + f7=1 + elif l[:15] in '--include-paths': + f7=1 + elif l[0]=='-': + errmess('Unknown option %s\n'%repr(l)) + sys.exit() + elif f2: f2=0;signsfile=l + elif f3: f3=0;modulename=l + elif f6: f6=0;buildpath=l + elif f7: f7=0;include_paths.extend(l.split(os.pathsep)) + elif f8: f8=0;options["coutput"]=l + elif f9: f9=0;options["f2py_wrapper_output"]=l + elif f==1: + try: + open(l).close() + files.append(l) + except IOError as detail: + errmess('IOError: %s. Skipping file "%s".\n'%(str(detail), l)) + elif f==-1: skipfuncs.append(l) + elif f==0: onlyfuncs.append(l) + if not f5 and not files and not modulename: + print(__usage__) + sys.exit() + if not os.path.isdir(buildpath): + if not verbose: + outmess('Creating build directory %s'%(buildpath)) + os.mkdir(buildpath) + if signsfile: + signsfile = os.path.join(buildpath, signsfile) + if signsfile and os.path.isfile(signsfile) and 'h-overwrite' not in options: + errmess('Signature file "%s" exists!!! Use --overwrite-signature to overwrite.\n'%(signsfile)) + sys.exit() + + options['debug']=debug + options['verbose']=verbose + if dolc==-1 and not signsfile: options['do-lower']=0 + else: options['do-lower']=dolc + if modulename: options['module']=modulename + if signsfile: options['signsfile']=signsfile + if onlyfuncs: options['onlyfuncs']=onlyfuncs + if skipfuncs: options['skipfuncs']=skipfuncs + options['dolatexdoc'] = dolatexdoc + options['dorestdoc'] = dorestdoc + options['wrapfuncs'] = wrapfuncs + options['buildpath']=buildpath + options['include_paths']=include_paths + return files, options + +def callcrackfortran(files, options): + rules.options=options + funcs=[] + crackfortran.debug=options['debug'] + crackfortran.verbose=options['verbose'] + if 'module' in options: + crackfortran.f77modulename=options['module'] + if 'skipfuncs' in options: + crackfortran.skipfuncs=options['skipfuncs'] + if 'onlyfuncs' in options: + crackfortran.onlyfuncs=options['onlyfuncs'] + crackfortran.include_paths[:]=options['include_paths'] + crackfortran.dolowercase=options['do-lower'] + postlist=crackfortran.crackfortran(files) + if 'signsfile' in options: + outmess('Saving signatures to file "%s"\n'%(options['signsfile'])) + pyf=crackfortran.crack2fortran(postlist) + if options['signsfile'][-6:]=='stdout': + sys.stdout.write(pyf) + else: + f=open(options['signsfile'], 'w') + f.write(pyf) + f.close() + if options["coutput"] is None: + for mod in postlist: + mod["coutput"] = "%smodule.c" % mod["name"] + else: + for mod in postlist: + mod["coutput"] = options["coutput"] + if options["f2py_wrapper_output"] is None: + for mod in postlist: + mod["f2py_wrapper_output"] = "%s-f2pywrappers.f" % mod["name"] + else: + for mod in postlist: + mod["f2py_wrapper_output"] = options["f2py_wrapper_output"] + return postlist + +def buildmodules(lst): + cfuncs.buildcfuncs() + outmess('Building modules...\n') + modules, mnames, isusedby=[], [], {} + for i in range(len(lst)): + if '__user__' in lst[i]['name']: + cb_rules.buildcallbacks(lst[i]) + else: + if 'use' in lst[i]: + for u in lst[i]['use'].keys(): + if u not in isusedby: + isusedby[u]=[] + isusedby[u].append(lst[i]['name']) + modules.append(lst[i]) + mnames.append(lst[i]['name']) + ret = {} + for i in range(len(mnames)): + if mnames[i] in isusedby: + outmess('\tSkipping module "%s" which is used by %s.\n'%(mnames[i], ','.join(['"%s"'%s for s in isusedby[mnames[i]]]))) + else: + um=[] + if 'use' in modules[i]: + for u in modules[i]['use'].keys(): + if u in isusedby and u in mnames: + um.append(modules[mnames.index(u)]) + else: + outmess('\tModule "%s" uses nonexisting "%s" which will be ignored.\n'%(mnames[i], u)) + ret[mnames[i]] = {} + dict_append(ret[mnames[i]], rules.buildmodule(modules[i], um)) + return ret + +def dict_append(d_out, d_in): + for (k, v) in d_in.items(): + if k not in d_out: + d_out[k] = [] + if isinstance(v, list): + d_out[k] = d_out[k] + v + else: + d_out[k].append(v) + +def run_main(comline_list): + """Run f2py as if string.join(comline_list,' ') is used as a command line. + In case of using -h flag, return None. + """ + crackfortran.reset_global_f2py_vars() + f2pydir=os.path.dirname(os.path.abspath(cfuncs.__file__)) + fobjhsrc = os.path.join(f2pydir, 'src', 'fortranobject.h') + fobjcsrc = os.path.join(f2pydir, 'src', 'fortranobject.c') + files, options=scaninputline(comline_list) + auxfuncs.options=options + postlist=callcrackfortran(files, options) + isusedby={} + for i in range(len(postlist)): + if 'use' in postlist[i]: + for u in postlist[i]['use'].keys(): + if u not in isusedby: + isusedby[u]=[] + isusedby[u].append(postlist[i]['name']) + for i in range(len(postlist)): + if postlist[i]['block']=='python module' and '__user__' in postlist[i]['name']: + if postlist[i]['name'] in isusedby: + #if not quiet: + outmess('Skipping Makefile build for module "%s" which is used by %s\n'%(postlist[i]['name'], ','.join(['"%s"'%s for s in isusedby[postlist[i]['name']]]))) + if 'signsfile' in options: + if options['verbose']>1: + outmess('Stopping. Edit the signature file and then run f2py on the signature file: ') + outmess('%s %s\n'%(os.path.basename(sys.argv[0]), options['signsfile'])) + return + for i in range(len(postlist)): + if postlist[i]['block']!='python module': + if 'python module' not in options: + errmess('Tip: If your original code is Fortran source then you must use -m option.\n') + raise TypeError('All blocks must be python module blocks but got %s'%(repr(postlist[i]['block']))) + auxfuncs.debugoptions=options['debug'] + f90mod_rules.options=options + auxfuncs.wrapfuncs=options['wrapfuncs'] + + ret=buildmodules(postlist) + + for mn in ret.keys(): + dict_append(ret[mn], {'csrc':fobjcsrc,'h':fobjhsrc}) + return ret + +def filter_files(prefix,suffix,files,remove_prefix=None): + """ + Filter files by prefix and suffix. + """ + filtered, rest = [], [] + match = re.compile(prefix+r'.*'+suffix+r'\Z').match + if remove_prefix: + ind = len(prefix) + else: + ind = 0 + for file in [x.strip() for x in files]: + if match(file): filtered.append(file[ind:]) + else: rest.append(file) + return filtered, rest + +def get_prefix(module): + p = os.path.dirname(os.path.dirname(module.__file__)) + return p + +def run_compile(): + """ + Do it all in one call! + """ + import tempfile + + i = sys.argv.index('-c') + del sys.argv[i] + + remove_build_dir = 0 + try: i = sys.argv.index('--build-dir') + except ValueError: i=None + if i is not None: + build_dir = sys.argv[i+1] + del sys.argv[i+1] + del sys.argv[i] + else: + remove_build_dir = 1 + build_dir = tempfile.mkdtemp() + + _reg1 = re.compile(r'[-][-]link[-]') + sysinfo_flags = [_m for _m in sys.argv[1:] if _reg1.match(_m)] + sys.argv = [_m for _m in sys.argv if _m not in sysinfo_flags] + if sysinfo_flags: + sysinfo_flags = [f[7:] for f in sysinfo_flags] + + _reg2 = re.compile(r'[-][-]((no[-]|)(wrap[-]functions|lower)|debug[-]capi|quiet)|[-]include') + f2py_flags = [_m for _m in sys.argv[1:] if _reg2.match(_m)] + sys.argv = [_m for _m in sys.argv if _m not in f2py_flags] + f2py_flags2 = [] + fl = 0 + for a in sys.argv[1:]: + if a in ['only:', 'skip:']: + fl = 1 + elif a==':': + fl = 0 + if fl or a==':': + f2py_flags2.append(a) + if f2py_flags2 and f2py_flags2[-1]!=':': + f2py_flags2.append(':') + f2py_flags.extend(f2py_flags2) + + sys.argv = [_m for _m in sys.argv if _m not in f2py_flags2] + _reg3 = re.compile(r'[-][-]((f(90)?compiler([-]exec|)|compiler)=|help[-]compiler)') + flib_flags = [_m for _m in sys.argv[1:] if _reg3.match(_m)] + sys.argv = [_m for _m in sys.argv if _m not in flib_flags] + _reg4 = re.compile(r'[-][-]((f(77|90)(flags|exec)|opt|arch)=|(debug|noopt|noarch|help[-]fcompiler))') + fc_flags = [_m for _m in sys.argv[1:] if _reg4.match(_m)] + sys.argv = [_m for _m in sys.argv if _m not in fc_flags] + + if 1: + del_list = [] + for s in flib_flags: + v = '--fcompiler=' + if s[:len(v)]==v: + from numpy.distutils import fcompiler + fcompiler.load_all_fcompiler_classes() + allowed_keys = list(fcompiler.fcompiler_class.keys()) + nv = ov = s[len(v):].lower() + if ov not in allowed_keys: + vmap = {} # XXX + try: + nv = vmap[ov] + except KeyError: + if ov not in vmap.values(): + print('Unknown vendor: "%s"' % (s[len(v):])) + nv = ov + i = flib_flags.index(s) + flib_flags[i] = '--fcompiler=' + nv + continue + for s in del_list: + i = flib_flags.index(s) + del flib_flags[i] + assert len(flib_flags)<=2, repr(flib_flags) + + _reg5 = re.compile(r'[-][-](verbose)') + setup_flags = [_m for _m in sys.argv[1:] if _reg5.match(_m)] + sys.argv = [_m for _m in sys.argv if _m not in setup_flags] + + if '--quiet' in f2py_flags: + setup_flags.append('--quiet') + + modulename = 'untitled' + sources = sys.argv[1:] + + for optname in ['--include_paths', '--include-paths']: + if optname in sys.argv: + i = sys.argv.index (optname) + f2py_flags.extend (sys.argv[i:i+2]) + del sys.argv[i+1], sys.argv[i] + sources = sys.argv[1:] + + if '-m' in sys.argv: + i = sys.argv.index('-m') + modulename = sys.argv[i+1] + del sys.argv[i+1], sys.argv[i] + sources = sys.argv[1:] + else: + from numpy.distutils.command.build_src import get_f2py_modulename + pyf_files, sources = filter_files('', '[.]pyf([.]src|)', sources) + sources = pyf_files + sources + for f in pyf_files: + modulename = get_f2py_modulename(f) + if modulename: + break + + extra_objects, sources = filter_files('', '[.](o|a|so)', sources) + include_dirs, sources = filter_files('-I', '', sources, remove_prefix=1) + library_dirs, sources = filter_files('-L', '', sources, remove_prefix=1) + libraries, sources = filter_files('-l', '', sources, remove_prefix=1) + undef_macros, sources = filter_files('-U', '', sources, remove_prefix=1) + define_macros, sources = filter_files('-D', '', sources, remove_prefix=1) + using_numarray = 0 + using_numeric = 0 + for i in range(len(define_macros)): + name_value = define_macros[i].split('=', 1) + if len(name_value)==1: + name_value.append(None) + if len(name_value)==2: + define_macros[i] = tuple(name_value) + else: + print('Invalid use of -D:', name_value) + + from numpy.distutils.system_info import get_info + + num_include_dir = None + num_info = {} + #import numpy + #n = 'numpy' + #p = get_prefix(numpy) + #from numpy.distutils.misc_util import get_numpy_include_dirs + #num_info = {'include_dirs': get_numpy_include_dirs()} + + if num_info: + include_dirs.extend(num_info.get('include_dirs', [])) + + from numpy.distutils.core import setup, Extension + ext_args = {'name': modulename, 'sources': sources, + 'include_dirs': include_dirs, + 'library_dirs': library_dirs, + 'libraries': libraries, + 'define_macros': define_macros, + 'undef_macros': undef_macros, + 'extra_objects': extra_objects, + 'f2py_options': f2py_flags, + } + + if sysinfo_flags: + from numpy.distutils.misc_util import dict_append + for n in sysinfo_flags: + i = get_info(n) + if not i: + outmess('No %s resources found in system'\ + ' (try `f2py --help-link`)\n' % (repr(n))) + dict_append(ext_args,**i) + + ext = Extension(**ext_args) + sys.argv = [sys.argv[0]] + setup_flags + sys.argv.extend(['build', + '--build-temp', build_dir, + '--build-base', build_dir, + '--build-platlib', '.']) + if fc_flags: + sys.argv.extend(['config_fc']+fc_flags) + if flib_flags: + sys.argv.extend(['build_ext']+flib_flags) + + setup(ext_modules = [ext]) + + if remove_build_dir and os.path.exists(build_dir): + import shutil + outmess('Removing build directory %s\n'%(build_dir)) + shutil.rmtree(build_dir) + +def main(): + if '--help-link' in sys.argv[1:]: + sys.argv.remove('--help-link') + from numpy.distutils.system_info import show_all + show_all() + return + if '-c' in sys.argv[1:]: + run_compile() + else: + run_main(sys.argv[1:]) + +#if __name__ == "__main__": +# main() + + +# EOF