{ description = "Using Markdown Files to organize your life as a @Tag-Stream"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; crane.url = "github:ipetkov/crane"; git-hooks = { url = "github:cachix/git-hooks.nix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, rust-overlay, crane, git-hooks, ... }: let inherit (nixpkgs) lib; forAllSystems = lib.genAttrs lib.systems.flakeExposed; # Read version from Cargo.toml as single source of truth version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version; mkPkgs = system: import nixpkgs { inherit system; overlays = [ rust-overlay.overlays.default ]; }; mkCraneLib = system: let pkgs = mkPkgs system; toolchain = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-src" "rust-analyzer" ]; }; in (crane.mkLib pkgs).overrideToolchain toolchain; mkStreamd = system: let craneLib = mkCraneLib system; commonArgs = { src = craneLib.path ./.; pname = "streamd"; inherit version; strictDeps = true; }; cargoArtifacts = craneLib.buildDepsOnly commonArgs; in craneLib.buildPackage ( commonArgs // { inherit cargoArtifacts; passthru = { inherit cargoArtifacts; tests = { clippy = craneLib.cargoClippy ( commonArgs // { inherit cargoArtifacts; cargoClippyExtraArgs = "--all-targets -- -D warnings"; } ); fmt = craneLib.cargoFmt { src = commonArgs.src; }; test = craneLib.cargoTest (commonArgs // { inherit cargoArtifacts; }); }; }; } ); mkGitHooksCheck = system: let pkgs = mkPkgs system; toolchain = pkgs.rust-bin.stable.latest.default; in git-hooks.lib.${system}.run { src = ./.; hooks = { rustfmt = { enable = true; package = toolchain; }; commitizen.enable = true; }; }; mkMuslCraneLib = system: let pkgs = mkPkgs system; toolchain = pkgs.rust-bin.stable.latest.default.override { targets = [ "x86_64-unknown-linux-musl" ]; }; in (crane.mkLib pkgs).overrideToolchain toolchain; mkStreamdMusl = system: let craneLib = mkMuslCraneLib system; commonArgs = { src = craneLib.path ./.; pname = "streamd"; inherit version; strictDeps = true; CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl"; CARGO_BUILD_RUSTFLAGS = "-C target-feature=+crt-static"; }; cargoArtifacts = craneLib.buildDepsOnly commonArgs; in craneLib.buildPackage (commonArgs // { inherit cargoArtifacts; }); mkWindowsCraneLib = system: let pkgs = mkPkgs system; toolchain = pkgs.rust-bin.stable.latest.default.override { targets = [ "x86_64-pc-windows-gnu" ]; }; in (crane.mkLib pkgs).overrideToolchain toolchain; mkStreamdWindows = system: let pkgs = mkPkgs system; pkgsCross = pkgs.pkgsCross.mingwW64; craneLib = mkWindowsCraneLib system; commonArgs = { src = craneLib.path ./.; pname = "streamd"; inherit version; strictDeps = true; CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu"; CC_x86_64_pc_windows_gnu = "${pkgsCross.stdenv.cc}/bin/x86_64-w64-mingw32-gcc"; CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER = "${pkgsCross.stdenv.cc}/bin/x86_64-w64-mingw32-gcc"; nativeBuildInputs = [ pkgsCross.stdenv.cc ]; buildInputs = [ pkgsCross.windows.pthreads ]; doCheck = false; }; cargoArtifacts = craneLib.buildDepsOnly commonArgs; in craneLib.buildPackage (commonArgs // { inherit cargoArtifacts; }); mkStreamdDeb = system: let pkgs = mkPkgs system; streamd-musl = mkStreamdMusl system; in pkgs.runCommand "streamd_${version}_amd64.deb" { nativeBuildInputs = [ pkgs.nfpm ]; } '' # Generate shell completions mkdir -p completions ${streamd-musl}/bin/streamd completions bash > completions/streamd.bash ${streamd-musl}/bin/streamd completions zsh > completions/_streamd ${streamd-musl}/bin/streamd completions fish > completions/streamd.fish cat > nfpm.yaml <