summaryrefslogtreecommitdiff
path: root/numpy/core/setup.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/core/setup.py')
-rw-r--r--numpy/core/setup.py203
1 files changed, 56 insertions, 147 deletions
diff --git a/numpy/core/setup.py b/numpy/core/setup.py
index 10b8c093e..8ef012f70 100644
--- a/numpy/core/setup.py
+++ b/numpy/core/setup.py
@@ -20,7 +20,7 @@ from setup_common import * # noqa: F403
NPY_RELAXED_STRIDES_CHECKING = (os.environ.get('NPY_RELAXED_STRIDES_CHECKING', "1") != "0")
if not NPY_RELAXED_STRIDES_CHECKING:
raise SystemError(
- "Support for NPY_RELAXED_STRIDES_CHECKING=0 has been remove as of "
+ "Support for NPY_RELAXED_STRIDES_CHECKING=0 has been removed as of "
"NumPy 1.23. This error will eventually be removed entirely.")
# Put NPY_RELAXED_STRIDES_DEBUG=1 in the environment if you want numpy to use a
@@ -45,6 +45,8 @@ NPY_DISABLE_SVML = (os.environ.get('NPY_DISABLE_SVML', "0") == "1")
# in time is only in build. -- Charles Harris, 2013-03-30
class CallOnceOnly:
+ # NOTE: we don't need any of this in the Meson build,
+ # it takes care of caching
def __init__(self):
self._check_types = None
self._check_ieee_macros = None
@@ -58,14 +60,6 @@ class CallOnceOnly:
out = copy.deepcopy(pickle.loads(self._check_types))
return out
- def check_ieee_macros(self, *a, **kw):
- if self._check_ieee_macros is None:
- out = check_ieee_macros(*a, **kw)
- self._check_ieee_macros = pickle.dumps(out)
- else:
- out = copy.deepcopy(pickle.loads(self._check_ieee_macros))
- return out
-
def check_complex(self, *a, **kw):
if self._check_complex is None:
out = check_complex(*a, **kw)
@@ -85,11 +79,13 @@ def can_link_svml():
and "linux" in platform
and sys.maxsize > 2**31)
-def check_svml_submodule(svmlpath):
- if not os.path.exists(svmlpath + "/README.md"):
- raise RuntimeError("Missing `SVML` submodule! Run `git submodule "
- "update --init` to fix this.")
- return True
+def check_git_submodules():
+ out = os.popen("git submodule status")
+ modules = out.readlines()
+ for submodule in modules:
+ if (submodule.strip()[0] == "-"):
+ raise RuntimeError("git submodules are not initialized."
+ "Please run `git submodule update --init` to fix this.")
def pythonlib_dir():
"""return path where libpython* is."""
@@ -177,16 +173,6 @@ def check_math_capabilities(config, ext, moredefs, mathlibs):
else:
return 1
- # GH-14787: Work around GCC<8.4 bug when compiling with AVX512
- # support on Windows-based platforms
- def check_gh14787(fn):
- if fn == 'attribute_target_avx512f':
- if (sys.platform in ('win32', 'cygwin') and
- config.check_compiler_gcc() and
- not config.check_gcc_version_at_least(8, 4)):
- ext.extra_compile_args.extend(
- ['-ffixed-xmm%s' % n for n in range(16, 32)])
-
#use_msvc = config.check_decl("_MSC_VER")
if not check_funcs_once(MANDATORY_FUNCS, add_to_moredefs=False):
raise SystemError("One of the required function to build numpy is not"
@@ -237,20 +223,8 @@ def check_math_capabilities(config, ext, moredefs, mathlibs):
for dec, fn in OPTIONAL_FUNCTION_ATTRIBUTES:
if config.check_gcc_function_attribute(dec, fn):
moredefs.append((fname2def(fn), 1))
- check_gh14787(fn)
platform = sysconfig.get_platform()
- if ("x86_64" in platform):
- for dec, fn in OPTIONAL_FUNCTION_ATTRIBUTES_AVX:
- if config.check_gcc_function_attribute(dec, fn):
- moredefs.append((fname2def(fn), 1))
- check_gh14787(fn)
- for dec, fn, code, header in (
- OPTIONAL_FUNCTION_ATTRIBUTES_WITH_INTRINSICS_AVX):
- if config.check_gcc_function_attribute_with_intrinsics(
- dec, fn, code, header):
- moredefs.append((fname2def(fn), 1))
-
for fn in OPTIONAL_VARIABLE_ATTRIBUTES:
if config.check_gcc_variable_attribute(fn):
m = fn.replace("(", "_").replace(")", "_")
@@ -289,43 +263,6 @@ def check_complex(config, mathlibs):
return priv, pub
-def check_ieee_macros(config):
- priv = []
- pub = []
-
- macros = []
-
- def _add_decl(f):
- priv.append(fname2def("decl_%s" % f))
- pub.append('NPY_%s' % fname2def("decl_%s" % f))
-
- # XXX: hack to circumvent cpp pollution from python: python put its
- # config.h in the public namespace, so we have a clash for the common
- # functions we test. We remove every function tested by python's
- # autoconf, hoping their own test are correct
- _macros = ["isnan", "isinf", "signbit", "isfinite"]
- for f in _macros:
- py_symbol = fname2def("decl_%s" % f)
- already_declared = config.check_decl(py_symbol,
- headers=["Python.h", "math.h"])
- if already_declared:
- if config.check_macro_true(py_symbol,
- headers=["Python.h", "math.h"]):
- pub.append('NPY_%s' % fname2def("decl_%s" % f))
- else:
- macros.append(f)
- # Normally, isnan and isinf are macro (C99), but some platforms only have
- # func, or both func and macro version. Check for macro only, and define
- # replacement ones if not found.
- # Note: including Python.h is necessary because it modifies some math.h
- # definitions
- for f in macros:
- st = config.check_decl(f, headers=["Python.h", "math.h"])
- if st:
- _add_decl(f)
-
- return priv, pub
-
def check_types(config_cmd, ext, build_dir):
private_defines = []
public_defines = []
@@ -427,6 +364,8 @@ def check_types(config_cmd, ext, build_dir):
return private_defines, public_defines
+# NOTE: this isn't needed in the Meson build,
+# and we won't support a MATHLIB env var
def check_mathlib(config_cmd):
# Testing the C math library
mathlibs = []
@@ -466,7 +405,6 @@ def configuration(parent_package='',top_path=None):
exec_mod_from_location)
from numpy.distutils.system_info import (get_info, blas_opt_info,
lapack_opt_info)
- from numpy.distutils.ccompiler_opt import NPY_CXX_FLAGS
from numpy.version import release as is_released
config = Configuration('core', parent_package, top_path)
@@ -477,6 +415,8 @@ def configuration(parent_package='',top_path=None):
# actual C API VERSION. Will raise a MismatchCAPIError if so.
check_api_version(C_API_VERSION, codegen_dir)
+ check_git_submodules()
+
generate_umath_py = join(codegen_dir, 'generate_umath.py')
n = dot_join(config.name, 'generate_umath')
generate_umath = exec_mod_from_location('_'.join(n.split('.')),
@@ -504,12 +444,11 @@ def configuration(parent_package='',top_path=None):
moredefs.append(('MATHLIB', ','.join(mathlibs)))
check_math_capabilities(config_cmd, ext, moredefs, mathlibs)
- moredefs.extend(cocache.check_ieee_macros(config_cmd)[0])
moredefs.extend(cocache.check_complex(config_cmd, mathlibs)[0])
# Signal check
if is_npy_no_signal():
- moredefs.append('__NPY_PRIVATE_NO_SIGNAL')
+ moredefs.append('NPY_NO_SIGNAL')
# Windows checks
if sys.platform == 'win32' or os.name == 'nt':
@@ -623,7 +562,6 @@ def configuration(parent_package='',top_path=None):
moredefs.append(('NPY_NO_SMP', 0))
mathlibs = check_mathlib(config_cmd)
- moredefs.extend(cocache.check_ieee_macros(config_cmd)[1])
moredefs.extend(cocache.check_complex(config_cmd, mathlibs)[1])
if NPY_RELAXED_STRIDES_DEBUG:
@@ -671,11 +609,11 @@ def configuration(parent_package='',top_path=None):
try:
m = __import__(module_name)
log.info('executing %s', script)
- h_file, c_file, doc_file = m.generate_api(os.path.join(build_dir, header_dir))
+ h_file, c_file = m.generate_api(os.path.join(build_dir, header_dir))
finally:
del sys.path[0]
config.add_data_files((header_dir, h_file),
- (header_dir, doc_file))
+ )
return (h_file,)
return generate_api
@@ -704,8 +642,7 @@ def configuration(parent_package='',top_path=None):
config.numpy_include_dirs.extend(config.paths('include'))
- deps = [join('src', 'npymath', '_signbit.c'),
- join('include', 'numpy', '*object.h'),
+ deps = [join('include', 'numpy', '*object.h'),
join(codegen_dir, 'genapi.py'),
]
@@ -720,44 +657,6 @@ def configuration(parent_package='',top_path=None):
# but we cannot use add_installed_pkg_config here either, so we only
# update the substitution dictionary during npymath build
config_cmd = config.get_config_cmd()
- # Check that the toolchain works, to fail early if it doesn't
- # (avoid late errors with MATHLIB which are confusing if the
- # compiler does not work).
- for lang, test_code, note in (
- ('c', 'int main(void) { return 0;}', ''),
- ('c++', (
- 'int main(void)'
- '{ auto x = 0.0; return static_cast<int>(x); }'
- ), (
- 'note: A compiler with support for C++11 language '
- 'features is required.'
- )
- ),
- ):
- is_cpp = lang == 'c++'
- if is_cpp:
- # this a workaround to get rid of invalid c++ flags
- # without doing big changes to config.
- # c tested first, compiler should be here
- bk_c = config_cmd.compiler
- config_cmd.compiler = bk_c.cxx_compiler()
-
- # Check that Linux compiler actually support the default flags
- if hasattr(config_cmd.compiler, 'compiler'):
- config_cmd.compiler.compiler.extend(NPY_CXX_FLAGS)
- config_cmd.compiler.compiler_so.extend(NPY_CXX_FLAGS)
-
- st = config_cmd.try_link(test_code, lang=lang)
- if not st:
- # rerun the failing command in verbose mode
- config_cmd.compiler.verbose = True
- config_cmd.try_link(test_code, lang=lang)
- raise RuntimeError(
- f"Broken toolchain: cannot link a simple {lang.upper()} "
- f"program. {note}"
- )
- if is_cpp:
- config_cmd.compiler = bk_c
mlibs = check_mathlib(config_cmd)
posix_mlib = ' '.join(['-l%s' % l for l in mlibs])
@@ -770,7 +669,7 @@ def configuration(parent_package='',top_path=None):
# join('src', 'npymath', 'ieee754.cpp'),
join('src', 'npymath', 'ieee754.c.src'),
join('src', 'npymath', 'npy_math_complex.c.src'),
- join('src', 'npymath', 'halffloat.c')
+ join('src', 'npymath', 'halffloat.cpp'),
]
config.add_installed_library('npymath',
@@ -828,7 +727,8 @@ def configuration(parent_package='',top_path=None):
join('src', 'common', 'numpyos.h'),
join('src', 'common', 'npy_cpu_dispatch.h'),
join('src', 'common', 'simd', 'simd.h'),
- ]
+ join('src', 'common', 'common.hpp'),
+ ]
common_src = [
join('src', 'common', 'array_assign.c'),
@@ -882,6 +782,7 @@ def configuration(parent_package='',top_path=None):
join('src', 'multiarray', 'descriptor.h'),
join('src', 'multiarray', 'dtypemeta.h'),
join('src', 'multiarray', 'dtype_transfer.h'),
+ join('src', 'multiarray', 'dtype_traversal.h'),
join('src', 'multiarray', 'dragon4.h'),
join('src', 'multiarray', 'einsum_debug.h'),
join('src', 'multiarray', 'einsum_sumprod.h'),
@@ -955,6 +856,7 @@ def configuration(parent_package='',top_path=None):
join('src', 'multiarray', 'dtypemeta.c'),
join('src', 'multiarray', 'dragon4.c'),
join('src', 'multiarray', 'dtype_transfer.c'),
+ join('src', 'multiarray', 'dtype_traversal.c'),
join('src', 'multiarray', 'einsum.c.src'),
join('src', 'multiarray', 'einsum_sumprod.c.src'),
join('src', 'multiarray', 'experimental_public_dtype_api.c'),
@@ -984,7 +886,6 @@ def configuration(parent_package='',top_path=None):
join('src', 'multiarray', 'usertypes.c'),
join('src', 'multiarray', 'vdot.c'),
join('src', 'common', 'npy_sort.h.src'),
- join('src', 'npysort', 'x86-qsort.dispatch.cpp'),
join('src', 'npysort', 'quicksort.cpp'),
join('src', 'npysort', 'mergesort.cpp'),
join('src', 'npysort', 'timsort.cpp'),
@@ -1002,6 +903,12 @@ def configuration(parent_package='',top_path=None):
join('src', 'multiarray', 'textreading', 'stream_pyobject.c'),
join('src', 'multiarray', 'textreading', 'str_to_int.c'),
join('src', 'multiarray', 'textreading', 'tokenize.cpp'),
+ # Remove this once scipy macos arm64 build correctly
+ # links to the arm64 npymath library,
+ # see gh-22673
+ join('src', 'npymath', 'arm64_exports.c'),
+ join('src', 'npysort', 'simd_qsort.dispatch.cpp'),
+ join('src', 'npysort', 'simd_qsort_16bit.dispatch.cpp'),
]
#######################################################################
@@ -1039,13 +946,15 @@ def configuration(parent_package='',top_path=None):
join('src', 'umath', 'umathmodule.c'),
join('src', 'umath', 'reduction.c'),
join('src', 'umath', 'funcs.inc.src'),
- join('src', 'umath', 'simd.inc.src'),
join('src', 'umath', 'loops.h.src'),
join('src', 'umath', 'loops_utils.h.src'),
join('src', 'umath', 'loops.c.src'),
+ join('src', 'umath', 'loops_unary.dispatch.c.src'),
join('src', 'umath', 'loops_unary_fp.dispatch.c.src'),
+ join('src', 'umath', 'loops_unary_fp_le.dispatch.c.src'),
join('src', 'umath', 'loops_arithm_fp.dispatch.c.src'),
join('src', 'umath', 'loops_arithmetic.dispatch.c.src'),
+ join('src', 'umath', 'loops_logical.dispatch.c.src'),
join('src', 'umath', 'loops_minmax.dispatch.c.src'),
join('src', 'umath', 'loops_trigonometric.dispatch.c.src'),
join('src', 'umath', 'loops_umath_fp.dispatch.c.src'),
@@ -1053,6 +962,8 @@ def configuration(parent_package='',top_path=None):
join('src', 'umath', 'loops_hyperbolic.dispatch.c.src'),
join('src', 'umath', 'loops_modulo.dispatch.c.src'),
join('src', 'umath', 'loops_comparison.dispatch.c.src'),
+ join('src', 'umath', 'loops_unary_complex.dispatch.c.src'),
+ join('src', 'umath', 'loops_autovec.dispatch.c.src'),
join('src', 'umath', 'matmul.h.src'),
join('src', 'umath', 'matmul.c.src'),
join('src', 'umath', 'clip.h'),
@@ -1077,7 +988,6 @@ def configuration(parent_package='',top_path=None):
join('src', 'multiarray', 'common.h'),
join('src', 'multiarray', 'number.h'),
join('src', 'common', 'templ_common.h.src'),
- join('src', 'umath', 'simd.inc.src'),
join('src', 'umath', 'override.h'),
join(codegen_dir, 'generate_ufunc_api.py'),
join(codegen_dir, 'ufunc_docstrings.py'),
@@ -1092,7 +1002,7 @@ def configuration(parent_package='',top_path=None):
# after all maintainable code.
svml_filter = (
)
- if can_link_svml() and check_svml_submodule(svml_path):
+ if can_link_svml():
svml_objs = glob.glob(svml_path + '/**/*.s', recursive=True)
svml_objs = [o for o in svml_objs if not o.endswith(svml_filter)]
@@ -1101,9 +1011,6 @@ def configuration(parent_package='',top_path=None):
svml_objs.sort()
config.add_extension('_multiarray_umath',
- # Forcing C language even though we have C++ sources.
- # It forces the C linker and don't link C++ runtime.
- language = 'c',
sources=multiarray_src + umath_src +
common_src +
[generate_config_h,
@@ -1119,8 +1026,7 @@ def configuration(parent_package='',top_path=None):
common_deps,
libraries=['npymath'],
extra_objects=svml_objs,
- extra_info=extra_info,
- extra_cxx_compile_args=NPY_CXX_FLAGS)
+ extra_info=extra_info)
#######################################################################
# umath_tests module #
@@ -1158,23 +1064,26 @@ def configuration(parent_package='',top_path=None):
# SIMD module #
#######################################################################
- config.add_extension('_simd', sources=[
- join('src', 'common', 'npy_cpu_features.c'),
- join('src', '_simd', '_simd.c'),
- join('src', '_simd', '_simd_inc.h.src'),
- join('src', '_simd', '_simd_data.inc.src'),
- join('src', '_simd', '_simd.dispatch.c.src'),
- ], depends=[
- join('src', 'common', 'npy_cpu_dispatch.h'),
- join('src', 'common', 'simd', 'simd.h'),
- join('src', '_simd', '_simd.h'),
- join('src', '_simd', '_simd_inc.h.src'),
- join('src', '_simd', '_simd_data.inc.src'),
- join('src', '_simd', '_simd_arg.inc'),
- join('src', '_simd', '_simd_convert.inc'),
- join('src', '_simd', '_simd_easyintrin.inc'),
- join('src', '_simd', '_simd_vector.inc'),
- ])
+ config.add_extension('_simd',
+ sources=[
+ join('src', 'common', 'npy_cpu_features.c'),
+ join('src', '_simd', '_simd.c'),
+ join('src', '_simd', '_simd_inc.h.src'),
+ join('src', '_simd', '_simd_data.inc.src'),
+ join('src', '_simd', '_simd.dispatch.c.src'),
+ ], depends=[
+ join('src', 'common', 'npy_cpu_dispatch.h'),
+ join('src', 'common', 'simd', 'simd.h'),
+ join('src', '_simd', '_simd.h'),
+ join('src', '_simd', '_simd_inc.h.src'),
+ join('src', '_simd', '_simd_data.inc.src'),
+ join('src', '_simd', '_simd_arg.inc'),
+ join('src', '_simd', '_simd_convert.inc'),
+ join('src', '_simd', '_simd_easyintrin.inc'),
+ join('src', '_simd', '_simd_vector.inc'),
+ ],
+ libraries=['npymath']
+ )
config.add_subpackage('tests')
config.add_data_dir('tests/data')