wip
1{
2 description = "Stack allocated structured concurrency";
3
4 inputs = {
5 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
6
7 rust-overlay = {
8 url = "github:oxalica/rust-overlay";
9 inputs.nixpkgs.follows = "nixpkgs";
10 };
11
12 naersk = {
13 url = "github:nix-community/naersk";
14 inputs.nixpkgs.follows = "nixpkgs";
15 };
16 };
17
18 outputs = { nixpkgs, rust-overlay, naersk, ... }:
19 let
20 forAllSystems = function:
21 nixpkgs.lib.genAttrs [
22 "x86_64-linux"
23 "aarch64-linux"
24 "riscv64-linux"
25 "aarch64-darwin"
26 ] (system: function nixpkgs.legacyPackages.${system});
27
28 forEachSystem = forAllSystems (pkgs:
29 let
30 pkgs' = pkgs.extend rust-overlay.overlays.default;
31
32 rust-stable = pkgs'.rust-bin.stable.latest.default.override {
33 extensions = [ "rust-src" "clippy" "rustfmt" ];
34 };
35
36 rust-nightly = pkgs'.rust-bin.nightly.latest.default.override {
37 extensions = [ "rust-src" "clippy" "rustfmt" "miri" ];
38 };
39
40 naersk-stable = pkgs'.callPackage naersk {
41 cargo = rust-stable;
42 rustc = rust-stable;
43 };
44
45 naersk-nightly = pkgs'.callPackage naersk {
46 cargo = rust-nightly;
47 rustc = rust-nightly;
48 };
49
50 buildInputs = [];
51 nativeBuildInputs = [];
52
53 # Production package built with stable Rust
54 package = naersk-stable.buildPackage {
55 src = ./.;
56 inherit buildInputs nativeBuildInputs;
57 };
58
59 # Development package built with nightly (for Miri compatibility)
60 packageNightly = naersk-nightly.buildPackage {
61 src = ./.;
62 inherit buildInputs nativeBuildInputs;
63 };
64
65 in
66 {
67 packages = {
68 default = package;
69 stable = package;
70 nightly = packageNightly;
71 };
72
73 devShells = {
74 default = pkgs'.mkShell {
75 buildInputs = buildInputs ++ [
76 rust-stable
77 pkgs'.rust-analyzer
78 ];
79 nativeBuildInputs = nativeBuildInputs;
80
81 # RUST_SRC_PATH = "${rust-stable}/lib/rustlib/src/rust/library";
82 };
83
84 nightly = pkgs'.mkShell {
85 buildInputs = buildInputs ++ [
86 rust-nightly
87 # pkgs'.rust-analyzer
88 ];
89 nativeBuildInputs = nativeBuildInputs;
90
91 # RUST_SRC_PATH = "${rust-nightly}/lib/rustlib/src/rust/library";
92 MIRIFLAGS = "-Zmiri-strict-provenance";
93
94 shellHook = ''
95 echo "Nightly Rust environment with Miri"
96 '';
97 };
98 };
99
100 checks = {
101 test = pkgs'.runCommand "cargo-test" {
102 buildInputs = [ rust-stable ] ++ buildInputs;
103 nativeBuildInputs = nativeBuildInputs;
104 } ''
105 cargo test --release
106 '';
107
108 miri = pkgs'.runCommand "cargo-miri-test" {
109 buildInputs = [ rust-nightly ] ++ buildInputs;
110 nativeBuildInputs = nativeBuildInputs;
111 } ''
112 cargo miri test --release
113 '';
114
115 clippy = pkgs'.runCommand "cargo-clippy" {
116 buildInputs = [ rust-stable ] ++ buildInputs;
117 nativeBuildInputs = nativeBuildInputs;
118 } ''
119 cargo clippy --deny
120 '';
121
122 fmt = pkgs'.runCommand "cargo-fmt" {
123 buildInputs = [ rust-stable ];
124 } ''
125 cargo fmt --all --check
126 '';
127 };
128 }
129 );
130 in
131 {
132 packages = forAllSystems (pkgs: forEachSystem.${pkgs.system}.packages);
133 devShells = forAllSystems (pkgs: forEachSystem.${pkgs.system}.devShells);
134 checks = forAllSystems (pkgs: forEachSystem.${pkgs.system}.checks);
135 };
136}