1from os.path import join
2
3
4def configuration(parent_package='', top_path=None):
5    from distutils.sysconfig import get_python_inc
6    from scipy._build_utils.system_info import get_info, numpy_info
7    from numpy.distutils.misc_util import Configuration, get_numpy_include_dirs
8    from scipy._build_utils import (get_g77_abi_wrappers, gfortran_legacy_flag_hook,
9                                    blas_ilp64_pre_build_hook, get_f2py_int64_options,
10                                    uses_blas64)
11
12    config = Configuration('linalg', parent_package, top_path)
13
14    lapack_opt = get_info('lapack_opt')
15
16    atlas_version = ([v[3:-3] for k, v in lapack_opt.get('define_macros', [])
17                      if k == 'ATLAS_INFO']+[None])[0]
18    if atlas_version:
19        print(('ATLAS version: %s' % atlas_version))
20
21    if uses_blas64():
22        lapack_ilp64_opt = get_info('lapack_ilp64_opt', 2)
23
24    # fblas:
25    sources = ['fblas.pyf.src']
26    sources += get_g77_abi_wrappers(lapack_opt)
27    depends = ['fblas_l?.pyf.src']
28
29    config.add_extension('_fblas',
30                         sources=sources,
31                         depends=depends,
32                         extra_info=lapack_opt
33                         )
34
35    if uses_blas64():
36        sources = ['fblas_64.pyf.src'] + sources[1:]
37        ext = config.add_extension('_fblas_64',
38                                   sources=sources,
39                                   depends=depends,
40                                   f2py_options=get_f2py_int64_options(),
41                                   extra_info=lapack_ilp64_opt)
42        ext._pre_build_hook = blas_ilp64_pre_build_hook(lapack_ilp64_opt)
43
44    # flapack:
45    sources = ['flapack.pyf.src']
46    sources += get_g77_abi_wrappers(lapack_opt)
47    dep_pfx = join('src', 'lapack_deprecations')
48    deprecated_lapack_routines = [join(dep_pfx, c + 'gegv.f') for c in 'cdsz']
49    sources += deprecated_lapack_routines
50    depends = ['flapack_gen.pyf.src',
51               'flapack_gen_banded.pyf.src',
52               'flapack_gen_tri.pyf.src',
53               'flapack_pos_def.pyf.src',
54               'flapack_pos_def_tri.pyf.src',
55               'flapack_sym_herm.pyf.src',
56               'flapack_other.pyf.src',
57               'flapack_user.pyf.src']
58
59    config.add_extension('_flapack',
60                         sources=sources,
61                         depends=depends,
62                         extra_info=lapack_opt
63                         )
64
65    if uses_blas64():
66        sources = ['flapack_64.pyf.src'] + sources[1:]
67        ext = config.add_extension('_flapack_64',
68                                   sources=sources,
69                                   depends=depends,
70                                   f2py_options=get_f2py_int64_options(),
71                                   extra_info=lapack_ilp64_opt)
72        ext._pre_build_hook = blas_ilp64_pre_build_hook(lapack_ilp64_opt)
73
74    if atlas_version is not None:
75        # cblas:
76        config.add_extension('_cblas',
77                             sources=['cblas.pyf.src'],
78                             depends=['cblas.pyf.src', 'cblas_l1.pyf.src'],
79                             extra_info=lapack_opt
80                             )
81
82        # clapack:
83        config.add_extension('_clapack',
84                             sources=['clapack.pyf.src'],
85                             depends=['clapack.pyf.src'],
86                             extra_info=lapack_opt
87                             )
88
89    # _flinalg:
90    config.add_extension('_flinalg',
91                         sources=[join('src', 'det.f'), join('src', 'lu.f')],
92                         extra_info=lapack_opt
93                         )
94
95    # _interpolative:
96    ext = config.add_extension('_interpolative',
97                               sources=[join('src', 'id_dist', 'src', '*.f'),
98                                        "interpolative.pyf"],
99                               extra_info=lapack_opt
100                               )
101    ext._pre_build_hook = gfortran_legacy_flag_hook
102
103    # _solve_toeplitz:
104    config.add_extension('_solve_toeplitz',
105                         sources=[('_solve_toeplitz.c')],
106                         include_dirs=[get_numpy_include_dirs()])
107
108    # _matfuncs_sqrtm_triu:
109    config.add_extension('_matfuncs_sqrtm_triu',
110                         sources=[('_matfuncs_sqrtm_triu.c')],
111                         include_dirs=[get_numpy_include_dirs()])
112
113    config.add_data_dir('tests')
114
115    # Cython BLAS/LAPACK
116    config.add_data_files('cython_blas.pxd')
117    config.add_data_files('cython_lapack.pxd')
118
119    sources = ['_blas_subroutine_wrappers.f', '_lapack_subroutine_wrappers.f']
120    sources += get_g77_abi_wrappers(lapack_opt)
121    includes = numpy_info().get_include_dirs() + [get_python_inc()]
122    config.add_library('fwrappers', sources=sources, include_dirs=includes)
123
124    config.add_extension('cython_blas',
125                         sources=['cython_blas.c'],
126                         depends=['cython_blas.pyx', 'cython_blas.pxd',
127                                  'fortran_defs.h', '_blas_subroutines.h'],
128                         include_dirs=['.'],
129                         libraries=['fwrappers'],
130                         extra_info=lapack_opt)
131
132    config.add_extension('cython_lapack',
133                         sources=['cython_lapack.c'],
134                         depends=['cython_lapack.pyx', 'cython_lapack.pxd',
135                                  'fortran_defs.h', '_lapack_subroutines.h'],
136                         include_dirs=['.'],
137                         libraries=['fwrappers'],
138                         extra_info=lapack_opt)
139
140    config.add_extension('_decomp_update',
141                         sources=['_decomp_update.c'])
142
143    # Add any license files
144    config.add_data_files('src/id_dist/doc/doc.tex')
145    config.add_data_files('src/lapack_deprecations/LICENSE')
146
147    return config
148
149
150if __name__ == '__main__':
151    from numpy.distutils.core import setup
152
153    setup(**configuration(top_path='').todict())
154