1{
2 lib,
3 newScope,
4 stdenv,
5 buildPythonPackage,
6 fetchFromGitHub,
7 fetchpatch2,
8 python,
9 pax-utils,
10
11 # build-system
12 setuptools,
13 cython,
14 pybind11,
15
16 # dependencies
17 decorator,
18 cachetools,
19 mpi4py,
20 fenics-ufl,
21 firedrake-fiat,
22 h5py,
23 libsupermesh,
24 loopy,
25 petsc4py,
26 numpy,
27 packaging,
28 pkgconfig,
29 progress,
30 pyadjoint-ad,
31 pycparser,
32 pytools,
33 requests,
34 rtree,
35 scipy,
36 sympy,
37 islpy,
38 matplotlib,
39
40 # tests
41 pytest,
42 mpi-pytest,
43 mpiCheckPhaseHook,
44 writableTmpDirAsHomeHook,
45
46 # passthru.tests
47 firedrake,
48 mpich,
49}:
50let
51 firedrakePackages = lib.makeScope newScope (self: {
52 inherit (petsc4py.petscPackages) mpi hdf5;
53 mpi4py = self.callPackage mpi4py.override { };
54 h5py = self.callPackage h5py.override { };
55 mpi-pytest = self.callPackage mpi-pytest.override { };
56 });
57in
58buildPythonPackage rec {
59 pname = "firedrake";
60 version = "2025.4.0.post0";
61 pyproject = true;
62
63 src = fetchFromGitHub {
64 owner = "firedrakeproject";
65 repo = "firedrake";
66 tag = version;
67 hash = "sha256-wQOS4v/YkIwXdQq6JMvRbmyhnzvx6wj0O6aszNa5ZMw=";
68 };
69
70 patches = [
71 (fetchpatch2 {
72 url = "https://github.com/firedrakeproject/firedrake/commit/b358e33ab12b3c4bc3819c9c6e9ed0930082b750.patch?full_index=1";
73 hash = "sha256-y00GB8njhmHgtAVvlv8ImsJe+hMCU1QFtbB8llEhv/I=";
74 })
75 ];
76
77 postPatch =
78 ''
79 # relax build-dependency petsc4py
80 substituteInPlace pyproject.toml --replace-fail \
81 "petsc4py==3.23.0" "petsc4py"
82
83 # These scripts are used by official source distribution only,
84 # and do not make sense in our binary distribution.
85 sed -i '/firedrake-\(check\|status\|run-split-tests\)/d' pyproject.toml
86 ''
87 + lib.optionalString stdenv.hostPlatform.isLinux ''
88 substituteInPlace firedrake/petsc.py --replace-fail \
89 'program = ["ldd"]' \
90 'program = ["${lib.getExe' pax-utils "lddtree"}"]'
91 ''
92 + lib.optionalString stdenv.hostPlatform.isDarwin ''
93 substituteInPlace firedrake/petsc.py --replace-fail \
94 'program = ["otool"' \
95 'program = ["${lib.getExe' stdenv.cc.bintools.bintools "otool"}"'
96 '';
97
98 pythonRelaxDeps = [
99 "decorator"
100 ];
101
102 build-system = [
103 cython
104 libsupermesh
105 firedrakePackages.mpi4py
106 numpy
107 pkgconfig
108 pybind11
109 setuptools
110 petsc4py
111 rtree
112 ];
113
114 nativeBuildInputs = [
115 firedrakePackages.mpi
116 ];
117
118 dependencies =
119 [
120 decorator
121 cachetools
122 firedrakePackages.mpi4py
123 fenics-ufl
124 firedrake-fiat
125 firedrakePackages.h5py
126 libsupermesh
127 loopy
128 petsc4py
129 numpy
130 packaging
131 pkgconfig
132 progress
133 pyadjoint-ad
134 pycparser
135 pytools
136 requests
137 rtree
138 scipy
139 sympy
140 # required by script spydump
141 matplotlib
142 ]
143 ++ pytools.optional-dependencies.siphash
144 ++ lib.optional stdenv.hostPlatform.isDarwin islpy;
145
146 postFixup = lib.optionalString stdenv.hostPlatform.isDarwin ''
147 install_name_tool -add_rpath ${libsupermesh}/${python.sitePackages}/libsupermesh/lib \
148 $out/${python.sitePackages}/firedrake/cython/supermeshimpl.cpython-*-darwin.so
149 '';
150
151 doCheck = true;
152
153 __darwinAllowLocalNetworking = true;
154
155 pythonImportsCheck = [ "firedrake" ];
156
157 nativeCheckInputs = [
158 pytest
159 firedrakePackages.mpi-pytest
160 mpiCheckPhaseHook
161 writableTmpDirAsHomeHook
162 ];
163
164 preCheck = ''
165 rm -rf firedrake pyop2 tinyasm tsfc
166 '';
167
168 # run official smoke tests
169 checkPhase = ''
170 runHook preCheck
171
172 make check
173
174 runHook postCheck
175 '';
176
177 passthru = {
178 tests = lib.optionalAttrs stdenv.hostPlatform.isLinux {
179 mpich = firedrake.override {
180 petsc4py = petsc4py.override { mpi = mpich; };
181 };
182 };
183 };
184
185 meta = {
186 homepage = "https://www.firedrakeproject.org";
187 downloadPage = "https://github.com/firedrakeproject/firedrake";
188 description = "Automated Finite Element System";
189 license = with lib.licenses; [
190 bsd3
191 lgpl3Plus
192 ];
193 maintainers = with lib.maintainers; [ qbisi ];
194 };
195}