|
| 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