1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
# vim:syntax=python
from os.path import join as pjoin, dirname as pdirname, basename as pbasename
import sys
from numpy.distutils.misc_util import get_numpy_include_dirs, get_pkg_info
from numscons import GetNumpyEnvironment
from numscons import CheckF77Clib
from SCons.Builder import Builder
from numscons.numdist import process_c_str as process_str
env = GetNumpyEnvironment(ARGUMENTS)
env.Tool('f2py')
#---------------------------
# Builder for generated code
#---------------------------
# Taken from numpy.core.scons_support
# Builder is added where needed (log
def split_ext(string):
sp = string.rsplit( '.', 1)
if len(sp) == 1:
return (sp[0], '')
else:
return sp
def do_generate_from_template(targetfile, sourcefile, env):
t = open(targetfile, 'w')
s = open(sourcefile, 'r')
allstr = s.read()
s.close()
writestr = process_str(allstr)
t.write(writestr)
t.close()
return 0
def generate_from_template(target, source, env):
for t, s in zip(target, source):
do_generate_from_template(str(t), str(s), env)
def generate_from_template_emitter(target, source, env):
base, ext = split_ext(pbasename(str(source[0])))
t = pjoin(pdirname(str(target[0])), base)
return ([t], source)
template_bld = Builder(action = Action(generate_from_template, '$TEMPLATECOMSTR'),
emitter = generate_from_template_emitter)
env.Append(BUILDERS = {'GenerateFromTemplate' : template_bld})
if sys.platform=='win32':
# define_macros.append(('NOINFINITIES',None))
# define_macros.append(('NONANS',None))
env.PrependUnique(CPPDEFINES = '_USE_MATH_DEFINES')
config = env.NumpyConfigure(custom_tests = {'CheckF77Clib' : CheckF77Clib})
if not config.CheckF77Clib():
raise RuntimeError("Could not get C/F77 runtime information")
config.CheckF77Mangling()
config.Finish()
env.PrependUnique(CPPPATH=[get_numpy_include_dirs(), env["PYEXTCPPPATH"]])
def build_lib(name, ext, libname = None):
"""ext should be .f or .c"""
if not libname:
libname = name
src = env.Glob(pjoin(name, '*%s' % ext))
assert len(src) > 0
env.DistutilsStaticExtLibrary(libname, source = src)
# C libraries
build_lib('c_misc', '.c', 'sc_c_misc')
build_lib('cephes', '.c', 'sc_cephes')
# F libraries
# XXX: handle no opt flags for mach
build_lib('mach', '.f', 'sc_mach')
build_lib('toms', '.f', 'sc_toms')
build_lib('amos', '.f', 'sc_amos')
build_lib('cdflib', '.f', 'sc_cdf')
build_lib('specfun', '.f', 'sc_specfunlib')
math_info = get_pkg_info("npymath")
env.MergeFlags(math_info.cflags())
env.MergeFlags(math_info.libs())
env.PrependUnique(LIBPATH = ['.'])
# orthogonal_eval extension
env.NumpyPythonExtension('orthogonal_eval', source = 'orthogonal_eval.c')
# logit extension
logit_src = env.GenerateFromTemplate('_logit.c.src')
env.NumpyPythonExtension('_logit', source = logit_src)
# lambertw extension
env.NumpyPythonExtension('lambertw', source = 'lambertw.c')
# Cephes extension
src = ['_cephesmodule.c', 'amos_wrappers.c', 'specfun_wrappers.c', \
'toms_wrappers.c','cdf_wrappers.c','ufunc_extras.c']
env.NumpyPythonExtension('_cephes',
source = src,
LIBS = ['sc_amos', 'sc_toms', 'sc_c_misc', 'sc_cephes', 'sc_mach',\
'sc_cdf', 'sc_specfunlib'])
# Specfun extension
env.Prepend(LIBS = ['sc_specfunlib'])
env.NumpyPythonExtension('specfun', source = 'specfun.pyf',
F2PYOPTIONS = ["--no-wrap-functions"])
|