Merge pull request #307098 from r-ryantm/auto-update/cilium-cli
[NixPkgs.git] / pkgs / development / python-modules / scipy / default.nix
blob609c595eeb24a579c08be5c9bd598b73f74cb35f
1 { lib
2 , stdenv
3 , fetchFromGitHub
4 , fetchpatch
5 , fetchurl
6 , writeText
7 , python
8 , pythonOlder
9 , buildPythonPackage
10 , cython
11 , gfortran
12 , meson-python
13 , nukeReferences
14 , pkg-config
15 , pythran
16 , wheel
17 , setuptools
18 , hypothesis
19 , pytest7CheckHook
20 , pytest-xdist
21 , numpy
22 , pybind11
23 , pooch
24 , libxcrypt
25 , xsimd
26 , blas
27 , lapack
30 let
31   pname = "scipy";
32   # DON'T UPDATE THESE ATTRIBUTES MANUALLY - USE:
33   #
34   #     nix-shell maintainers/scripts/update.nix --argstr package python3.pkgs.scipy
35   #
36   # The update script uses sed regexes to replace them with the updated hashes.
37   version = "1.13.0";
38   srcHash = "sha256-HaYk92hOREHMOXppK+Bs9DrBu9KUVUsZ0KV+isTofUo=";
39   datasetsHashes = {
40     ascent = "1qjp35ncrniq9rhzb14icwwykqg2208hcssznn3hz27w39615kh3";
41     ecg = "1bwbjp43b7znnwha5hv6wiz3g0bhwrpqpi75s12zidxrbwvd62pj";
42     face = "11i8x29h80y7hhyqhil1fg8mxag5f827g33lhnsf44qk116hp2wx";
43   };
44   datasets = lib.mapAttrs (
45     d: hash: fetchurl {
46       url = "https://raw.githubusercontent.com/scipy/dataset-${d}/main/${d}.dat";
47       sha256 = hash;
48     }
49   ) datasetsHashes;
50   # Additional cross compilation related properties that scipy reads in scipy/meson.build
51   crossFileScipy = writeText "cross-file-scipy.conf" ''
52     [properties]
53     numpy-include-dir = '${numpy}/${python.sitePackages}/numpy/core/include'
54     pythran-include-dir = '${pythran}/${python.sitePackages}/pythran'
55     host-python-path = '${python.interpreter}'
56     host-python-version = '${python.pythonVersion}'
57   '';
58 in buildPythonPackage {
59   inherit pname version;
60   format = "pyproject";
62   src = fetchFromGitHub {
63     owner = "scipy";
64     repo = pname;
65     rev = "v${version}";
66     hash = srcHash;
67     fetchSubmodules = true;
68   };
70   patches = [
71     # Helps with cross compilation, see https://github.com/scipy/scipy/pull/18167
72     (fetchpatch {
73       url = "https://github.com/scipy/scipy/commit/dd50ac9d98dbb70625333a23e3a90e493228e3be.patch";
74       hash = "sha256-Vf6/hhwu6X5s8KWhq8bUZKtSkdVu/GtEpGtj8Olxe7s=";
75       excludes = [
76         "doc/source/dev/contributor/meson_advanced.rst"
77       ];
78     })
79     # Fix for https://github.com/scipy/scipy/issues/20300 until 1.13.1 is
80     # released. Patch is based upon:
81     # https://github.com/scipy/pocketfft/commit/9367142748fcc9696a1c9e5a99b76ed9897c9daa
82     # Couldn't use fetchpatch because it is a submodule of scipy, and
83     # extraPrefix doesn't fit this purpose.
84     ./pocketfft-aligned_alloc.patch
85   ];
87   # Upstream says in a comment in their pyproject.toml that building against
88   # both numpy 2 and numpy 1 should work, but they seem to worry about numpy
89   # incompatibilities that we here with Nixpkgs' Python ecosystem, shouldn't
90   # experience.
91   postPatch = ''
92     substituteInPlace pyproject.toml \
93       --replace-fail 'numpy>=2.0.0rc1,' 'numpy' \
94   '';
96   nativeBuildInputs = [
97     cython
98     gfortran
99     meson-python
100     nukeReferences
101     pythran
102     pkg-config
103     wheel
104     setuptools
105   ];
107   buildInputs = [
108     blas
109     lapack
110     pybind11
111     pooch
112     xsimd
113   ] ++ lib.optionals (pythonOlder "3.9") [
114     libxcrypt
115   ];
117   propagatedBuildInputs = [ numpy ];
119   __darwinAllowLocalNetworking = true;
121   nativeCheckInputs = [
122     hypothesis
123     # Failed: DID NOT WARN. No warnings of type (<class 'DeprecationWarning'>, <class 'PendingDeprecationWarning'>, <class 'FutureWarning'>) were emitted.
124     pytest7CheckHook
125     pytest-xdist
126   ];
128   # The following tests are broken on aarch64-darwin with newer compilers and library versions.
129   # See https://github.com/scipy/scipy/issues/18308
130   disabledTests = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
131     "test_a_b_neg_int_after_euler_hypergeometric_transformation"
132     "test_dst4_definition_ortho"
133     "test_load_mat4_le"
134     "hyp2f1_test_case47"
135     "hyp2f1_test_case3"
136     "test_uint64_max"
137   ];
139   doCheck = !(stdenv.isx86_64 && stdenv.isDarwin);
141   preConfigure = ''
142     # Helps parallelization a bit
143     export NPY_NUM_BUILD_JOBS=$NIX_BUILD_CORES
144     # We download manually the datasets and this variable tells the pooch
145     # library where these files are cached. See also:
146     # https://github.com/scipy/scipy/pull/18518#issuecomment-1562350648 And at:
147     # https://github.com/scipy/scipy/pull/17965#issuecomment-1560759962
148     export XDG_CACHE_HOME=$PWD; export HOME=$(mktemp -d); mkdir scipy-data
149   '' + (lib.concatStringsSep "\n" (lib.mapAttrsToList (d: dpath:
150     # Actually copy the datasets
151     "cp ${dpath} scipy-data/${d}.dat"
152   ) datasets));
154   mesonFlags = [
155     "-Dblas=${blas.pname}"
156     "-Dlapack=${lapack.pname}"
157     # We always run what's necessary for cross compilation, which is passing to
158     # meson the proper cross compilation related arguments. See also:
159     # https://docs.scipy.org/doc/scipy/building/cross_compilation.html
160     "--cross-file=${crossFileScipy}"
161   ];
163   # disable stackprotector on aarch64-darwin for now
164   #
165   # build error:
166   #
167   # /private/tmp/nix-build-python3.9-scipy-1.6.3.drv-0/ccDEsw5U.s:109:15: error: index must be an integer in range [-256, 255].
168   #
169   #         ldr     x0, [x0, ___stack_chk_guard];momd
170   #
171   hardeningDisable = lib.optionals (stdenv.isAarch64 && stdenv.isDarwin) [ "stackprotector" ];
173   # remove references to dev dependencies
174   postInstall = ''
175     nuke-refs $out/${python.sitePackages}/scipy/__config__.py
176     rm $out/${python.sitePackages}/scipy/__pycache__/__config__.*.opt-1.pyc
177   '';
179   preCheck = ''
180     export OMP_NUM_THREADS=$(( $NIX_BUILD_CORES / 4 ))
181     cd $out
182   '';
184   requiredSystemFeatures = [ "big-parallel" ]; # the tests need lots of CPU time
186   passthru = {
187     inherit blas;
188     updateScript = [
189       ./update.sh
190       # Pass it this file name as argument
191       (builtins.unsafeGetAttrPos "pname" python.pkgs.scipy).file
192     ]
193     # Pass it the names of the datasets to update their hashes
194     ++ (builtins.attrNames datasetsHashes)
195     ;
196   };
198   SCIPY_USE_G77_ABI_WRAPPER = 1;
200   meta = with lib; {
201     changelog = "https://github.com/scipy/scipy/releases/tag/v${version}";
202     description = "SciPy (pronounced 'Sigh Pie') is open-source software for mathematics, science, and engineering";
203     downloadPage = "https://github.com/scipy/scipy";
204     homepage = "https://www.scipy.org/";
205     license = licenses.bsd3;
206     maintainers = with maintainers; [ fridh doronbehar ];
207   };