diff options
author | thor <thor@pkgsrc.org> | 2021-04-20 20:53:48 +0000 |
---|---|---|
committer | thor <thor@pkgsrc.org> | 2021-04-20 20:53:48 +0000 |
commit | 3346598b0f861752c8270035a26b561219eb618d (patch) | |
tree | 2931a3a190373c11f42a9639a3c522ac7e104ac2 /math/py-numpy | |
parent | 9d43f7f3322debd47f0a3765499c2855290463fa (diff) | |
download | pkgsrc-3346598b0f861752c8270035a26b561219eb618d.tar.gz |
math/py-numpy: updated system_info patch to upstreamed version, use cblas
The patch to system_info.py got upstreamed in a modified form which is
now backported here. On updating to 1.21, it shall be dropped.
In the process of upstreaming the patch, I learned that numpy really
needs to use cblas for proper acceleration, so it does that now and
gets a PKGREVISION bump because of that.
Diffstat (limited to 'math/py-numpy')
-rw-r--r-- | math/py-numpy/Makefile | 18 | ||||
-rw-r--r-- | math/py-numpy/Makefile.make_env | 5 | ||||
-rw-r--r-- | math/py-numpy/buildlink3.mk | 10 | ||||
-rw-r--r-- | math/py-numpy/distinfo | 4 | ||||
-rw-r--r-- | math/py-numpy/patches/patch-numpy_distutils_system__info.py | 118 |
5 files changed, 80 insertions, 75 deletions
diff --git a/math/py-numpy/Makefile b/math/py-numpy/Makefile index 3d4929a93d8..8d585651c39 100644 --- a/math/py-numpy/Makefile +++ b/math/py-numpy/Makefile @@ -1,7 +1,7 @@ -# $NetBSD: Makefile,v 1.77 2021/04/07 11:57:30 thor Exp $ +# $NetBSD: Makefile,v 1.78 2021/04/20 20:53:48 thor Exp $ DISTNAME= numpy-1.19.5 -PKGREVISION= 3 +PKGREVISION= 4 PKGNAME= ${PYPKGPREFIX}-${DISTNAME} CATEGORIES= math python MASTER_SITES= ${MASTER_SITE_PYPI:=n/numpy/} @@ -18,11 +18,8 @@ TEST_DEPENDS+= ${PYPKGPREFIX}-test-[0-9]*:../../devel/py-test # error: 'for' loop initial declarations are only allowed in C99 mode USE_LANGUAGES= c99 fortran -# Use our BLAS. The patch adds 'generic' as first entry anyway, but we -# enforce it to fail early and for the case that upstream accepts the -# patch, but with changed default order. -MAKE_ENV+= BLAS_LIBS=${BLAS_LIBS:Q} LAPACK_LIBS=${LAPACK_LIBS:Q} -MAKE_ENV+= NPY_BLAS_ORDER=generic NPY_LAPACK_ORDER=generic + +.include "../../math/py-numpy/Makefile.make_env" REPLACE_PYTHON+= *.py */*.py */*/*.py */*/*/*.py */*/*/*/*.py @@ -61,9 +58,6 @@ BUILDLINK_API_DEPENDS.py-cython+= ${PYPKGPREFIX}-cython>=0.29.21 .include "../../devel/py-cython/buildlink3.mk" .include "../../lang/python/application.mk" .include "../../lang/python/egg.mk" -# Consider allowing mk/blas.buildlink3.mk to handle Accelerate.framework -.if ${OPSYS} != "Darwin" -# blas and lapack are not needed; numpy will use Accelerate.framework -.include "../../mk/blas.buildlink3.mk" -.endif +# BLAS with CBLAS is needed for proper acceleration. +.include "../../math/cblas/buildlink3.mk" .include "../../mk/bsd.pkg.mk" diff --git a/math/py-numpy/Makefile.make_env b/math/py-numpy/Makefile.make_env new file mode 100644 index 00000000000..fbfc12a14ec --- /dev/null +++ b/math/py-numpy/Makefile.make_env @@ -0,0 +1,5 @@ +# Use the variables from blas.buildlink3.mk, pulled in via cblas. +# Dependend python packages possiblly re-use the system_info logic and +# might need this in the environment. +MAKE_ENV+= NPY_BLAS_LIBS=${BLAS_LIBS:Q} NPY_LAPACK_LIBS=${LAPACK_LIBS:Q} +MAKE_ENV+= NPY_CBLAS_LIBS=-lcblas diff --git a/math/py-numpy/buildlink3.mk b/math/py-numpy/buildlink3.mk index d0f71d315e6..ee068b5794f 100644 --- a/math/py-numpy/buildlink3.mk +++ b/math/py-numpy/buildlink3.mk @@ -1,4 +1,4 @@ -# $NetBSD: buildlink3.mk,v 1.8 2021/03/25 21:47:50 thor Exp $ +# $NetBSD: buildlink3.mk,v 1.9 2021/04/20 20:53:48 thor Exp $ BUILDLINK_TREE+= py-numpy @@ -18,13 +18,9 @@ BUILDLINK_PKGSRCDIR.py-numpy?= ../../math/py-numpy .include "../../mk/bsd.fast.prefs.mk" -# Dependend python packages re-use the BLAS_LIBS logic and -# need this in the environment. -MAKE_ENV+= BLAS_LIBS=${BLAS_LIBS:Q} LAPACK_LIBS=${LAPACK_LIBS:Q} +.include "../../math/py-numpy/Makefile.make_env" +.include "../../math/cblas/buildlink3.mk" -.if ${OPSYS} != "Darwin" -.include "../../mk/blas.buildlink3.mk" -.endif .endif # PY_NUMPY_BUILDLINK3_MK BUILDLINK_TREE+= -py-numpy diff --git a/math/py-numpy/distinfo b/math/py-numpy/distinfo index 6ee8ebf32e1..d7cef431f95 100644 --- a/math/py-numpy/distinfo +++ b/math/py-numpy/distinfo @@ -1,4 +1,4 @@ -$NetBSD: distinfo,v 1.59 2021/04/07 11:57:30 thor Exp $ +$NetBSD: distinfo,v 1.60 2021/04/20 20:53:48 thor Exp $ SHA1 (numpy-1.19.5.zip) = 61f0b3dad58ce97b14da9dccbee0722d36f26937 RMD160 (numpy-1.19.5.zip) = 3317c98790e8c2d1d9c36279b3451f09b6776935 @@ -7,5 +7,5 @@ Size (numpy-1.19.5.zip) = 7318340 bytes SHA1 (patch-numpy_distutils_fcompiler_____init____.py) = 49d070da5b48bd9818b37ac3254341fa68503c53 SHA1 (patch-numpy_distutils_fcompiler_g95.py) = be73b64a3e551df998b6a904d6db762bf28a98ed SHA1 (patch-numpy_distutils_fcompiler_gnu.py) = 1d62e1c5e35de0f2cf975de38f62df7f10c71d74 -SHA1 (patch-numpy_distutils_system__info.py) = 8322a9f27f61626812509e26c80cb9f9b49ced7e +SHA1 (patch-numpy_distutils_system__info.py) = 6910006662d49408186ac5f687eb20114ff9eb89 SHA1 (patch-numpy_linalg_lapack__litemodule.c) = e97ec871c2f33c3121b3c8471a9e5a74c3c798c8 diff --git a/math/py-numpy/patches/patch-numpy_distutils_system__info.py b/math/py-numpy/patches/patch-numpy_distutils_system__info.py index 879586b5267..f17a12541c5 100644 --- a/math/py-numpy/patches/patch-numpy_distutils_system__info.py +++ b/math/py-numpy/patches/patch-numpy_distutils_system__info.py @@ -1,78 +1,88 @@ -$NetBSD: patch-numpy_distutils_system__info.py,v 1.6 2021/04/07 11:57:30 thor Exp $ +$NetBSD: patch-numpy_distutils_system__info.py,v 1.7 2021/04/20 20:53:49 thor Exp $ -Introduce new option 'generic' for BLAS and LAPACK -TODO: The same for 64 bit offset versions, but we'd need repspective BLAS builds -first in pkgsrc to test. - ---- numpy/distutils/system_info.py.orig 2021-01-04 14:16:38.000000000 +0000 +--- numpy/distutils/system_info.py.orig 2021-04-20 18:13:28.992593008 +0000 +++ numpy/distutils/system_info.py -@@ -114,6 +114,13 @@ Currently, the following classes are ava +@@ -114,6 +114,19 @@ Currently, the following classes are ava x11_info:x11 xft_info:xft -+Note that blas_opt_info and lapack_opt_info honor the NPY_BLAS_ORDER and NPY_LAPACK_ORDER -+environment variables to select a specific implementation. One possible implementation -+is 'generic', which relies on the environment providing BLAS_LIBS and LAPACK_LIBS to -+link to the customary plain f77 interface, supporting any standard-conforming BLAS -+and LAPACK implementation (which might be different between build-time and run-time, -+even). ++Note that blas_opt_info and lapack_opt_info honor the NPY_BLAS_ORDER ++and NPY_LAPACK_ORDER environment variables to determine the order in which ++specific BLAS and LAPACK libraries are searched for. ++ ++This search (or autodetection) can be bypassed by defining the environment ++variables NPY_BLAS_LIBS and NPY_LAPACK_LIBS, which should then contain the ++exact linker flags to use (language will be set to F77). Building against ++Netlib BLAS/LAPACK or stub files, in order to be able to switch BLAS and LAPACK ++implementations at runtime. If using this to build NumPy itself, it is ++recommended to also define NPY_CBLAS_LIBS (assuming your BLAS library has a ++CBLAS interface) to enable CBLAS usage for matrix multiplication (unoptimized ++otherwise). + Example: ---------- [DEFAULT] -@@ -1651,7 +1658,7 @@ def get_atlas_version(**config): - class lapack_opt_info(system_info): - notfounderror = LapackNotFoundError - # List of all known BLAS libraries, in the default order -- lapack_order = ['mkl', 'openblas', 'flame', 'atlas', 'accelerate', 'lapack'] -+ lapack_order = ['generic', 'mkl', 'openblas', 'flame', 'atlas', 'accelerate', 'lapack'] - order_env_var_name = 'NPY_LAPACK_ORDER' - - def _calc_info_mkl(self): -@@ -1744,6 +1751,18 @@ class lapack_opt_info(system_info): +@@ -1744,6 +1757,16 @@ class lapack_opt_info(system_info): return True return False -+ def _calc_info_generic(self): -+ if 'LAPACK_LIBS' in os.environ: -+ info = {} -+ info['language'] = 'f77' -+ info['libraries'] = [] -+ info['include_dirs'] = [] -+ info['define_macros'] = [] -+ info['extra_link_args'] = os.environ['LAPACK_LIBS'].split() -+ self.set_info(**info) -+ return True -+ return False ++ def _calc_info_from_envvar(self): ++ info = {} ++ info['language'] = 'f77' ++ info['libraries'] = [] ++ info['include_dirs'] = [] ++ info['define_macros'] = [] ++ info['extra_link_args'] = os.environ['NPY_LAPACK_LIBS'].split() ++ self.set_info(**info) ++ return True + def _calc_info(self, name): return getattr(self, '_calc_info_{}'.format(name))() -@@ -1823,7 +1842,7 @@ class lapack64__opt_info(lapack_ilp64_op - class blas_opt_info(system_info): - notfounderror = BlasNotFoundError - # List of all known BLAS libraries, in the default order -- blas_order = ['mkl', 'blis', 'openblas', 'atlas', 'accelerate', 'blas'] -+ blas_order = ['generic', 'mkl', 'blis', 'openblas', 'atlas', 'accelerate', 'blas'] - order_env_var_name = 'NPY_BLAS_ORDER' +@@ -1767,6 +1790,12 @@ class lapack_opt_info(system_info): + "LAPACK order has unacceptable " + "values: {}".format(non_existing)) - def _calc_info_mkl(self): -@@ -1889,6 +1908,18 @@ class blas_opt_info(system_info): ++ if 'NPY_LAPACK_LIBS' in os.environ: ++ # Bypass autodetection, set language to F77 and use env var linker ++ # flags directly ++ self._calc_info_from_envvar() ++ return ++ + for lapack in lapack_order: + if self._calc_info(lapack): + return +@@ -1889,6 +1918,20 @@ class blas_opt_info(system_info): self.set_info(**info) return True -+ def _calc_info_generic(self): -+ if 'BLAS_LIBS' in os.environ: -+ info = {} -+ info['language'] = 'f77' -+ info['libraries'] = [] -+ info['include_dirs'] = [] -+ info['define_macros'] = [] -+ info['extra_link_args'] = os.environ['BLAS_LIBS'].split() -+ self.set_info(**info) -+ return True -+ return False ++ def _calc_info_from_envvar(self): ++ info = {} ++ info['language'] = 'f77' ++ info['libraries'] = [] ++ info['include_dirs'] = [] ++ info['define_macros'] = [] ++ info['extra_link_args'] = os.environ['NPY_BLAS_LIBS'].split() ++ if 'NPY_CBLAS_LIBS' in os.environ: ++ info['define_macros'].append(('HAVE_CBLAS', None)) ++ info['extra_link_args'].extend( ++ os.environ['NPY_CBLAS_LIBS'].split()) ++ self.set_info(**info) ++ return True + def _calc_info(self, name): return getattr(self, '_calc_info_{}'.format(name))() +@@ -1910,6 +1953,12 @@ class blas_opt_info(system_info): + if len(non_existing) > 0: + raise ValueError("blas_opt_info user defined BLAS order has unacceptable values: {}".format(non_existing)) + ++ if 'NPY_BLAS_LIBS' in os.environ: ++ # Bypass autodetection, set language to F77 and use env var linker ++ # flags directly ++ self._calc_info_from_envvar() ++ return ++ + for blas in blas_order: + if self._calc_info(blas): + return |