setup.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import os
  2. import sys
  3. import sysconfig
  4. def configuration(parent_package='', top_path=None):
  5. from numpy.distutils.misc_util import Configuration
  6. from numpy.distutils.ccompiler_opt import NPY_CXX_FLAGS
  7. from numpy.distutils.system_info import get_info, system_info
  8. config = Configuration('linalg', parent_package, top_path)
  9. config.add_subpackage('tests')
  10. # Configure lapack_lite
  11. src_dir = 'lapack_lite'
  12. lapack_lite_src = [
  13. os.path.join(src_dir, 'python_xerbla.c'),
  14. os.path.join(src_dir, 'f2c_z_lapack.c'),
  15. os.path.join(src_dir, 'f2c_c_lapack.c'),
  16. os.path.join(src_dir, 'f2c_d_lapack.c'),
  17. os.path.join(src_dir, 'f2c_s_lapack.c'),
  18. os.path.join(src_dir, 'f2c_lapack.c'),
  19. os.path.join(src_dir, 'f2c_blas.c'),
  20. os.path.join(src_dir, 'f2c_config.c'),
  21. os.path.join(src_dir, 'f2c.c'),
  22. ]
  23. all_sources = config.paths(lapack_lite_src)
  24. if os.environ.get('NPY_USE_BLAS_ILP64', "0") != "0":
  25. lapack_info = get_info('lapack_ilp64_opt', 2)
  26. else:
  27. lapack_info = get_info('lapack_opt', 0) # and {}
  28. use_lapack_lite = not lapack_info
  29. if use_lapack_lite:
  30. # This makes numpy.distutils write the fact that lapack_lite
  31. # is being used to numpy.__config__
  32. class numpy_linalg_lapack_lite(system_info):
  33. def calc_info(self):
  34. info = {'language': 'c'}
  35. size_t_size = sysconfig.get_config_var("SIZEOF_SIZE_T")
  36. if size_t_size:
  37. maxsize = 2**(size_t_size - 1) - 1
  38. else:
  39. # We prefer using sysconfig as it allows cross-compilation
  40. # but the information may be missing (e.g. on windows).
  41. maxsize = sys.maxsize
  42. if maxsize > 2**32:
  43. # Build lapack-lite in 64-bit integer mode.
  44. # The suffix is arbitrary (lapack_lite symbols follow it),
  45. # but use the "64_" convention here.
  46. info['define_macros'] = [
  47. ('HAVE_BLAS_ILP64', None),
  48. ('BLAS_SYMBOL_SUFFIX', '64_')
  49. ]
  50. self.set_info(**info)
  51. lapack_info = numpy_linalg_lapack_lite().get_info(2)
  52. def get_lapack_lite_sources(ext, build_dir):
  53. if use_lapack_lite:
  54. print("### Warning: Using unoptimized lapack ###")
  55. return all_sources
  56. else:
  57. if sys.platform == 'win32':
  58. print("### Warning: python_xerbla.c is disabled ###")
  59. return []
  60. return [all_sources[0]]
  61. config.add_extension(
  62. 'lapack_lite',
  63. sources=['lapack_litemodule.c', get_lapack_lite_sources],
  64. depends=['lapack_lite/f2c.h'],
  65. extra_info=lapack_info,
  66. )
  67. # umath_linalg module
  68. config.add_extension(
  69. '_umath_linalg',
  70. sources=['umath_linalg.cpp', get_lapack_lite_sources],
  71. depends=['lapack_lite/f2c.h'],
  72. extra_info=lapack_info,
  73. extra_cxx_compile_args=NPY_CXX_FLAGS,
  74. libraries=['npymath'],
  75. )
  76. config.add_data_files('*.pyi')
  77. return config
  78. if __name__ == '__main__':
  79. from numpy.distutils.core import setup
  80. setup(configuration=configuration)