diff options
author | Travis Oliphant <oliphant@enthought.com> | 2006-01-04 17:33:12 +0000 |
---|---|---|
committer | Travis Oliphant <oliphant@enthought.com> | 2006-01-04 17:33:12 +0000 |
commit | 8057b2d910a5a6726a666a2c18ac495dbb9e6000 (patch) | |
tree | e8ab5a397e9d2d1fd3885f3524821587ee2d407c /numpy/core/setup.py | |
parent | da9c6da4a304d240492b653f526b9607b032921c (diff) | |
download | numpy-8057b2d910a5a6726a666a2c18ac495dbb9e6000.tar.gz |
rename sub-packages
Diffstat (limited to 'numpy/core/setup.py')
-rw-r--r-- | numpy/core/setup.py | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/numpy/core/setup.py b/numpy/core/setup.py new file mode 100644 index 000000000..5f0e0fa94 --- /dev/null +++ b/numpy/core/setup.py @@ -0,0 +1,284 @@ + +import imp +import os +from os.path import join +from glob import glob +from distutils.dep_util import newer,newer_group + +def configuration(parent_package='',top_path=None): + from scipy.distutils.misc_util import Configuration,dot_join + from scipy.distutils.system_info import get_info + + config = Configuration('base',parent_package,top_path) + local_dir = config.local_path + codegen_dir = join(local_dir,'code_generators') + + generate_umath_py = join(codegen_dir,'generate_umath.py') + n = dot_join(config.name,'generate_umath') + generate_umath = imp.load_module('_'.join(n.split('.')), + open(generate_umath_py,'U'),generate_umath_py, + ('.py','U',1)) + + header_dir = join(*(config.name.split('.')+['include','scipy'])) + + def generate_config_h(ext, build_dir): + target = join(build_dir,'config.h') + if newer(__file__,target): + config_cmd = config.get_config_cmd() + print 'Generating',target + # + tc = generate_testcode(target) + from distutils import sysconfig + python_include = sysconfig.get_python_inc() + result = config_cmd.try_run(tc,include_dirs=[python_include]) + if not result: + raise "ERROR: Failed to test configuration" + moredefs = [] + + # + mathlibs = [] + tc = testcode_mathlib() + mathlibs_choices = [[],['m'],['cpml']] + mathlib = os.environ.get('MATHLIB') + if mathlib: + mathlibs_choices.insert(0,mathlib.split(',')) + for libs in mathlibs_choices: + if config_cmd.try_run(tc,libraries=libs): + mathlibs = libs + break + else: + raise "math library missing; rerun setup.py after setting the MATHLIB env variable" + ext.libraries.extend(mathlibs) + moredefs.append(('MATHLIB',','.join(mathlibs))) + + libs = mathlibs + kws_args = {'libraries':libs,'decl':0,'headers':['math.h']} + if config_cmd.check_func('expl', **kws_args): + moredefs.append('HAVE_LONGDOUBLE_FUNCS') + if config_cmd.check_func('expf', **kws_args): + moredefs.append('HAVE_FLOAT_FUNCS') + if config_cmd.check_func('asinh', **kws_args): + moredefs.append('HAVE_INVERSE_HYPERBOLIC') + if config_cmd.check_func('atanhf', **kws_args): + moredefs.append('HAVE_INVERSE_HYPERBOLIC_FLOAT') + if config_cmd.check_func('atanhl', **kws_args): + moredefs.append('HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE') + if config_cmd.check_func('isnan', **kws_args): + moredefs.append('HAVE_ISNAN') + if config_cmd.check_func('isinf', **kws_args): + moredefs.append('HAVE_ISINF') + + if moredefs: + target_f = open(target,'a') + for d in moredefs: + if isinstance(d,str): + target_f.write('#define %s\n' % (d)) + else: + target_f.write('#define %s %s\n' % (d[0],d[1])) + target_f.close() + else: + mathlibs = [] + target_f = open(target) + for line in target_f.readlines(): + s = '#define MATHLIB' + if line.startswith(s): + value = line[len(s):].strip() + if value: + mathlibs.extend(value.split(',')) + target_f.close() + + ext.libraries.extend(mathlibs) + + incl_dir = os.path.dirname(target) + if incl_dir not in config.scipy_include_dirs: + config.scipy_include_dirs.append(incl_dir) + + config.add_data_files((header_dir,target)) + return target + + def generate_api_func(header_file, module_name): + def generate_api(ext,build_dir): + target = join(build_dir, header_file) + script = join(codegen_dir, module_name + '.py') + if newer(script, target): + sys.path.insert(0, codegen_dir) + try: + m = __import__(module_name) + print 'executing',script + m.generate_api(build_dir) + finally: + del sys.path[0] + config.add_data_files((header_dir,target)) + return target + return generate_api + + generate_array_api = generate_api_func('__multiarray_api.h', + 'generate_array_api') + generate_ufunc_api = generate_api_func('__ufunc_api.h', + 'generate_ufunc_api') + + def generate_umath_c(ext,build_dir): + target = join(build_dir,'__umath_generated.c') + script = generate_umath_py + if newer(script,target): + f = open(target,'w') + f.write(generate_umath.make_code(generate_umath.defdict, + generate_umath.__file__)) + f.close() + return [] + + config.add_data_files(join('include','scipy','*.h')) + config.add_include_dirs('src') + + config.scipy_include_dirs.extend(config.paths('include')) + + deps = [join('src','arrayobject.c'), + join('src','arraymethods.c'), + join('src','scalartypes.inc.src'), + join('src','arraytypes.inc.src'), + join('include','scipy','*object.h'), + join(codegen_dir,'genapi.py'), + join(codegen_dir,'*.txt') + ] + + config.add_extension('multiarray', + sources = [join('src','multiarraymodule.c'), + generate_config_h, + generate_array_api, + join('src','scalartypes.inc.src'), + join('src','arraytypes.inc.src'), + join(codegen_dir,'generate_array_api.py'), + join('*.py') + ], + depends = deps, + ) + + config.add_extension('umath', + sources = [generate_config_h, + join('src','umathmodule.c.src'), + generate_umath_c, + generate_ufunc_api, + join('src','scalartypes.inc.src'), + join('src','arraytypes.inc.src'), + ], + depends = [join('src','ufuncobject.c'), + generate_umath_py, + join(codegen_dir,'generate_ufunc_api.py'), + ]+deps, + ) + + config.add_extension('_compiled_base', + sources=[join('src','_compiled_base.c'), + generate_config_h, + generate_array_api, + ], + ) + + config.add_extension('_sort', + sources=[join('src','_sortmodule.c.src'), + generate_config_h, + generate_array_api, + ], + ) + + # Configure blasdot + blas_info = get_info('blas_opt',0) + #blas_info = {} + def get_dotblas_sources(ext, build_dir): + if blas_info: + return ext.depends[:1] + return None # no extension module will be built + + config.add_extension('_dotblas', + sources = [get_dotblas_sources], + depends=[join('blasdot','_dotblas.c'), + join('blasdot','cblas.h'), + ], + include_dirs = ['blasdot'], + extra_info = blas_info + ) + + + config.add_data_dir('tests') + config.make_svn_version_py() + + return config + +def testcode_mathlib(): + return """\ +/* check whether libm is broken */ +#include <math.h> +int main(int argc, char *argv[]) +{ + return exp(-720.) > 1.0; /* typically an IEEE denormal */ +} +""" + +import sys +def generate_testcode(target): + if sys.platform == 'win32': + target = target.replace('\\','\\\\') + testcode = [r''' +#include <Python.h> +#include <limits.h> +#include <stdio.h> + +int main(int argc, char **argv) +{ + + FILE *fp; + + fp = fopen("'''+target+'''","w"); + '''] + + c_size_test = r''' +#ifndef %(sz)s + fprintf(fp,"#define %(sz)s %%d\n", sizeof(%(type)s)); +#else + fprintf(fp,"/* #define %(sz)s %%d */\n", %(sz)s); +#endif +''' + for sz, t in [('SIZEOF_SHORT', 'short'), + ('SIZEOF_INT', 'int'), + ('SIZEOF_LONG', 'long'), + ('SIZEOF_FLOAT', 'float'), + ('SIZEOF_DOUBLE', 'double'), + ('SIZEOF_LONG_DOUBLE', 'long double'), + ('SIZEOF_PY_INTPTR_T', 'Py_intptr_t'), + ]: + testcode.append(c_size_test % {'sz' : sz, 'type' : t}) + + testcode.append('#ifdef PY_LONG_LONG') + testcode.append(c_size_test % {'sz' : 'SIZEOF_LONG_LONG', + 'type' : 'PY_LONG_LONG'}) + testcode.append(c_size_test % {'sz' : 'SIZEOF_PY_LONG_LONG', + 'type' : 'PY_LONG_LONG'}) + + + testcode.append(r''' +#else + fprintf(fp, "/* PY_LONG_LONG not defined */\n"); +#endif +#ifndef CHAR_BIT + { + unsigned char var = 2; + int i=0; + while (var >= 2) { + var = var << 1; + i++; + } + fprintf(fp,"#define CHAR_BIT %d\n", i+1); + } +#else + fprintf(fp, "/* #define CHAR_BIT %d */\n", CHAR_BIT); +#endif + fclose(fp); + return 0; +} +''') + testcode = '\n'.join(testcode) + return testcode + +if __name__=='__main__': + from scipy.distutils.core import setup + setup(**configuration(top_path='').todict()) |