flake.nix (6022B)
1 { 2 description = "radrootsd"; 3 4 inputs = { 5 nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; 6 rust-overlay = { 7 url = "github:oxalica/rust-overlay"; 8 inputs.nixpkgs.follows = "nixpkgs"; 9 }; 10 }; 11 12 outputs = 13 { nixpkgs, rust-overlay, ... }: 14 let 15 systems = [ 16 "aarch64-darwin" 17 "aarch64-linux" 18 "x86_64-darwin" 19 "x86_64-linux" 20 ]; 21 forAllSystems = 22 f: 23 nixpkgs.lib.genAttrs systems ( 24 system: 25 let 26 pkgs = import nixpkgs { 27 inherit system; 28 overlays = [ rust-overlay.overlays.default ]; 29 }; 30 rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; 31 basePackages = 32 [ 33 pkgs.git 34 rustToolchain 35 pkgs.clang 36 pkgs.llvmPackages.libclang 37 pkgs.libsodium 38 pkgs.openssl 39 pkgs.pkg-config 40 pkgs.sqlite 41 ] 42 ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ 43 pkgs.darwin.libiconv 44 ]; 45 libraryPath = pkgs.lib.makeLibraryPath basePackages; 46 includePath = pkgs.lib.makeSearchPathOutput "dev" "include" basePackages; 47 llvmToolsBin = "${pkgs.llvmPackages.llvm}/bin"; 48 darwinLdFlags = pkgs.lib.optionalString pkgs.stdenv.isDarwin "-L${pkgs.darwin.libiconv}/lib"; 49 darwinRustFlags = pkgs.lib.optionalString pkgs.stdenv.isDarwin "-L native=${pkgs.darwin.libiconv}/lib"; 50 coveragePackages = basePackages ++ [ 51 pkgs.llvmPackages.llvm 52 ]; 53 mkApp = 54 name: 55 { 56 runtimeInputs ? basePackages, 57 text, 58 }: 59 let 60 script = pkgs.writeShellApplication { 61 inherit name; 62 inherit runtimeInputs; 63 text = '' 64 set -euo pipefail 65 repo_root="$(git rev-parse --show-toplevel)" 66 cd "$repo_root" 67 export LIBCLANG_PATH="${pkgs.llvmPackages.libclang.lib}/lib" 68 export LIBRARY_PATH="${libraryPath}:''${LIBRARY_PATH:-}" 69 export DYLD_FALLBACK_LIBRARY_PATH="${libraryPath}:''${DYLD_FALLBACK_LIBRARY_PATH:-}" 70 export LDFLAGS="${darwinLdFlags} ''${LDFLAGS:-}" 71 export NIX_LDFLAGS="${darwinLdFlags} ''${NIX_LDFLAGS:-}" 72 export RUSTFLAGS="${darwinRustFlags} ''${RUSTFLAGS:-}" 73 export CPATH="${includePath}:''${CPATH:-}" 74 ${text} 75 ''; 76 }; 77 in 78 { 79 type = "app"; 80 program = "${script}/bin/${name}"; 81 }; 82 in 83 f { 84 inherit 85 basePackages 86 coveragePackages 87 darwinLdFlags 88 darwinRustFlags 89 includePath 90 libraryPath 91 llvmToolsBin 92 mkApp 93 pkgs 94 rustToolchain 95 ; 96 } 97 ); 98 in 99 { 100 apps = forAllSystems ( 101 { 102 coveragePackages, 103 llvmToolsBin, 104 mkApp, 105 ... 106 }: 107 rec { 108 default = check; 109 check = mkApp "check" { 110 text = '' 111 cargo metadata --format-version 1 --no-deps 112 cargo check 113 ''; 114 }; 115 coverage-report = mkApp "coverage-report" { 116 runtimeInputs = coveragePackages; 117 text = '' 118 export PATH="$HOME/.cargo/bin:$PATH" 119 cargo +nightly llvm-cov --version >/dev/null 2>&1 || { 120 echo "cargo +nightly llvm-cov must be available to run coverage-report" >&2 121 exit 1 122 } 123 export LLVM_COV="${llvmToolsBin}/llvm-cov" 124 export LLVM_PROFDATA="${llvmToolsBin}/llvm-profdata" 125 coverage_target_dir="$(mktemp -d "''${TMPDIR:-/tmp}/radrootsd-llvm-cov.XXXXXX")" 126 trap 'rm -rf "$coverage_target_dir"' EXIT 127 export CARGO_TARGET_DIR="$coverage_target_dir" 128 mkdir -p target/coverage 129 cargo +nightly llvm-cov clean --workspace 130 cargo +nightly llvm-cov --workspace --all-features --branch --no-report 131 cargo +nightly llvm-cov report --json --summary-only --output-path target/coverage/summary.json 132 cargo +nightly llvm-cov report --lcov --output-path target/coverage/lcov.info 133 cargo +nightly llvm-cov report --summary-only 134 echo "coverage summary: target/coverage/summary.json" 135 echo "coverage lcov: target/coverage/lcov.info" 136 ''; 137 }; 138 fmt = mkApp "fmt" { 139 text = '' 140 cargo fmt --all --check 141 ''; 142 }; 143 test = mkApp "test" { 144 text = '' 145 cargo test 146 ''; 147 }; 148 } 149 ); 150 151 devShells = forAllSystems ( 152 { 153 basePackages, 154 darwinLdFlags, 155 darwinRustFlags, 156 includePath, 157 libraryPath, 158 pkgs, 159 ... 160 }: 161 { 162 default = pkgs.mkShell { 163 packages = basePackages; 164 shellHook = '' 165 export LIBCLANG_PATH="${pkgs.llvmPackages.libclang.lib}/lib" 166 export LIBRARY_PATH="${libraryPath}:''${LIBRARY_PATH:-}" 167 export DYLD_FALLBACK_LIBRARY_PATH="${libraryPath}:''${DYLD_FALLBACK_LIBRARY_PATH:-}" 168 export LDFLAGS="${darwinLdFlags} ''${LDFLAGS:-}" 169 export NIX_LDFLAGS="${darwinLdFlags} ''${NIX_LDFLAGS:-}" 170 export RUSTFLAGS="${darwinRustFlags} ''${RUSTFLAGS:-}" 171 export CPATH="${includePath}:''${CPATH:-}" 172 ''; 173 }; 174 } 175 ); 176 }; 177 }