at main 4.0 kB view raw
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}