1{ lib
2, stdenv
3, buildPythonPackage
4, fetchPypi
5, fetchpatch
6, python
7, pkg-config
8, gdb
9, numpy
10, ncurses
11}:
12
13let
14 excludedTests = [ "reimport_from_subinterpreter" ]
15 # cython's testsuite is not working very well with libc++
16 # We are however optimistic about things outside of testsuite still working
17 ++ lib.optionals (stdenv.cc.isClang or false) [ "cpdef_extern_func" "libcpp_algo" ]
18 # Some tests in the test suite isn't working on aarch64. Disable them for
19 # now until upstream finds a workaround.
20 # Upstream issue here: https://github.com/cython/cython/issues/2308
21 ++ lib.optionals stdenv.isAarch64 [ "numpy_memoryview" ]
22 ++ lib.optionals stdenv.isi686 [ "future_division" "overflow_check_longlong" ]
23 ;
24
25in buildPythonPackage rec {
26 pname = "cython";
27 version = "0.29.36";
28
29 src = fetchPypi {
30 pname = "Cython";
31 inherit version;
32 hash = "sha256-QcDP0tdU44PJ7rle/8mqSrhH0Ml0cHfd18Dctow7wB8=";
33 };
34
35 nativeBuildInputs = [
36 pkg-config
37 ];
38
39 nativeCheckInputs = [
40 gdb numpy ncurses
41 ];
42
43 LC_ALL = "en_US.UTF-8";
44
45 patches = [
46 # backport Cython 3.0 trashcan support (https://github.com/cython/cython/pull/2842) to 0.X series.
47 # it does not affect Python code unless the code explicitly uses the feature.
48 # trashcan support is needed to avoid stack overflows during object deallocation in sage (https://trac.sagemath.org/ticket/27267)
49 ./trashcan.patch
50 # The above commit introduces custom trashcan macros, as well as
51 # compiler changes to use them in Cython-emitted code. The latter
52 # change is still useful, but the former has been upstreamed as of
53 # Python 3.8, and the patch below makes Cython use the upstream
54 # trashcan macros whenever available. This is needed for Python
55 # 3.11 support, because the API used in Cython's implementation
56 # changed: https://github.com/cython/cython/pull/4475
57 (fetchpatch {
58 name = "disable-trashcan.patch";
59 url = "https://github.com/cython/cython/commit/e337825cdcf5e94d38ba06a0cb0188e99ce0cc92.patch";
60 hash = "sha256-q0f63eetKrDpmP5Z4v8EuGxg26heSyp/62OYqhRoSso=";
61 })
62 ];
63
64 checkPhase = ''
65 export HOME="$NIX_BUILD_TOP"
66 ${python.interpreter} runtests.py -j$NIX_BUILD_CORES \
67 --no-code-style \
68 ${lib.optionalString (builtins.length excludedTests != 0)
69 ''--exclude="(${builtins.concatStringsSep "|" excludedTests})"''}
70 '';
71
72 # https://github.com/cython/cython/issues/2785
73 # Temporary solution
74 doCheck = false;
75 # doCheck = !stdenv.isDarwin;
76
77 # force regeneration of generated code in source distributions
78 # https://github.com/cython/cython/issues/5089
79 setupHook = ./setup-hook.sh;
80
81 meta = {
82 changelog = "https://github.com/cython/cython/blob/${version}/CHANGES.rst";
83 description = "An optimising static compiler for both the Python programming language and the extended Cython programming language";
84 homepage = "https://cython.org";
85 license = lib.licenses.asl20;
86 maintainers = with lib.maintainers; [ fridh ];
87 };
88}