|
| 1 | + |
1 | 2 | { |
2 | 3 | description = "Mesa flake using uv2nix"; |
3 | 4 |
|
4 | 5 | inputs = { |
5 | 6 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; |
| 7 | + flake-utils.url = "github:numtide/flake-utils"; |
6 | 8 |
|
7 | 9 | pyproject-nix = { |
8 | 10 | url = "github:pyproject-nix/pyproject.nix"; |
|
24 | 26 | }; |
25 | 27 |
|
26 | 28 | outputs = |
27 | | - { |
28 | | - self, |
29 | | - nixpkgs, |
30 | | - uv2nix, |
31 | | - pyproject-nix, |
32 | | - pyproject-build-systems, |
33 | | - ... |
| 29 | + { self |
| 30 | + , nixpkgs |
| 31 | + , flake-utils |
| 32 | + , uv2nix |
| 33 | + , pyproject-nix |
| 34 | + , pyproject-build-systems |
| 35 | + , ... |
34 | 36 | }: |
| 37 | + |
| 38 | + flake-utils.lib.eachSystem ["x86_64-linux" "aarch64-darwin"] (system: |
35 | 39 | let |
36 | 40 | inherit (nixpkgs) lib; |
37 | 41 |
|
| 42 | + # Use system-specific pkgs |
| 43 | + pkgs = nixpkgs.legacyPackages.${system}; |
| 44 | + |
38 | 45 | # Load a uv workspace from a workspace root. |
39 | 46 | # Uv2nix treats all uv projects as workspace projects. |
40 | 47 | workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; }; |
41 | 48 |
|
42 | 49 | # Create package overlay from workspace. |
43 | 50 | overlay = workspace.mkPyprojectOverlay { |
44 | | - # Prefer prebuilt binary wheels as a package source. |
45 | | - # Sdists are less likely to "just work" because of the metadata missing from uv.lock. |
46 | | - # Binary wheels are more likely to, but may still require overrides for library dependencies. |
47 | 51 | sourcePreference = "wheel"; # or sourcePreference = "sdist"; |
48 | | - # Optionally customise PEP 508 environment |
49 | | - # environ = { |
50 | | - # platform_release = "5.10.65"; |
51 | | - # }; |
52 | 52 | }; |
53 | 53 |
|
54 | | - # Extend generated overlay with build fixups |
55 | | - # |
56 | | - # Uv2nix can only work with what it has, and uv.lock is missing essential metadata to perform some builds. |
57 | | - # This is an additional overlay implementing build fixups. |
58 | | - # See: |
59 | | - # - https://pyproject-nix.github.io/uv2nix/FAQ.html |
60 | | - pyprojectOverrides = _final: _prev: { |
61 | | - # Implement build fixups here. |
62 | | - # Note that uv2nix is _not_ using Nixpkgs buildPythonPackage. |
63 | | - # It's using https://pyproject-nix.github.io/pyproject.nix/build.html |
64 | | - }; |
| 54 | + python = pkgs.python312; |
65 | 55 |
|
66 | | - # This example is only using x86_64-linux |
67 | | - pkgs = nixpkgs.legacyPackages.x86_64-linux; |
| 56 | + pyprojectOverrides = final: prev: { |
| 57 | + # Add the scipy override (need to do uv add pythran) |
| 58 | + scipy = prev.scipy.overrideAttrs (old: { |
| 59 | + nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ |
| 60 | + final.meson-python |
| 61 | + final.ninja |
| 62 | + final.cython |
| 63 | + final.numpy |
| 64 | + final.pybind11 |
| 65 | + final.packaging |
| 66 | + final.pyproject-metadata |
| 67 | + final.pythran |
| 68 | + final.gast |
| 69 | + final.beniget |
| 70 | + final.ply |
| 71 | + ]; |
68 | 72 |
|
69 | | - # Use Python 3.12 from nixpkgs |
70 | | - python = pkgs.python312; |
| 73 | + buildInputs = (old.buildInputs or []) ++ [ |
| 74 | + pkgs.gfortran |
| 75 | + pkgs.cmake |
| 76 | + pkgs.xsimd |
| 77 | + pkgs.pkg-config |
| 78 | + pkgs.openblas |
| 79 | + pkgs.meson |
| 80 | + pkgs.lapack |
| 81 | + ]; |
| 82 | + }); |
| 83 | + }; |
71 | 84 |
|
72 | 85 | # Construct package set |
73 | 86 | pythonSet = |
|
88 | 101 | # Package a virtual environment as our main application. |
89 | 102 | # |
90 | 103 | # Enable no optional dependencies for production build. |
91 | | - packages.x86_64-linux.default = pythonSet.mkVirtualEnv "mesa-env" workspace.deps.default; |
| 104 | + packages.default = pythonSet.mkVirtualEnv "mesa-env" workspace.deps.default; |
92 | 105 |
|
93 | | - apps.x86_64-linux = { |
| 106 | + apps = { |
94 | 107 | default = { |
95 | 108 | type = "app"; |
96 | | - program = "${self.packages.x86_64-linux.default}/bin/ipython"; |
| 109 | + program = "${self.packages.${system}.default}/bin/ipython"; |
97 | 110 | }; |
98 | 111 | }; |
99 | 112 |
|
100 | 113 | # This example provides two different modes of development: |
101 | 114 | # - Impurely using uv to manage virtual environments |
102 | 115 | # - Pure development using uv2nix to manage virtual environments |
103 | | - devShells.x86_64-linux = { |
| 116 | + devShells = { |
104 | 117 | # It is of course perfectly OK to keep using an impure virtualenv workflow and only use uv2nix to build packages. |
105 | 118 | # This devShell simply adds Python and undoes the dependency leakage done by Nixpkgs Python infrastructure. |
106 | 119 | impure = pkgs.mkShell { |
|
183 | 196 | # Enable all optional dependencies for development. |
184 | 197 | virtualenv = editablePythonSet.mkVirtualEnv "mesa-dev-env" workspace.deps.all; |
185 | 198 |
|
186 | | - |
187 | 199 | in |
188 | 200 | pkgs.mkShell { |
189 | 201 | packages = [ |
|
217 | 229 | fi |
218 | 230 | ''; |
219 | 231 | }; |
220 | | - # set uv2nix devShell as default nix develop .#uv2nix |
221 | | - default = self.devShells.x86_64-linux.uv2nix; |
| 232 | + # set uv2nix devShell as default |
| 233 | + default = self.devShells.${system}.uv2nix; |
222 | 234 | }; |
223 | | - }; |
| 235 | + }); |
224 | 236 | } |
0 commit comments