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