system_info.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. from __future__ import division, absolute_import, print_function
  2. import warnings
  3. import numpy as np
  4. import numpy.distutils.system_info
  5. from numpy.distutils.system_info import (system_info,
  6. numpy_info,
  7. NotFoundError,
  8. BlasNotFoundError,
  9. LapackNotFoundError,
  10. AtlasNotFoundError,
  11. LapackSrcNotFoundError,
  12. BlasSrcNotFoundError,
  13. dict_append,
  14. get_info as old_get_info)
  15. from scipy._lib._version import NumpyVersion
  16. if NumpyVersion(np.__version__) >= "1.15.0.dev":
  17. # For new enough numpy.distutils, the ACCELERATE=None environment
  18. # variable in the top-level setup.py is enough, so no need to
  19. # customize BLAS detection.
  20. get_info = old_get_info
  21. else:
  22. # For numpy < 1.15.0, we need overrides.
  23. def get_info(name, notfound_action=0):
  24. # Special case our custom *_opt_info
  25. cls = {'lapack_opt': lapack_opt_info,
  26. 'blas_opt': blas_opt_info}.get(name.lower())
  27. if cls is None:
  28. return old_get_info(name, notfound_action)
  29. return cls().get_info(notfound_action)
  30. #
  31. # The following is copypaste from numpy.distutils.system_info, with
  32. # OSX Accelerate-related parts removed.
  33. #
  34. class lapack_opt_info(system_info):
  35. notfounderror = LapackNotFoundError
  36. def calc_info(self):
  37. lapack_mkl_info = get_info('lapack_mkl')
  38. if lapack_mkl_info:
  39. self.set_info(**lapack_mkl_info)
  40. return
  41. openblas_info = get_info('openblas_lapack')
  42. if openblas_info:
  43. self.set_info(**openblas_info)
  44. return
  45. openblas_info = get_info('openblas_clapack')
  46. if openblas_info:
  47. self.set_info(**openblas_info)
  48. return
  49. atlas_info = get_info('atlas_3_10_threads')
  50. if not atlas_info:
  51. atlas_info = get_info('atlas_3_10')
  52. if not atlas_info:
  53. atlas_info = get_info('atlas_threads')
  54. if not atlas_info:
  55. atlas_info = get_info('atlas')
  56. need_lapack = 0
  57. need_blas = 0
  58. info = {}
  59. if atlas_info:
  60. l = atlas_info.get('define_macros', [])
  61. if ('ATLAS_WITH_LAPACK_ATLAS', None) in l \
  62. or ('ATLAS_WITHOUT_LAPACK', None) in l:
  63. need_lapack = 1
  64. info = atlas_info
  65. else:
  66. warnings.warn(AtlasNotFoundError.__doc__, stacklevel=2)
  67. need_blas = 1
  68. need_lapack = 1
  69. dict_append(info, define_macros=[('NO_ATLAS_INFO', 1)])
  70. if need_lapack:
  71. lapack_info = get_info('lapack')
  72. #lapack_info = {} ## uncomment for testing
  73. if lapack_info:
  74. dict_append(info, **lapack_info)
  75. else:
  76. warnings.warn(LapackNotFoundError.__doc__, stacklevel=2)
  77. lapack_src_info = get_info('lapack_src')
  78. if not lapack_src_info:
  79. warnings.warn(LapackSrcNotFoundError.__doc__, stacklevel=2)
  80. return
  81. dict_append(info, libraries=[('flapack_src', lapack_src_info)])
  82. if need_blas:
  83. blas_info = get_info('blas')
  84. if blas_info:
  85. dict_append(info, **blas_info)
  86. else:
  87. warnings.warn(BlasNotFoundError.__doc__, stacklevel=2)
  88. blas_src_info = get_info('blas_src')
  89. if not blas_src_info:
  90. warnings.warn(BlasSrcNotFoundError.__doc__, stacklevel=2)
  91. return
  92. dict_append(info, libraries=[('fblas_src', blas_src_info)])
  93. self.set_info(**info)
  94. return
  95. class blas_opt_info(system_info):
  96. notfounderror = BlasNotFoundError
  97. def calc_info(self):
  98. blas_mkl_info = get_info('blas_mkl')
  99. if blas_mkl_info:
  100. self.set_info(**blas_mkl_info)
  101. return
  102. blis_info = get_info('blis')
  103. if blis_info:
  104. self.set_info(**blis_info)
  105. return
  106. openblas_info = get_info('openblas')
  107. if openblas_info:
  108. self.set_info(**openblas_info)
  109. return
  110. atlas_info = get_info('atlas_3_10_blas_threads')
  111. if not atlas_info:
  112. atlas_info = get_info('atlas_3_10_blas')
  113. if not atlas_info:
  114. atlas_info = get_info('atlas_blas_threads')
  115. if not atlas_info:
  116. atlas_info = get_info('atlas_blas')
  117. need_blas = 0
  118. info = {}
  119. if atlas_info:
  120. info = atlas_info
  121. else:
  122. warnings.warn(AtlasNotFoundError.__doc__, stacklevel=2)
  123. need_blas = 1
  124. dict_append(info, define_macros=[('NO_ATLAS_INFO', 1)])
  125. if need_blas:
  126. blas_info = get_info('blas')
  127. if blas_info:
  128. dict_append(info, **blas_info)
  129. else:
  130. warnings.warn(BlasNotFoundError.__doc__, stacklevel=2)
  131. blas_src_info = get_info('blas_src')
  132. if not blas_src_info:
  133. warnings.warn(BlasSrcNotFoundError.__doc__, stacklevel=2)
  134. return
  135. dict_append(info, libraries=[('fblas_src', blas_src_info)])
  136. self.set_info(**info)
  137. return