about summary refs log tree commit diff
path: root/pkgs/development/python-modules/scipy/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/python-modules/scipy/default.nix')
-rw-r--r--pkgs/development/python-modules/scipy/default.nix119
1 files changed, 98 insertions, 21 deletions
diff --git a/pkgs/development/python-modules/scipy/default.nix b/pkgs/development/python-modules/scipy/default.nix
index 1090e724a7fd..d51c049589ee 100644
--- a/pkgs/development/python-modules/scipy/default.nix
+++ b/pkgs/development/python-modules/scipy/default.nix
@@ -1,9 +1,14 @@
 { lib
 , stdenv
-, fetchPypi
+, fetchFromGitHub
+, fetchpatch
+, fetchurl
+, writeText
 , python
 , pythonOlder
 , buildPythonPackage
+, pypaBuildHook
+, pipInstallHook
 , cython
 , gfortran
 , meson-python
@@ -17,31 +22,77 @@
 , pybind11
 , pooch
 , libxcrypt
+, xsimd
+, blas
+, lapack
 }:
 
-buildPythonPackage rec {
+let
   pname = "scipy";
-  version = "1.10.1";
-  format = "pyproject";
-
-  src = fetchPypi {
-    inherit pname version;
-    hash = "sha256-LPnfuAp7RYm6TEDOdYiYbW1c68VFfK0sKID2vC1C86U=";
+  # DON'T UPDATE THESE ATTRIBUTES MANUALLY - USE:
+  #
+  #     nix-shell maintainers/scripts/update.nix --argstr package python3.pkgs.scipy
+  #
+  # Even if you do update these hashes manually, don't change their base
+  # (base16 or base64), because the update script uses sed regexes to replace
+  # them with the updated hashes.
+  version = "1.11.1";
+  srcHash = "sha256-bgnYXe3EhzL7+Gfriz1cXCl2eYQJ8zF+rcIwHyZR8bQ=";
+  datasetsHashes = {
+    ascent = "1qjp35ncrniq9rhzb14icwwykqg2208hcssznn3hz27w39615kh3";
+    ecg = "1bwbjp43b7znnwha5hv6wiz3g0bhwrpqpi75s12zidxrbwvd62pj";
+    face = "11i8x29h80y7hhyqhil1fg8mxag5f827g33lhnsf44qk116hp2wx";
+  };
+  datasets = lib.mapAttrs (
+    d: hash: fetchurl {
+      url = "https://raw.githubusercontent.com/scipy/dataset-${d}/main/${d}.dat";
+      sha256 = hash;
+    }
+  ) datasetsHashes;
+  # Additional cross compilation related properties that scipy reads in scipy/meson.build
+  crossFileScipy = writeText "cross-file-scipy.conf" ''
+    [properties]
+    numpy-include-dir = '${numpy}/${python.sitePackages}/numpy/core/include'
+    pythran-include-dir = '${pythran}/${python.sitePackages}/pythran'
+    host-python-path = '${python.interpreter}'
+    host-python-version = '${python.pythonVersion}'
+  '';
+in buildPythonPackage {
+  inherit pname version;
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "scipy";
+    repo = pname;
+    rev = "v${version}";
+    hash = srcHash;
+    fetchSubmodules = true;
   };
 
   patches = [
-    # These tests require internet connection, currently impossible to disable
-    # them otherwise, see:
-    # https://github.com/scipy/scipy/pull/17965
-    ./disable-datasets-tests.patch
+    # Helps with cross compilation, see https://github.com/scipy/scipy/pull/18167
+    (fetchpatch {
+      url = "https://github.com/scipy/scipy/commit/dd50ac9d98dbb70625333a23e3a90e493228e3be.patch";
+      hash = "sha256-Vf6/hhwu6X5s8KWhq8bUZKtSkdVu/GtEpGtj8Olxe7s=";
+      excludes = [
+        "doc/source/dev/contributor/meson_advanced.rst"
+      ];
+    })
   ];
 
-  nativeBuildInputs = [ cython gfortran meson-python pythran pkg-config wheel ];
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "pybind11>=2.10.4,<2.11.0" "pybind11>=2.10.4,<2.12.0"
+  '';
+
+  nativeBuildInputs = [ pypaBuildHook pipInstallHook cython gfortran meson-python pythran pkg-config wheel ];
 
   buildInputs = [
-    numpy.blas
+    blas
+    lapack
     pybind11
     pooch
+    xsimd
   ] ++ lib.optionals (pythonOlder "3.9") [
     libxcrypt
   ];
@@ -53,9 +104,29 @@ buildPythonPackage rec {
   doCheck = !(stdenv.isx86_64 && stdenv.isDarwin);
 
   preConfigure = ''
-    sed -i '0,/from numpy.distutils.core/s//import setuptools;from numpy.distutils.core/' setup.py
+    # Relax deps a bit
+    substituteInPlace pyproject.toml \
+      --replace 'numpy==' 'numpy>='
+    # Helps parallelization a bit
     export NPY_NUM_BUILD_JOBS=$NIX_BUILD_CORES
-  '';
+    # We download manually the datasets and this variable tells the pooch
+    # library where these files are cached. See also:
+    # https://github.com/scipy/scipy/pull/18518#issuecomment-1562350648 And at:
+    # https://github.com/scipy/scipy/pull/17965#issuecomment-1560759962
+    export XDG_CACHE_HOME=$PWD; export HOME=$(mktemp -d); mkdir scipy-data
+  '' + (lib.concatStringsSep "\n" (lib.mapAttrsToList (d: dpath:
+    # Actually copy the datasets
+    "cp ${dpath} scipy-data/${d}.dat"
+  ) datasets));
+
+  mesonFlags = [
+    "-Dblas=${blas.pname}"
+    "-Dlapack=${lapack.pname}"
+    # We always run what's necessary for cross compilation, which is passing to
+    # meson the proper cross compilation related arguments. See also:
+    # https://docs.scipy.org/doc/scipy/building/cross_compilation.html
+    "--cross-file=${crossFileScipy}"
+  ];
 
   # disable stackprotector on aarch64-darwin for now
   #
@@ -71,7 +142,7 @@ buildPythonPackage rec {
     runHook preCheck
     pushd "$out"
     export OMP_NUM_THREADS=$(( $NIX_BUILD_CORES / 4 ))
-    ${python.interpreter} -c "import scipy; scipy.test('fast', verbose=10, parallel=$NIX_BUILD_CORES)"
+    ${python.interpreter} -c "import scipy, sys; sys.exit(scipy.test('fast', verbose=10, parallel=$NIX_BUILD_CORES) != True)"
     popd
     runHook postCheck
   '';
@@ -79,17 +150,23 @@ buildPythonPackage rec {
   requiredSystemFeatures = [ "big-parallel" ]; # the tests need lots of CPU time
 
   passthru = {
-    blas = numpy.blas;
+    inherit blas;
+    updateScript = [
+      ./update.sh
+      # Pass it this file name as argument
+      (builtins.unsafeGetAttrPos "pname" python.pkgs.scipy).file
+    ]
+    # Pass it the names of the datasets to update their hashes
+    ++ (builtins.attrNames datasetsHashes)
+    ;
   };
 
-  setupPyBuildFlags = [ "--fcompiler='gnu95'" ];
-
   SCIPY_USE_G77_ABI_WRAPPER = 1;
 
   meta = with lib; {
     description = "SciPy (pronounced 'Sigh Pie') is open-source software for mathematics, science, and engineering";
     homepage = "https://www.scipy.org/";
     license = licenses.bsd3;
-    maintainers = [ maintainers.fridh ];
+    maintainers = with maintainers; [ fridh doronbehar ];
   };
 }